标签:hash :link nbsp 线程 相同 安全 遍历 equals 集合
1. Set集合
(1) Set集合的特点
无序,唯一
(2) HashSet集合
A:底层数据结构是哈希表(是一个元素为链表的数组)
B:哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
C:如何保证元素唯一性的呢?
由hashCode()和equals()保证的
D:开发的时候,代码非常的简单,自动生成即可
E:HashSet存储字符串并遍历
F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
G:不保证set的迭代顺序,特别是它不保证该顺序恒久不变
(3) LinkedHashSet集合
A:元素有序唯一。由链表保证元素有序,由哈希表保证元素唯一
(4) TreeSet集合
A:底层数据结构是红黑树(是一个自平衡的二叉树) -> 保证元素的排序和唯一性
B:保证元素的排序方式
a:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
b:比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象
(5) 遍历
A:HashSet集合
a:用Iterator来遍历
b:用增强for来遍历
B:TreeSet集合
2. Collection集合总结
Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals(),开发中自动生成这两个方法即可
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals(),然后看其返回值,是true:说明元素重复,不添加,是false:就直接添加到集合
否:就直接添加到集合
最终:自动生成hashCode()和equals()即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序(元素具备比较性),让元素所属的类实现Comparable接口
比较器排序(集合具备比较性),让集合接收一个Comparator的实现类对象
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
3. 针对集合我们到底使用谁呢?
是否是键值对象形式:
是:Map
键是否需要排序:
是:TreeMap
否:HashMap
不知道,就使用HashMap。
否:Collection
元素是否唯一:
是:Set
元素是否需要排序:
是:TreeSet
否:HashSet
不知道,就使用HashSet
否:List
要安全吗:
是:Vector(其实我们也不用它,后面我们讲解了多线程以后,我在给你回顾用谁)
否:ArrayList或者LinkedList
增删多:LinkedList
查询多:ArrayList
不知道,就使用ArrayList
不知道,就使用ArrayList
4. 在集合中常见的数据结构
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
5. Map
(1) 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
(2) Map和Collection的区别?
A:Map 存储的是键值对形式的元素,键唯一,值可以重复。
B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。
C:Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效。
(3) Map接口功能概述
A:添加功能 V put(K key,V value)
B:删除功能 V remove(Object key)
C:判断功能 boolean containsKey(Object key) / boolean containsValue(Object value) / boolean isEmpty()
D:获取功能 V get(Object key)
E:长度功能 int size()
F:遍历相关功能 Set<K> keySet() / Set<Map.Entry<K,V>> entrySet() / Collection<V> values()
(4) Map接口的实现
A:HashMap
基于哈希表的Map接口实现。哈希表的作用是用来保证键的唯一性的。
B:LinkedHashMap
是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
由哈希表保证键的唯一性,由链表保证键盘的有序(存储和取出的顺序一致)
C:TreeMapTreeMap
基于红黑树的Map接口的实现
(5) Map集合的遍历
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象去获取键和值
代码体现:
Map<String,String> hm = new HashMap<String,String>(); hm.put("it002","hello"); hm.put("it003","world"); hm.put("it001","java"); //方式1 键找值 Set<String> set = hm.keySet(); for(String key : set) { String value = hm.get(key); System.out.println(key+"---"+value); } //方式2 键值对对象找键和值 Set<Map.Entry<String,String>> set2 = hm.entrySet(); for(Map.Entry<String,String> me : set2) { String key = me.getKey(); String value = me.getValue(); System.out.println(key+"---"+value); }
(6) 思考题
A:HashMap和HashTable的区别
a:Hashtable:线程安全,效率低。不允许null键和null值
b:HashMap:线程不安全,效率高。允许null键和null值
B:List,Set,Map等接口是否都继承子Map接口?
List,Set不是继承自Map接口,它们继承自Collection接口
Map接口本身就是一个顶层接口
6. Collections
(1) 是针对集合进行操作的工具类
(2) 思考题:Collection和Collections的区别
A:Collection 是单列集合的顶层接口,有两个子接口List和Set
B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
(3) 常见的几个小方法:
A:public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
B:public static <T> int binarySearch(List<?> list,T key):二分查找
C:public static <T> T max(Collection<?> coll):最大值
D:public static void reverse(List<?> list):反转
E:public static void shuffle(List<?> list):随机置换
标签:hash :link nbsp 线程 相同 安全 遍历 equals 集合
原文地址:https://www.cnblogs.com/nomad1c/p/11707041.html