HashSet集合
遍历通过迭代器Iterator遍历
它存储的是无序集合
不允许重复数据添加
String[] strs = new String[10];
hs.toArray(strs);
转换hashset集合到strs数组中
HashSet对象去重的原理:
哈希表依赖两个方法hashcode()和equals();
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
equals()相同:同一个对象,不能添加
equals()不同:不是同一个对象,可以添加
不同:不是同一个对象,可以添加
结论:
元素的唯一性是由hashcode()和equals()共同保证的,缺一不可
map集合
实现类HashMap<k,v>
存储值:map.put(k,v);
Set set = map.keySet();//获取所有键的集合到set集合中
map.values();遍历获得所有的值的集合
map.putIfAbsent("k1", "newK1");//判断指定的key如果没有值或者值为null,才进行存储
map.put(null, null);//map的key和value都能存储null
通过entry遍历集合:
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key:"+key+",value:"+value);
}
Hashtable是线程安全的,HashMap是线程不安全的
HashMap使用效率比较高,对安全要求不高的建议使用HashMap
不过需要线程安全时建议使用ConcurrentHashMap
TreeMap是自带排序的map集合
因为它是实现二叉树(红黑树)的数据存储结构的
TreeMap可以自定义排序,通过构造方法传参的方式传入实现了Comparator类的子类进行排序
注意:当treeMap的键是对象时,需要此对象实现Comparable接口,构造方法此时参数可以不传
LinkedHashMap集合是存储的有序数据集合
LinkedHashSet集合是存储的有序数据集合
总结:
1.List和Map、Set
list:有序,并且可以存储相同的对象
Map:使用键值对存储方式,两个不同的key可以引用相同的对象,但是key不能重复
Set:无序,不能重复
2.ArrayList和LinkedList
ArrayList:底层使用数组,存储和读取效率高,增删特定位置效率低
LinkedList:使用的是双链表的数据结构,增删效率高,查询效率低
3.ArrayList和Vector
ArrayList:不同步,效率高很多
Vector:同步,线程安全(sychronized)
4.HashMap和HashTable
HashMap:线程不安全,效率高,键和值都可以存储null值
HashTable:线程安全,不能存储null值
5.HashTable和ConcurrentHashMap
都能达到线程安全,建议如果有线程安全需求优先使用第二个
LinkedHashMap和LinkedHashSet都是有序集合