javaSE基础学习笔记 day16
Collection 接口中的常用方法
- 添加:
①add(Object obj);
②addAll(Collection coll); - 获取有效元素的个数:int size();
- 清空集合: void clear();
- 是否是空集合:boolean isEmpty();
- 是否包含某个(些)元素:
①boolean contains(Object obj);
②boolean containsAll(Collection c); - 删除某个(些)元素:
①boolean remove(Object obj);
②boolean removeAll(Collection coll); - 取两个集合的交集:boolean retainAll(Collection c);
- 集合是否相等:boolean equals(Object obj);
- 转成对象数组:Object[] toArray();
- 返回Iterator接口的实例化,指向集合第一个元素的前一个位置,用于集合遍历:iterator()
Iterator接口常用方法
- hasNext():是否有下一个元素
- next():
① 指针先向下移动一格位置。
② 返回指针所指的对象。 - remove():删除迭代器指向的对象。
List接口以及其实现类
简介:是 Collection 的子接口,List集合类中元素有序,且可重复。
List接口中常用方法:
- void add(int index, Object ele):在index位置插入ele元素。
- boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来。
- Object get(int index):获取指定index位置的元素。
- Object remove(int index):移除指定index位置的元素,并返回此元素。
- Object set(int index, Object ele):设置指定index位置的元素为ele。
ArrayList
简介:线程不安全的,效率高,底层是通过 Object[] 数组实现的。
- 在 JDK7.0 中,通过 new ArrayList() 创建对象时,底层创建一个 长度为 10 的数组,如果在添加的过程中导致数组容量不够,则扩容为原来的 1.5 倍,同时将原有的数据复制到新的数组中。
建议用带参构造器指名初始容量,避免触发扩容导致效率变低。 - JDK8.0 的变化:通过new ArrayList() 创建对象时,底层并没有创建长度为 10 的数组,当第一次 add() 时,底层才创建了长度为 10 的数组,扩容机制与 JDK7.0 相同。
LinkedList
简介:底层通过双向链表实现,对于频繁插入,删除的操作效率高。
Vector
简介:比较老的实现类,线程安全的,效率低,已经不怎么使用。
Set接口
简介:是 Collection 的子接口,Set 接口中没有定义额外的方法,全部使用从 Collection 继承而来。Set 中的元素是无序的,不可重复的。
什么是无序性?
不等于随机性,存储的数据在底层数组中不是按照 index 递增存储的,而是按照 hash 值存储的。
什么是不可重复性?
保证新添加的元素,用 equals() 方法和已有元素判断时不返回 true ,相同的元素只能在 Set 中存一个。
HashSet
简介:线程不安全的,也可以存 null。
添加元素的过程:(重点)
假设现在要添加元素 a ,先调用 a.hashCode() 计算 a 的哈希值,然后通过某种算法运算出应在 HashSet 底层数组中存放的位置
①如果此位置无元素,则添加成功。
②如果此位置已经有元素,则用此对象 a 与该位置其他元素比较哈希值,若都不同则添加成功。
③如果此位置有其他元素与 a 的哈希值相同,则调用 a.equals() ,判断是否为同一对象,如为 false,则添加成功。
④其他情况均为添加失败。
注意: 在JDK7.0时,a 放在数组中,指向原来的元素(头插)
JDK8.0中,a 放在链表尾,原来的元素指向 a (尾插)
要求:在 Set 中添加的数据,其所在类一定要重写 equals() 和 hashCode()。
LinkedHashSet
简介:为 HashSet 的子类,可以在遍历时按照添加时的顺序遍历。
只是在 HashSet 的基础上,在添加元素的同时,还在元素间维护了一个双向链表,使得对于频繁的遍历操作,该集合效率很高。
TreeSet
简介:可按照添加对象的指定属性,进行排序。
- 在 TreeSet 中添加的元素,必须是相同类的对象。
- 两种排序方式:自然排序,定制排序。
- 自然排序:在 TreeSet 中,判断元素相同的标准是 compareTo(Object obj) 返回值是否为 0 ,而不再是 equals()。
- 定制排序:在创建 TreeSet 时,通过将实现 Comparator 接口类的对象作为参数传进构造函数中,判断元素相同的标准是,compare(Object o1, Object o2) 返回值是否为 0 .