day19_ LinkedList HashSet LinkHashSet 可变参数 Collection集合工具类
今日内容
-
List集合
-
Set集合
-
可变参数
-
Collections集合工具类
List集合
LinkedList集合
LinkedList集合是双向链表结构,方便元素添加和删除。链表集合元素大多采用首尾结点操作。
1.LinkedList集合独有的常用API
备注:LinkedList是List的子类,list所有的方法他都能使用
public void addFirst(E e):将指定的元素添加到此列表的开头 public void addLast(E e): 将指定的元素添加到此列表的结尾 public E getFirst(): 获取此列表的首结点元素 public E getLast(): 获取此列表的尾结点元素 public E removeFirst():删除此列表首结点元素 public E removeLast():删除此列表尾结点元素 public E pop():从此列表所表示的堆栈中弹出一个元素(首结点) public void push(E e): 将此元素推入此列表所表示的堆栈中(首结点) public boolean isEmpty(): 如果此列表不包含任何元素,则返回true
Set接口
2.Set接口
java.util.Set接口继承自Collection类,比Collection接口更加严格,Set内的元素无重复,无序(这里的无序指的是元素存取顺序不一致)。
主要介绍HashSet集合和LinkedHashSet集合
Set集合的元素取出方式为:迭代器和增强for循环
3.HashSet集合
java.util.HashSet是Set接口的实现类,元素无重复,无序。底层是HashMap支持。
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此有良好的存取和查找性能。
保证元素唯一性的方法依赖于hashCode和equals方法
3.1HashSet组成
在JDK1.8之前,底层采用数组+链表实现,只使用哈希链表处理哈希冲突,同一个哈希值的链表都存储在同一个链表里,如果一个链表里的元素较多的时候(即哈希值相等的元素),通过key值(HashMap键值对)依次查找的效率很低下。
JDK1.8后哈希表采用数组+链表/红黑树实现,当链表的长度超过阈值(8)时,将链表自动转换成红黑树结构,大大提高查找时间。
3.2HashSet添加过程:
add方法会先调用s1的方法,计算s1(“abc”)的哈希值,哈希值是96354,如果要添加s2,先在集合中查找有没有96354这个哈希值的元素,没有的话就把他存储到集合里面,如果有(会发生哈希冲突),s2紧接着会调用equals方法和哈希值相同的元素做比较,即:s2.equals(s1),如果两个元素的哈希值相同,并且equals方法的返回值是true,就会认为两个元素相同,就不会把s2的元素存进集合当中,如果两个元素哈希值相同,且equals方法返值是false,就会把s2元素放进集合的链表当中
JDK1.8之后的红黑树大大优化了HashMap的性能,保证HashSet元素唯一性,主要是通过hashCode和equals方法来保证,如果我们存储自定义的对象,需要保证对象的唯一性,就必须重写HashCode和equals方法来自定义当前的比较方式。
4.LinkHashSet集合
HashSet存入元素没有顺序,它的子类java.util.LinkedHashSet是有序的,他是链表和哈希表的组合的一个数据存储结构。
LinkedHashSet和HashSet的区别就是有序
有序证明 //构建一个LinkedHashSet集合对象 LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("www"); linkedHashSet.add("zhiyou100"); linkedHashSet.add("com"); linkedHashSet.add("abc"); linkedHashSet.add("abc"); linkedHashSet.add("java"); linkedHashSet.add("python"); // [www, zhiyou100, com, abc, java, python] System.out.println(linkedHashSet);//[www, zhiyou100, com, abc] 有序的,不重复的
可变参数
可变参数是JDK1.5之后出现
一个方法需要接受多个参数,并且数据类型一致的话,可以使用可变参数。
5.可变参数格式
修饰符 返回值类型 方法名(参数列表...形参名){ //..... }
该格式等同于
修饰符 返回值类型 方法名(参数类型[] 参数名){
//....
}
前者可以直接传递参数,后者必须传递一个数组类型
6.可变参数的注意事项
1.一个方法的参数列表只能有一个可变参数
2.如果方法的参数有多个,类型不止一种,那么可变参数必须写在参数列表的末位位置。
Collections集合工具类
java.util.Collections 是一个工具类,用来操作集合中的元素
7.Collections常用API方法
public static <T> boolean addAll(Collection<? super T>c,T...elements):往集合中一次性添加多个元素 public static <T> void shuffle(List<?> list):将集合中的元素顺序打乱 public static <T> void sort(List<T> list):将集合中的元素按照默认规则排序 public static <T> void sort(List<T> list,Comparator<? super T>c):将集合中的元素按照指定的规则进行排序