当前位置:   article > 正文

ArrayList(顺序结构)_arraylist顺序

arraylist顺序
使用数组的局限性
如果要存放多个对象,可以使用数组,但是数组有局限性
比如 声明长度是10的数组
不用的数组就浪费了
超过10的个数,又放不下

ArrayList存放对象
为了解决数组的局限性,引入容器类的概念。 最常见的容器类就是 
ArrayList 
容器的容量"capacity"会随着对象的增加,自动增长 
只需要不断往容器里增加英雄即可,不用担心会出现数组的边界问题。
  1. package collection;
  2. import java.util.ArrayList;
  3. import charactor.Hero;
  4. public class TestCollection {
  5. @SuppressWarnings("rawtypes")
  6. public static void main(String[] args) {
  7. //容器类ArrayList,用于存放对象
  8. ArrayList heros = new ArrayList();
  9. heros.add( new Hero("盖伦"));
  10. System.out.println(heros.size());
  11. //容器的容量"capacity"会随着对象的增加,自动增长
  12. //只需要不断往容器里增加英雄即可,不用担心会出现数组的边界问题。
  13. heros.add( new Hero("提莫"));
  14. System.out.println(heros.size());
  15. }
  16. }
  • 常用方法

  • 增加
    add 有两种用法
    第一种是直接add对象,把对象加在最后面
    heros.add(new Hero("hero " + i));
    第二种是在指定位置加对象
    heros.add(3, specialHero);

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 把5个对象加入到ArrayList中
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. System.out.println(heros);
    12. // 在指定位置增加对象
    13. Hero specialHero = new Hero("special hero");
    14. heros.add(3, specialHero);
    15. System.out.println(heros.toString());
    16. }
    17. }
  • 判断是否存在
    通过方法contains 判断一个对象是否在容器中
    判断标准: 是否是同一个对象,而不是name是否相同
    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. System.out.println(heros);
    14. // 判断一个对象是否在容器中
    15. // 判断标准: 是否是同一个对象,而不是name是否相同
    16. System.out.print("虽然一个新的对象名字也叫 hero 1,但是contains的返回是:");
    17. System.out.println(heros.contains(new Hero("hero 1")));
    18. System.out.print("而对specialHero的判断,contains的返回是:");
    19. System.out.println(heros.contains(specialHero));
    20. }
    21. }
  • 获取指定位置的对象
    通过get获取指定位置的对象,如果输入的下标越界,一样会报错

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. //获取指定位置的对象
    14. System.out.println(heros.get(5));
    15. //如果超出了范围,依然会报错
    16. System.out.println(heros.get(6));
    17. }
    18. }
  • 获取对象所处的位置
    indexOf用于判断一个对象在ArrayList中所处的位置
    与contains一样,判断标准是对象是否相同,而非对象的name值是否相等

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. System.out.println(heros);
    14. System.out.println("specialHero所处的位置:"+heros.indexOf(specialHero));
    15. System.out.println("新的英雄,但是名字是\"hero 1\"所处的位置:"+heros.indexOf(new Hero("hero 1")));
    16. }
    17. }
  • 删除
    remove用于把对象从ArrayList中删除
    remove可以根据下标删除ArrayList的元素
    heros.remove(2);
    也可以根据对象删除
    heros.remove(specialHero);

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. System.out.println(heros);
    14. heros.remove(2);
    15. System.out.println("删除下标是2的对象");
    16. System.out.println(heros);
    17. System.out.println("删除special hero");
    18. heros.remove(specialHero);
    19. System.out.println(heros);
    20. }
    21. }
  • 替换
    set用于替换指定位置的元素

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. System.out.println(heros);
    14. System.out.println("把下标是5的元素,替换为\"hero 5\"");
    15. heros.set(5, new Hero("hero 5"));
    16. System.out.println(heros);
    17. }
    18. }
  • 获取大小
    size 用于获取ArrayList的大小

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. System.out.println(heros);
    14. System.out.println("获取ArrayList的大小:");
    15. System.out.println(heros.size());
    16. }
    17. }
  • 转换为数组
    toArray可以把一个ArrayList对象转换为数组。
    需要注意的是,如果要转换为一个Hero数组,那么需要传递一个Hero数组类型的对象给toArray(),这样toArray方法才知道,你希望转换为哪种类型的数组,否则只能转换为Object数组
    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. Hero specialHero = new Hero("special hero");
    12. heros.add(specialHero);
    13. System.out.println(heros);
    14. Hero hs[] = (Hero[])heros.toArray(new Hero[]{});
    15. System.out.println("数组:" +hs);
    16. }
    17. }
  • 把另一个容器所有对象都加进来
    addAll 把另一个容器所有对象都加进来

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. System.out.println("ArrayList heros:\t" + heros);
    12. //把另一个容器里所有的元素,都加入到该容器里来
    13. ArrayList anotherHeros = new ArrayList();
    14. anotherHeros.add(new Hero("hero a"));
    15. anotherHeros.add(new Hero("hero b"));
    16. anotherHeros.add(new Hero("hero c"));
    17. System.out.println("anotherHeros heros:\t" + anotherHeros);
    18. heros.addAll(anotherHeros);
    19. System.out.println("把另一个ArrayList的元素都加入到当前ArrayList:");
    20. System.out.println("ArrayList heros:\t" + heros);
    21. }
    22. }
  • 清空
    clear 清空一个ArrayList

    1. package collection;
    2. import java.util.ArrayList;
    3. import charactor.Hero;
    4. public class TestCollection {
    5. public static void main(String[] args) {
    6. ArrayList heros = new ArrayList();
    7. // 初始化5个对象
    8. for (int i = 0; i < 5; i++) {
    9. heros.add(new Hero("hero " + i));
    10. }
    11. System.out.println("ArrayList heros:\t" + heros);
    12. System.out.println("使用clear清空");
    13. heros.clear();
    14. System.out.println("ArrayList heros:\t" + heros);
    15. }
    16. }
  • ArrayList和List
    ArrayList实现了接口List
    常见的写法会把引用声明为接口List类型
    注意:是java.util.List,而不是java.awt.List

    1. package collection;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import charactor.Hero;
    5. public class TestCollection {
    6. public static void main(String[] args) {
    7. //ArrayList实现了接口List
    8. //常见的写法会把引用声明为接口List类型
    9. //注意:是java.util.List,而不是java.awt.List
    10. //接口引用指向子类对象(多态)
    11. List heros = new ArrayList();
    12. heros.add( new Hero("盖伦"));
    13. System.out.println(heros.size());
    14. }
    15. }
  • List接口的方法
    因为ArrayList实现了List接口,所以List接口的方法ArrayList都实现了。

  • 泛型 Generic
    不指定泛型的容器,可以存放任何类型的元素
    指定了泛型的容器,只能存放指定类型的元素以及其子类
    1. package collection;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import property.Item;
    5. import charactor.APHero;
    6. import charactor.Hero;
    7. public class TestCollection {
    8. public static void main(String[] args) {
    9. //对于不使用泛型的容器,可以往里面放英雄,也可以往里面放物品
    10. List heros = new ArrayList();
    11. heros.add(new Hero("盖伦"));
    12. //本来用于存放英雄的容器,现在也可以存放物品了
    13. heros.add(new Item("冰杖"));
    14. //对象转型会出现问题
    15. Hero h1= (Hero) heros.get(0);
    16. //尤其是在容器里放的对象太多的时候,就记不清楚哪个位置放的是哪种类型的对象了
    17. Hero h2= (Hero) heros.get(1);
    18. //引入泛型Generic
    19. //声明容器的时候,就指定了这种容器,只能放Hero,放其他的就会出错
    20. List<Hero> genericheros = new ArrayList<Hero>();
    21. genericheros.add(new Hero("盖伦"));
    22. //如果不是Hero类型,根本就放不进去
    23. //genericheros.add(new Item("冰杖"));
    24. //除此之外,还能存放Hero的子类
    25. genericheros.add(new APHero());
    26. //并且在取出数据的时候,不需要再进行转型了,因为里面肯定是放的Hero或者其子类
    27. Hero h = genericheros.get(0);
    28. }
    29. }
  • 泛型的简写
    为了不使编译器出现警告,需要前后都使用泛型,像这样:
    List<Hero> genericheros = new ArrayList<Hero>();

    不过JDK7提供了一个可以略微减少代码量的泛型简写方式
    List<Hero> genericheros2 = new ArrayList<>();
    后面的泛型可以用<>来代替,聊胜于无吧
    1. package collection;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import charactor.Hero;
    5. public class TestCollection {
    6. public static void main(String[] args) {
    7. List<Hero> genericheros = new ArrayList<Hero>();
    8. List<Hero> genericheros2 = new ArrayList<>();
    9. }
    10. }
  • 遍历ARRAYLIST的三种方法


  • 用for循环遍历
    通过前面的学习,知道了可以用size()和get()分别得到大小,和获取指定位置的元素,结合for循环就可以遍历出ArrayList的内容

    1. package collection;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. import charactor.Hero;
    6. public class TestCollection {
    7. public static void main(String[] args) {
    8. List<Hero> heros = new ArrayList<Hero>();
    9. // 放5个Hero进入容器
    10. for (int i = 0; i < 5; i++) {
    11. heros.add(new Hero("hero name " + i));
    12. }
    13. // 第一种遍历 for循环
    14. System.out.println("--------for 循环-------");
    15. for (int i = 0; i < heros.size(); i++) {
    16. Hero h = heros.get(i);
    17. System.out.println(h);
    18. }
    19. }
    20. }
  • 迭代器遍历
    使用迭代器Iterator遍历集合中的元素

    1. package collection;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. import charactor.Hero;
    6. public class TestCollection {
    7. public static void main(String[] args) {
    8. List<Hero> heros = new ArrayList<Hero>();
    9. //放5个Hero进入容器
    10. for (int i = 0; i < 5; i++) {
    11. heros.add(new Hero("hero name " +i));
    12. }
    13. //第二种遍历,使用迭代器
    14. System.out.println("--------使用while的iterator-------");
    15. Iterator<Hero> it= heros.iterator();
    16. //从最开始的位置判断"下一个"位置是否有数据
    17. //如果有就通过next取出来,并且把指针向下移动
    18. //直达"下一个"位置没有数据
    19. while(it.hasNext()){
    20. Hero h = it.next();
    21. System.out.println(h);
    22. }
    23. //迭代器的for写法
    24. System.out.println("--------使用for的iterator-------");
    25. for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) {
    26. Hero hero = (Hero) iterator.next();
    27. System.out.println(hero);
    28. }
    29. }
    30. }
  • 用增强型for循环
    使用增强型for循环可以非常方便的遍历ArrayList中的元素,这是很多开发人员的首选。


    不过增强型for循环也有不足:
    无法用来进行ArrayList的初始化
    无法得知当前是第几个元素了,当需要只打印单数元素的时候,就做不到了。 必须再自定下标变量。
    1. package collection;
    2. import java.util.ArrayList;
    3. import java.util.Iterator;
    4. import java.util.List;
    5. import charactor.Hero;
    6. public class TestCollection {
    7. public static void main(String[] args) {
    8. List<Hero> heros = new ArrayList<Hero>();
    9. // 放5个Hero进入容器
    10. for (int i = 0; i < 5; i++) {
    11. heros.add(new Hero("hero name " + i));
    12. }
    13. // 第三种,增强型for循环
    14. System.out.println("--------增强型for循环-------");
    15. for (Hero h : heros) {
    16. System.out.println(h);
    17. }
    18. }
    19. }












声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/715558
推荐阅读
相关标签
  

闽ICP备14008679号