总结java中的Collection下的集合
Collection
Collection下的继承结构图
Collection下有两个子接口List和Set,不管是List还是Set,他们都可以使用迭代器进行迭代
Collection中常用的方法
- add(Object obj) 向集合尾部添加新元素,返回值类型是boolean
- size() 获取集合中元素的个数,返回值类型是int
- clear() 清空集合,返回值类型是void
- contains(Object obj) 判断集合中是否包含某个元素,底层调用了equals方法,如果集合中放入的是自定义类,必须重写equals方法,返回值类型是boolean
- remove(Object obj) 删除集合中的某个元素,底层调用了equals方法,返回值类型是Boolean
- isEmpty() 判断集合是否为空,返回值类型是boolean
- toArray() 将集合转换成数组,返回值类型是Object[]
- iterator() 获取集合的迭代器,返回值类型是Iterator
List
List接口的特点是有序(有序指的是存入的顺序和取出的顺序一致)可重复,有下标
List接口中特有的方法
List除了从Collection中继承过来的方法之外,还有一些特有的方法
- add(int index,Object obj )向指定位置加入元素,返回值类型是boolean
- get(int index) 获取某一下标的元素,返回值类型是Object
- indexOf(Object obj) 获取某一对象在集合中第一次出现处的索引,返回值类型是int
- lastIndexOf(Object obj) 获取某一对象在集合中最后一次出现处的索引,返回值类型是int
- remove(int index) 删除某一下标对应的元素,返回值类型是Object
- set(int index,Object obj) 修改某一下标的元素,返回值类型是Object
List接口中的常用实现类
ArrayList
- ArrayList是List接口的实现类,它的底层采用了Object[]数组进行存储,数组中的元素在空间存储上是连续的
- ArrayList的默认初始化容量是10(在新版jdk中是创建一个长度为0的数组,当加入第一个元素是,容量为10)
- 每次扩容增加的容量是用原容量右移一位,即新容量是原容量的1.5倍 例如:20->30->45
- 合理的给定一个初始化容量,减少扩容次数可以有效的提升性能
- ArrayList是非线程安全的
- 优点:检索效率高
- 缺点:随机增删效率比较低,涉及到了部分的左移与右移,但在末尾增删,效率不受影响;另外,由于ArrayList底层采用的是数组的数据结构,数组在存储空间上是连续的,所以ArrayList不适合存储大数据的信息,因为我们很难在内存上找到一块很大的连续空间
LinkedList
- .LinkedList是List接口的实现类,底层采用双向链表的数据结构
- 存储在链表中的元素在空间存储上是不连续的
- 优点:随机增删效率较高
- 缺点:检索效率较低,因为检索时,我们需要从头开始依次检索
Vector
- Vector是List接口的实现类,底层采用数组的数据结构进行存储
- Vector的默认初始化容量是10,每次扩容后的新容量是原容量的2倍 例如:10->20->40
- Vector的方法都有symchronized关键字,是线程安全的,导致了效率降低,普遍使用减少(因为我们可以直接用java.util.Collections集合工具类将一个非线程安全的ArrayList转换成线程安全的)
- 因为Vector底层也是采用的数组,所以它的优缺点与ArrayList的大致相同
Set
Set接口的特点是无序(无序指的是存入的顺序和取出的顺序不一致)不可重复,没有下标
Set的实现类
HashSet
- HashSet是Set接口的实现类,的底层数据结构是哈希表,哈希表是由一个数组和多条单向链表组合而成,综合了数组与链表的优缺点
- 放入HashSet中的元素其实就是放入HashMap的key部分
- 调用add()方法进行添加时,通过被添加对象的hashcode()方法和equals()进行判断,确认被添加元素是否已经出现在hashset中。
- 无序:存入的顺序和取出的顺序不同 ;不可重复
Set的子接口 SortedSet
Sorted是一个排序的接口,实现此接口的类都可以遵循一定的排序规则进行排序,若是放入自定义类,需要自定义排序规则
TreeSet
- 1.TreeSet是Set接口的实现类,他实现了Set的子接口SortedSet
- TreeSet的底层数据结构是自平衡二叉树,实现了排序,即使用迭代器或者for循环进行遍历时取出的元素是按从小到大的顺序排序的,又称为可排序集合
- 放入TreeSet中的元素相当于放入TreeMap中的key部分
- 如果往TreeSet中放入自定义对象时,该对象应该实现Comparable接口或者传入比较器,因为此时的排序规则有程序员自己定义
Collection接口下的集合的遍历
第一种遍历方式:使用迭代器
因为Collection它继承与Iterable接口,意思是Collection下的所有集合类都可以获取迭代器,用迭代器进行遍历
//第一种迭代方式
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
第二种遍历方式:for循环
这种遍历方式只使用与List集合,因为List集合是有下标,可以利用下标对集合进行遍历
//第二种遍历方式
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
第三种遍历方式:增强for
这种遍历方式可用于遍历集合和数组
//第三种遍历方式
for(Object object : list) {
System.out.print(object + " ");
}