1、HashSet 集合
● 特点:
底层数据结构:哈希表;存储、取出比较快;线程不安全,运行速度快(HashSet的底层是用HashMap实现的,因此查询效率较高,由于采用hashCode算法直接确定元素的内存地址,增删效率也挺高的)
● HashSet集合存储数据的结构(哈希表)
哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。
当向哈希表中存放元素时,需要根据元素的特有数据结合相应的算法,这个算法其实就是Object类中的hashCode方法。由于任何对象都是Object类的子类,所以任何对象有拥有这个方法。即就是在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。
总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。
● ArrayList 和 HashSet 判断元素重复
ArrayList--contains(Object o)方法,本质:调用 equals()方法。
HashSet--contains(Object o)方法,add(E e)方法。
2、Map 集合
● 注意:Map 接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>,的数据类型可以相同,也可以不同。
● Hashtable 是 Map 的子类,1.2版本后被 HashMap 取代,但是它的子类 Properties 依然在使用。
3、jdk 1.5 新特性之静态导入
作用:减少开发的代码量
静态导入的语法:import static 包名.类名.静态成员变量;
import static 包名.类名.静态成员函数;
注意:导入的是成员变量和方法名。
弊端:过度地使用静态导入会在一定程度上降低代码的可读性。
● 示例:
1 import static java.lang.System.out; 2 3 public class StaticImportDemo { 4 public static void main(String[] args) { 5 out.println("abc"); 6 } 7 }
4、Collections 类
binarySearch() 找不到返回的结果:(-(insertion point) - 1)