集合
存储数据的容器 !
数组:
Object[] objs = new Object[10];
上述是一个Object数组, 在Java中万物皆对象 , 也就是表示上述数组可以存储任何的数据 !
数组的长度一经确定, 无法被改变 !
Collection
集合两大体系中的一个 . Collection 是单值存储集合的最大父接口 !
面试题 : Collection 与 Collections 的区别? ***
Collection 是集合中, 单值存储的最大父接口 ! 是java中单值存储数据的集合的 顶级抽象接口 !!
Collections 是操作集合的工具 , 与Collection 没有关系, 也没有对比性 !
Collection的子接口 List
ArrayList *****
特性:
来自JDK 1.2 版本
默认的初始容量 10 ;
扩容算法: 原长度 加上 原长度右移一位 (约等于1.5倍)
允许存储null值
允许存储重复的值
因为内部实现是数组, 所以数据的 存储是有序的 , 便于遍历与查找 !
线程非安全的
ArrayList常用方法
基本操作:
- boolean add(E e) : 向集合中添加一个元素 , 返回值永远为true *****
- boolean add(int index ,E e) : 向指定的索引位置,插入一个元素, 原数据自动后移!
- boolean set(int index ,E e) : 替换指定索引位置的元素内容 !
- E get(int index) : 获取指定索引处的元素内容! *****
- E remove(int index) : 获取并移除指定索引处的元素 *
- E remove(E e) : 删除指定的元素
- int size() : 获取当前集合有效数据的个数 ! *
- clear() : 清空集合 掌握
- boolean isEmpty() 如果列表不包含元素,则返回 true。 了解
对一组数据的操作(了解)
- boolean addAll(Collection 集合) : 将参数集合中的所有数据, 追加到当前的集合中 !
- boolean addAll(int index,Collection 集合) : 将参数集合中的所有数据, 追加到当前集合的指定位置 !
- boolean removeAll(Collection 集合) : 从当前集合中, 移除与参数集合匹配的所有元素 !
- boolean retainAll(Collection 集合) : 从当前集合中, 保留与参数集合匹配的所有元素 !
判断集合中是否包含某元素 (掌握)
- boolean contains(Object o);
判断集合中是否包含某多个元素 (了解)
- boolean containsAll(Collection collection);
将List集合转换为数组 , 然后进行操作 (了解)
- Object[] toArray();
- E[] toArray(E[] t);
查找集合中元素的位置:
- int indexOf(E e) (熟悉)
顺序查找指定元素e 在集合中的位置, 查找成功返回索引值 , 查找失败返回-1
- int lastIndexOf(E e) (了解)
倒序查找指定元素e 在集合中的位置, 查找成功返回索引值 , 查找失败返回-1
从集合中截取 子集合 (了解)
- List subList(int 起始下标,int 结束下标);
从集合中截取子集合, 包含起始下标元素, 不包含结束下标元素 !
注意: 此截取操作, 截取后的新集合 与 旧集合共用一块内存 ! 在操作子集合时, 会影响原有的集合!
特殊操作: 清除集合100下标到200下标的数据
data.subList(100,200).clear();
案例:
ArrayList<String> data1 = new ArrayList<String>();
data1.add("哈哈哈");
data1.add("嘿嘿嘿");
data1.add("呵呵呵");
data1.add("嘻嘻嘻");
data1.add("嘿嘿嘿");
data1.add("老和尚");
List<String> data2 = data1.subList(1,3);
data2.clear();
System.out.println(data1);
面试题: ***
观察如下代码, 描述执行结果:
ArrayList data = new ArrayList();//未指定泛型, 类型为Object
data.add(1);
data.add(2);
data.add(3);
data.remove(1);
System.out.println(data);
请描述执行结果: "[1,3]"
解释:
集合的泛型未指定, 存储的数据类型为Object 也就是对象!
存储int类型数据时, 其实存储的是Integer , 进行了自动装箱而已 .
删除时, 传入的是int , 则是根据下标进行删除 !
如果删除时,传入的是Integer , 则删除的就是数据了!
Vector
1.0版本的集合类, 在1.2版本时, 融入到了新的集合体系中,
与ArrayList操作基本一致, 但是是线程安全的!
扩容算法: 用户指定每次扩容的增量, 如果增量为0 则每次扩容为两倍
LinkedList
内部使用链表结构实现,
线程非安全的, 效率较高
方便删除和数据的插入!
学习这几种list集合, 后期在使用时, 应根据需求选择集合使用:
ArrayList 和 vector 和 LinkedList 的操作基本一致 !
ArrayList 更适合 遍历与 查找
vector 更适合 要求线程安全时
LinkedList 更适合进行大量删除与插入的需求
队列 Queue 了解
Queue接口中 使用最多的类是LinkedList
队列是先进先出的!
- boolean offer(E e) : 将一个元素, 添加到队列的尾部, 添加成功返回true
- E poll() : 从队列的首部取出一个数据, 并从队列中移除此数据!
- E peek() : 从队列首部取出一个数据 .
双端队列 Deque 了解
Deque接口中 使用最多的类是LinkedList
- boolean offerLast(E e) : 将一个元素, 添加到队列的尾部, 添加成功返回true
- boolean offerFirst(E e) : 将一个元素, 添加到队列的首部, 添加成功返回true
- E pollLast() : 从队列的尾部取出一个数据, 并从队列中移除此数据!
- E pollFirst() : 从队列的首部取出一个数据, 并从队列中移除此数据!
- E peekLast() : 从队列尾部取出一个数据 .
- E peekFirst() : 从队列首部取出一个数据 .