Collection接口
Collection
Collection的方法list和set都可以用
子类都是单列的
Collection接口实现类的特点
- collection实现子类可以存放多个元素,每个元素可以是Object
- 有些Collection的实现类,有些是有序的list,有些不是有序的Set
- Collection接口没用直接的实现子类,是通过他的子接口Set和List来实现的
常用方法:
//remove
//contains
System.out.println(list.contains("tom"));
//size
System.out.println(list.size());
//isEmpty:判空
System.out.println(list.isEmpty());
//clear:清空
//list.clear();
//addAll:
ArrayList list2 = new ArrayList();
list2.add("红楼梦");
list2.add("西游记");
list2.add("水浒传");
list.addAll(list2);
System.out.println(list); //[tom, jack, 10, true, 红楼梦, 西游记, 水浒传]
//containsAll:查找多个元素是否都存在
//removeAll:
System.out.println(list.removeAll(list2));
iterator迭代器
iterator():仅用于遍历集合不能存储
迭代器对象
所有实现了Collection的都可以使用iterator遍历
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();//返回一个迭代器对象 可以遍历元素
快捷键:itit
显示快捷键的快捷键:ctrl+j
Collection col=new ArrayList();
col.add(new Book("西游记","罗贯中",10.1));
col.add(new Book("小李飞刀","罗贯中",10.1));
col.add(new Book("红楼梦","罗贯中",10.2));
col.add("jack");
Iterator iterator = col.iterator();
/* while (iterator.hasNext()){ //判断是否还有数据
Object obj = iterator.next(); //返回下一个元素
System.out.println("obj:"+obj);
}*/
while (iterator.hasNext()) { //itit
Object next = iterator.next();
}
}
当退出while循环后,这时iterator迭代器指向最后的元素
iterator.next()
如果再去取会出事!!
如果还想遍历要重置迭代器
iterator=col.iterator();//重置迭代器
增强for循环
可以代替iterator()迭代器,底层依然是迭代器
快捷键:iter
增强for也可以在数组中使用
Map:
子类都是双列的
ctrl+alt+b
巩固:
//创建三个dog对象(name,age)放入arraylist中用两种方法遍历重写Dog的toString方法
List接口方法
子接口了
List接口是有序的,添加顺序和取出顺序一直,且可以重复
List可以有重复数据!
List集合中的每个元素都有其对应的顺序索引,即支持索引
System.out.println(list.get(0));
//indexOf:获取指定index位置的元素:没找到则返回-1,找到了返回对应的下标,注意,只返回第一个找到的
System.out.println(list.indexOf("tom"));
//lastIndexOf(从后往前找)
System.out.println(list.lastIndexOf("张舞丰"));
//remove(int index)//删除对应的下标的值
list.remove(list.lastIndexOf("张舞丰"));
System.out.println(list);
//set(int index,Object ele):设置只当index位置的元素为ele,相当于是替换
list.set(1,"毛毛"); //如果index超出范围则报异常,在最后存在也不行
System.out.println(list);
//subList(int fromIndex,int toIndex)返回从fromIndex到toIndex位置的自己和
List list1 = list.subList(0, 2);
System.out.println(list1); // 左闭右开
ArrayList
- ArrayList可以加入null
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码,在多线程情况下,不建议使用ArrayList
ArrayList底层结构和源码分析
-
ArrayLIst中维护了一个Object类型的数组elementData transient Object[] elementData;//transient表示瞬间 表示该属性不会被序列化
-
当创建ArrayList对象时,如果使用的是无参构造器,则初始化elementData容量为0,第一次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍
-
如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
第一次扩容为10
真实扩容
扩容1.5倍
8421 ==> 421 === 7
1111 ==> 111 右位移1位
elementData = Arrays.copyOf(elementData, newCapacity);//扩容是哦也能够的是Arrays.copyof()
保留之前的数据
真的扩容
显示全部的debug内容
LinkedList底层结构
LinkedList底层维护了一个双向链表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律