一.集合的特点:
1、长度是随意的 动态变化
2、集合可以存放任意引用类型的数据
二.集合的框架结构:(重点)
※集合与数组的对比:
相同点:
- 都是数据的容器,在一个数组或集合中可以声明(存储)多个数据
不同点:
- 元素:
数组中的元素只能是相同(相兼容类型)
集合中的元素是任意的(泛型)
数组中可以存储基本类型和引用类型,集合只能存储引用类型 - 长度(元素个数)
数组是定长的,一旦初始化长度就不可以修改
集合长度可以修改,可以删除元素和添加元素
三.collection中的常用方法
add(参数)
追加元素
add(参数1,参数2)
插入元素
addAll(Collection<? >extends E c)
将指定 collection 中的所有元素都添加到此 collection 中
clear()
清空此 collection 中的所有元素
contains(Object o)
如果此 collection 包含指定的元素,则返回true
containsAll(Collection<?> c)
如果此 collection 包含指定 collection 中的所有元素,则返回 true
equals(Object o)
比较此 collection 与指定对象是否相等
isEmpty()
如果此 collection 不包含元素,则返回true
iterator()
返回在此 collection 的元素上进行迭代的迭代器
remove(Object o)
从此 collection 中移除指定元素的单个实例,如果存在的话
removeAll(Collection<?> c)
移除此 collection 中那些也包含在指定 collection 中的所有元素
retainAll(Collection<?> c)
仅保留此 collection 中那些也包含在指定 collection 的元素
size()
返回此 collection 中的元素数
toArray()
返回包含此 collection 中所有元素的数组
get()
索引
[说明]:
1.可以利用迭代器遍历集合
2.当删除元素或插入元素后,删除或插入的元素之后的元素的索引会重新调整.不能通过索引跟踪元素
四.List接口
add(int index, E element)
在列表的指定位置插入指定元素
addAll(int index, Collection<?> extends E c)
将指定 collection 中的所有元素都插入到列表中的指定位置
containsAll(Collection<?> c)
如果列表包含指定 collection 的所有元素,则返回true
get(int index)
返回列表中指定位置的元素
indexOf(Object o)
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
lastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1
listIterator()
返回此列表元素的列表迭代器
remove(int index)
移除列表中指定位置的元素
set(int index, E element)
用指定元素替换列表中指定位置的元素
subList(int fromIndex, int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的元素
1.List接口的存储特点:
有序,允许重复,可以通过下标访问集合元素
List接口中可以使用独有的迭代器ListIterator,具有反向遍历的功能
2.ArrayList类(有序,可重复,内存空间连续,允许null元素)
ArrayList类是List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。
例子:
/**
* @author CC
* ArrayList可以存任何类型的数据
*/
public class ArrayListDemo {
public static void main(String[] args) {
//创建ArrayList集合
ArrayList<Object> arr = new ArrayList<Object>();
//集合长度(集合中元素的个数)
System.out.println("集合长度:"+arr.size());
//存放数据
arr.add("胖虎");
System.out.println("集合长度:"+arr.size());
arr.add(1);
System.out.println(arr.toString());
//初始化时指定了长度
ArrayList<Object> arrayList = new ArrayList<Object>(10);
//集合的长度由其中元素的个数决定,和初始化的长度没关系
System.out.println("集合长度:"+arrayList.size());//长度0
arr.remove(1);//删除
System.out.println(arr);
}
}
public class ArrayListDemo2 {
public static void main(String[] args) {
ArrayList<Object> arrayList = new ArrayList<Object>();
arrayList.add(1);
arrayList.add(2);
System.out.println("集合1:"+arrayList);
ArrayList<Object> arrayList2 = new ArrayList<Object>();
arrayList2.add(3);
//把一个集合添加到另一个集合中
arrayList2.addAll(arrayList);
System.out.println("添加后的集合2:"+arrayList2);
//删除一个集合中的另一个集合
arrayList2.remove(arrayList);
System.out.println(arrayList2);
//add(参数1)追加
arrayList2.add(2,"abc");
System.out.println(arrayList2);
System.out.println("----------------");
//集合遍历
for (int i = 0; i < arrayList2.size(); i++) {
System.out.println(arrayList2.get(i));
}
System.out.println("----------------");
//增强for
for (Object object : arrayList2) {
System.out.println(object.toString());
}
System.out.println("----------------");
//迭代器遍历
Iterator<Object> it = arrayList2.iterator();
while(it.hasNext()) {
System.out.println(it.next().toString());
}
}
}
3.LinkedList类(有序,可重复,内存空间不连续,允许null元素)
LinkedList类是List接口的链表实现。实现所有可选的列表操作,并且允许所有元素(包括null)。
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
System.out.println(list);
//头部元素的方法
list.addFirst("dddd");
System.out.println(list);
System.out.println("头部元素:"+list.getFirst());
list.removeFirst();
//尾部
list.addLast("zzzz");
System.out.println(list);
System.out.println("尾部元素:"+list.getLast());
list.removeLast();
System.out.println(list);
}
}
五.ArrayList和LinkedList的区别?
1、ArrayList和LinkedList可想从名字分析,它们一个是**Array(动态数组)的数据结构,一个是Link(链表)**的数据结构,此外,它们两个都是对List接口的实现。
前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
2、当随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
3、当对数据进行增加和删除的操作时(add和remove操作),LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
4、从利用效率来看,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
5、ArrayList主要空间开销在于需要在List列表预留一定空间;而LinkList主要空间开销在于需要存储结点信息以及结点指针信息。
简单来说:
- LinkedList集合适用在对元素插入和删除操作较频繁的时候
- ArrayList集合适用在对元素查询操作较频繁的时候
六.分析
1). List接口下的集合分析:
- 1、存入的数据都会转换为Object (降低效率)
- 2、取出数据时容易发生异常
2)泛型:(泛型集合是对集合中存放数据的类型的约束,非约定的类型,不允许存入集合中)
- 1、约定限制了集合中存放元素的类型
- 2、不做类型转换,效率高,且安全