-
TreeSet 当中添加的数据必须是由同一个类提供的。必须是由相同类的对象才能添加到同一棵树当中。
-
TreeSet 输出时会按照一定的顺序输出:由小到大
-
TreeSet 当中有两种排序方法
- 自然排序 Comparable 是 TreeSet 的默认排序方法
- 在 TreeSet 当中的自然排序中,比较两个对象是否相同的标准为:comparTo() ,不再是 equals() 方法。
- 定制排序 Comparator
- 在 TreeSet 当中的自然排序中,比较两个对象是否相同的标准为:compare() ,不再是 equals() 方法。
- 自然排序 Comparable 是 TreeSet 的默认排序方法
-
有序、查询速度比 List 快
-
Collection 和数组之间的相互转换
-
集合 -----> 数组
Collection coll = new Collection(); Object[] arr = coll.toArray(); -
数组 -----> 集合
List<T> list1 = Arrays.asList(new int[]{1,2,3}); // 情况1 System.out.println(list1.size); // 1 List<T> list2 = Arrays.asList(new Integer[]{1,2,3}); // 情况2 System.out.println(list1.size); // 3情况1:因为集合是以对象为单位进行存储,而 int 类型不属于一个对象。所以集合将整个数组看作一个对象进行存储。集合长度为1
情况2:Integer 是一个对象,所以将 Integer 内的元素逐个存储到集合中去。集合长度为3
-
-
Collection 中存储的元素要求
- List 中添加的对象所在的类的 equals() 方法需要重写。
- Set 中添加的对象所在的类的 equals() 方法和 hashCode() 方法都需要重写
-
HashSet 的无序性和不可重复性
-
无序性:因为 HashSet 的底层存储是按照存储元素的哈希值决定的,而不是像 List 集合一个挨着一个来存储。可能会出现第一个元素的底层存储地址和第二个元素的底层存储地址差了十万八千里(默认最多16位)。这就体现出了 HashSet 的无序性。
-
不可重复性:HashSet 是不可重复的。根据元素的哈希值和 equals() 方法来判断底层存储位置是否有相同的元素。
-
-
HashSet 的底层用了数组+链表的结构(jdk7.0 之前 。 jdk8.0 之后用的都是 HashMap)
-
LinkedeHashSet 特点:
- 作为 HashSet 的子类,遍历其内部的元素可以按照添加的顺序去遍历。
- 在添加元素的同时还同时维护着两个引用,用来记录前一个数据和后一个数据的位置
- 对于频繁的便利操作,LinkedeHashSet 效率要高于 HashSet。
-
Map :双列存储,存储 key - value 对的数据
- HashMap:作为 Map 的主要实现类;线程不安全;效率高;可以存储 key 为 null 和 value 为 null 的数据。
- LinkedHashMap:遍历元素时可以按照添加顺序遍历;对于频繁的遍历操作,此类效率比 HashMap 效率高
- TreeMap:可以按照添加的 key - value 进行排序,实现排序遍历。可以按照 key 进行自然排序或者自己设定的定制排序
- Hashtable:线程安全;效率低;不可以存储 key 为 null 和 value 为 null 的数据。
- Properties:常用来处理配置文件;key 和 value 都是 string 类型
- HashMap:作为 Map 的主要实现类;线程不安全;效率高;可以存储 key 为 null 和 value 为 null 的数据。
-
HashMap 的底层在 jdk7.0 之前都是用数组+链表的结构;在jdk8.0 之后都是用数组+链表+红黑树
-
Map 结构理解:
- key 的底层存储是无序且不可重复的,可以看作是按照 Set 存储方式来存储。-----> key 元素所在的类需要重写 equals() 方法和 hashCode() 的方法(以 HashMap 为例)
- value 是可重复且无序的,可以看作使用 Collectoin 存储方式来存储。-----> value 元素所在的类需要重写 equals() 方法。
- 每一对 key-value (键值对) 构成一个 Entry 对象。在 Map 中的 entry 的底层存储是无序且不可重复的,可以看作是按照 Set 存储方式来存储
-
HashMap 的底层实现原理
-
jdk7.0 之前:
HashMap map = new HashMap(); // 底层创造 map 对象的时候创造了一个长度为16 的Enty[] table 数组 // ... 经过了多次添加后... map.put( key1 , value1 );-
首先,调用 key1 元素所在类中的 hashCode() 方法计算 key1 的哈希值。再通过某种计算得到存放在 Enty[] table 中的位置
如果此位置上的数据为空:此时的 key1-value1 添加成功!
如果此位置上的数据不为空:需要和在此位置上的一个或多个元素比较哈希值
- 如果哈希值都不相同:此时的 key1-value1 添加成功!
- 如果哈希值相同:调用 key1 元素所在类中的 equals() 方法
- 如果 equals() 为 false:此时的 key1-value1 添加成功!
- 如果 equals() 为 true:此时的 key1-value1 取代原来已存在的 key1-value1
-
扩容:在 HashMap 不断添加元素遇到需要扩容的时候,它的扩容方法为:扩容为原来的2倍,并将原有的数据复制过来。
-
-
jdk8.0及之后的版本相较于jdk7.0在底层实现的方法不同:
- new HashMap():在创造 new HashMap() 的时候,不会直接创造一个长度默认为16的底层数组
- 在使用 put() 方法添加元素的时候再在底层创建一个长度默认为16的数组。
- jdk8.0 的底层数组是:Node[] 数组,而非 Entry[] 数组。
- 当数组某一索引位置上的以链表形式存在的元素个数 >= 8 且 当前数组长度 >64时,这一索引位置上的元素将使用红黑树存储
-
-
HashMap 扩容特点:
- HashMap 扩容是看 临界值:现有容量*加载因子。如果现有元素数量是大于临界值就会扩容。
- 如果数组的某一个索引位置上以链表形式存在的元素个数 >= 8 但是集合长度又没有超过 64 的时候。HashMap 会选择扩容而不会生成红黑树。
- 当 HashMap 进行扩容以后,相同元素的索引位置在新旧 HashMap 上可能会略有不同。因为生成新的 HashMap 之后会对 旧的 HashMap 上的元素进行计算,并将它们放在新 HashMap 的合适位置上。
-
Map 常用方法
- 增:put (Object key , Object value)
- 删:remove ()
- 改:put (Object key , Object value)
- 查:get (Object key)
- 长度:size ()
- 遍历
- 遍历 key:keySet ()
- 遍历 value:values ()
- 遍历Entry:entrySet ()
-
TreaaMap 特点
- 想 TreeMap 中添加的 key-value,要求 key 必须是由同一个类提供的。必须是由相同类的对象才能添加到同一棵树当中。
- TreeMap 当中有两种默认排序方法:自然排序、定制排序
- TreeMap 当中只能对 key 进行排序,不能对 value 进行排序。如果实在有这样的需求,可以将 setEntry 转换成 List 再用 Collections.sort (Object Collection) 进行排序
-
Collections 介绍
-
Collections 的作用:操作 Collection 和 Map 的工具类
-
Collections 的常见用法
-
reverse (List) :反转 List 中元素的顺序
-
shuffle (List) :对 List 集合元素进行随机排序
-
sort (List):根据元素的自然顺序对指定的 List 集合按升序进行排序
-
sort (List , Comparator):按照元素的定制排序对 List 集合进行排序
-
swap (List , int i , int j) :将 List 集合中指定位置的 i 和 j 进行交换
-
Object max (Collection) :根据元素的自然顺序,返回给定集合中的最大元素
-
Object max (Collection , Comparator) :集合根据定制排序进行排序,返回给定集合中的最大元素
-
Object min (Collection) :根据元素的自然顺序,返回给定集合中的最小元素
-
Object min (Collection , Comparator) :集合根据定制排序进行排序,返回给定集合中的最小元素
-
int frequency (Collection , Object) :返回集合中指定元素 Object 出现的次数
-
void copy (List dest , List src) :将 src 中的内容复制到dest 当中。
-
注意:dest 的长度必须大于等于 src 的长度。如果小于将会报错。
当我们需要用到这个方法的时候,可以对 dest 进行这样的初始化:List dest = Arrays.toList (new Object [src.size] )
这样就可以生成一个长度等于 src 但是元素全部为 null 的集合 dest。
-
-
boolean replaceAll (List list , Object oldVal , Object newVal) :使用新值代替 List 对象的所有旧值。
-
synchronizedMap 和 synchronizedList :线程安全的 Map 和 List。
-
-
-
Iterator 不能对 Map 集合使用,只能对 Collection 集合使用。Map 集合的 key 和 value 都是属于 Collection 集合当中。
-
HashMap 和 ArrayList 都是线程不安全的