数组与集合的比较
数组:长度固定,可以存储基本数据类型,也能存储对象
集合:长度可变,只能存储对象类型
由于有包装类的存在,集合可以存储任何类型
集合的体系结构
- List体系:一维表的相关封装结构
- Set:集合的相关结构
- 还有Map<key, value>的相关结构图中没有展示
Collection接口常用方法
collection集合是所有集合类的老祖宗,我们将要学习它的公共属性,这些公共属性将被所有其实现类所实现,并且子类保持自己结构特性
我们以ArrayList() 作为元素类型做示例,ArrayList()实现了Collection 接口,所以它具备Collection 接口的所有方法的实现
- add:添加元素
/*创建一个collection集合对象*/
Collection coll = new ArrayList() ;
((ArrayList) coll).add("劳斯莱斯");
((ArrayList) coll).add("迈巴赫");
/*创建一个collection集合对象*/
Collection coll2 = new ArrayList() ;
((ArrayList) coll2).add("宝马");
((ArrayList) coll2).add("奔驰");
- addAll:集合中加入集合,以元素的形式并入被加集合
((ArrayList) coll2).addAll(coll) ;
System.out.println(coll2);
结果:[宝马, 奔驰, 劳斯莱斯, 迈巴赫]
- remove:删除指定元素
coll.remove("劳斯莱斯") ;
System.out.println(coll);
结果:[迈巴赫]
- removeAll:删除集合中的集合
coll2.removeAll(coll) ;
System.out.println(coll2);
结果:[宝马, 奔驰, 劳斯莱斯]
- contains
是否包含某元素,返回boolean类型数据
boolean iscontain = coll2.contains("宝马");
System.out.println(iscontain);
结果:true
- containsAll
是否包含某集合,返回boolean类型数据
iscontain = coll2.containsAll(coll) ;
System.out.println(iscontain);
结果:false
- isEmpty
集合是否为空,返回boolean类型数据
boolean isEmpty = coll.isEmpty() ;
System.out.println(isEmpty);
结果:false
- toArray集合转化为数组
Object[] obj = coll2.toArray();
System.out.println(obj);
for(int i=0 ; i < obj.length ; i++){
System.out.println(obj[i]);
}
结果:[Ljava.lang.Object;@a77106
宝马
奔驰
劳斯莱斯
迭代器
迭代器是每个集合实现了迭代器接口,对遍历自己集合提供了一个方法
迭代器对象遍历是一次性的,如需多次遍历需创建多个迭代器对象
Iterator iterator = coll2.iterator();
while (iterator.hasNext()){
Object obj1 = iterator.next();
System.out.println(obj1);
}
结果:
宝马
奔驰
劳斯莱斯
迭代器本质是个指针,一次性使用(一去不复返),迭代过程不允许对集合进行增删改查,否则抛异常
但其提供的add方法可以在遍历过程中进行其他操作
List
独有方法:
- add(int index,Object element)
在指定位置插入元素,元素下标机制与数组一致
list.add(0,"晁盖");
System.out.println(list);
结果:[晁盖, 吴用, 刘唐, 宋江]
- get(int index)
获得指定元素
注意:不要越界
Object obj = list.get(1) ;
System.out.println(obj);
结果:吴用
-
size() - 获取几个内元素个数
-
indexof/lastIndexOf
返回指定元素的正向遍历第一个位置/返回指定元素的反向遍历第一个位置
System.out.println(list.indexOf("白胜1"));
System.out.println(list.lastIndexOf("白胜1"));
结果:7 7
- remove
删除指定元素,返回元素位置
或
删除指定位置元素,返回Boolean
System.out.println(list.remove(2)); //返回被删除元素,往后元素向前移动
System.out.println(list.remove("晁盖")); //返回boolean,往后元素向前移动
结果:白胜
true
- clear
清空集合元素
list.clear();
ArrayList
实现了List的一个类,底层数组
改进:
-
数组长度动态可变
-
允许存入null类型元素
-
相比list,支持多并发(不是线程安全)
其方法与其接口list提供的方法基本一致
List list = new ArrayList() ;
list.add(null);
list.add(null);
list.add(null);
list.set(2,"吴用") ; // 修改指定索引出的值
System.out.println(list);
LinkedList
LinkedList底层是数据结构中的链表实现的
特点:
-
允许用作堆栈、队列(包括双端队列)
-
允许包括null在内的所有元素
-
非线程安全
当链表用:
这是链表的基本操作了吧
list.removeFirst();
list.removeLast();
结果:
[王五]
当栈用:
如果使用到栈,Java也提供了专门的数据结构类
Stack stack = new Stack() ;
System.out.println(list.pop());
list.push("赵六");
System.out.println(list);
结果:
王五
[赵六]
ArrayList 和 LinkedList 的区别
- 随机高效访问: ArrayList由于基于数组下标,支持随机访问;LinkedList基于链表,不支持随机高效访问
- 插入、删除:在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间、开头、结尾插入或删除一个元素的开销是固定的
- 修改:ArrayList支持随机高效访问,可以快速修改目标位置的值,而LinkedList基于链表需要遍历定位。
Vector
Vector集合与AaaryList集合功能上是类似的,区别在于vector是线程安全的,导致的结果就是效率较低