哈希表
HashMap在开发中一定都用过,其Key就是用Hash表来进行存储,而HashMap中,无论数据量多大,增删改查操作的时间复杂度都是 O(1)(忽略掉单样本大小的情况下,比如说:加一个数字,如果加一个字符串,字符串长度很长,是一本书的内容,那它就不是O(1),如果添加的都是字符串,那复杂度就是O(K),K为平均长度),只不过如果数据量大的话这个常数操作的时间可能会有点长。
HashMap中,如果Key是Java的基本数据类型,那么它就是值传递,如果是自定义的Java类,就是引用传递,代码如下。
//Integer对象在超过127之后,会new新的对象来存储,所以a,b的地址不相等
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
HashMap<Integer, String> map = new HashMap();
map.put(a, "a");
//但在HashMap中,基本数据类型不存在引用传递,此时会返回true
System.out.println(map.containsKey(b));
HashMap<String, String> map1 = new HashMap();
String s1 = "a";
String s2 = new String("a");
System.out.println(s1 == s2);
map1.put(s1, "a");
System.out.println(map1.containsKey(s2));
HashMap<Te, String> test = new HashMap();
Te t1 = new Te(1);
Te t2 = new Te(1);
System.out.println(t1 == t2);
test.put(t1, "我是test1");
System.out.println(test.containsKey(t2));
一个HashMap<String,String>中,如果Key和Value存储的字符串特别大,比如说Key和Value分别存的是一本书的内容,Key和Value有多大,就会开辟多大的空间来存储,此时如果用一个Book类来存储这本书的内容,HashMap<Book,Book>的形式来存储,Key就会非常小,只有Book的地址8字节。
有序表
有序表是一个接口名,Java中能够实现有序表的有很多,比如红黑树、AVL树、SB树、跳表等。。。所有有序表想提供的功能,这些结构都可以实现。增删改查的时间复杂度为
O
(
l
o
g
n
)
O(log^n)
O(logn),Java中常见的TreeMap就是有序表的结构,底层是红黑树来实现。
有序表中,基本类型按值传递,如果想要存储自定义的类,需要自己实现比较器。如果自己实现的比较器(根据学生类的age进行排序),那两个学生age相同的话,TreeMap中只会存储一个。
代码如下:
TreeMap<Integer, String> treeMap = new TreeMap();
treeMap.put(3, "我是3");
treeMap.put(9, "我是9");
treeMap.put(5, "我是5");
treeMap.put(2, "我是2");
treeMap.put(1, "我是1");
treeMap.put(7, "我是7");
System.out.println(treeMap.ceilingKey(1));
System.out.println(treeMap.ceilingKey(11));
System.out.println(treeMap.get(1));
System.out.println(treeMap.get(11));
treeMap.put(5,"它是5");
System.out.println(treeMap.get(5));
treeMap.remove(5);
System.out.println(treeMap.get(5));
System.out.println(treeMap.firstKey());
System.out.println(treeMap.lastKey());
//<= 5的第一个数
System.out.println(treeMap.floorKey(5));
//>= 5的第一个数
System.out.println(treeMap.ceilingKey(5));