3.17java集合终章

HashMap小结
1. Map接口的常用实现类 : HshMap, Hashtable Properties
2. HashMap Map接口使用频率最高的实现类   是以key-val对的方式存储数据
3. key 不能重复 ,但是值可以充分, 允许使用null 键 和null

  1. 如果添加相同的key , 则会覆盖原来的key-val , 等同于修改(key不会替换, val会替换)
  2. HashSet一样, 不保证映射顺序, 因为底层是以hash表的方式来存储的
  3. HashMap没有实现同步, 因此线程不安全

 

HashMap底层机制以源码(扩容机制和HashSet一样)

  1. HashMap底层维护了Node类型的数组table, 默认为null
  2. 当创建对象是, 将加载因子(loadfactor)初始化为0.75
  3. 当添加key - val, 通过key的哈希值得到在table的索引. 然后判断该索引处是否有元素, 如果没有元素直接添加. 如果该索引处有元素, 则继续判断该元素的key是否和准备加入的key相等, 如果相等 , 则直接替换val; 弱国不相等需要判断是树结构还是链表结构, 做出相应处理. 如果特甜伽师发现容量不够, 则需要扩容
  4. 第一次添加, 则需要扩容table容量为16 , 临界值(threshold)12
  5. 以后再扩容, 则需要扩容table容两为原来的2

 

总结- 如何选择集合实现类

  1. 先判断存储类型(一组对象 , 还是一组键值对)

一组对象:Collection接口

允许重复: List

增删多: LinkedList [ 底层维护了一个双向链表]

改查多: ArrayList [ 底层维护Object类型的可变数组]

不允许重复 Set

无序: HashSet 底层是HashMap, 数组,链表,红黑树

排序:TreeSet

插入和取出顺序一直: LinkedHashSet, 数组+双向链表

--------------------------------------------------

一组键值对:Map

键无序: HashMap

键排序: TreeMap

键插入和取出顺序一致: LinkedHashMap

读取文件 Propertise

-----------------------------

一些细节

 

HashTable基本介绍

 

  1. 存放的元素是键值对: K-V
  2. Hashtable的键和值都不能为null, 否则会抛出NullpointerException
  3. Hashtable使用方法基本和hashMap一样
  4. HashTable是线程安全的, hashmap是现成不安全的

 

Properti HashTable的子类所以也不能放null

----------------------------------------------

collection 的 基本方法

 

List list = new ArrayList();
list.add("tom");
list.add("smith");
list.add("king");
list.add("milan");

//reverse(List): 反转 List中的元素
Collections.reverse(list);

//shuffle(List): 对 List 集合元素进行随机排序
Collections.shuffle(list);

//sort(List): 根据元素的自然顺序对指定 List 集合元素按升序排序
Collections.sort(list);//按照字符串大小排的
//sort(List, Comparator): 根据指定的 Comparator 产生的顺序对 List集合元素排序
//我们希望按照, 字符串的长度大小进行排序
Collections.sort(list, new Comparator(){
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof String){
//可以加入校验代码
}
return ((String)o1).length() - ((String)o2).length();
}
});

//swap(List, int , int): 将指定list 集合中的 i 处元素和 j 处元素进行交换
Collections.swap(list, 0, 2);


//Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
System.out.println("自然顺序最大元素=" + Collections.max(list));
// Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
// 比如,我们要返回长度最大的元素
// Object maxObject = Collections.max(list, new Comparator() {
// @Override
// public int compare(Object o1, Object o2)
// { return ((String)o1).length() - ((String)o2).length();

ArrayList dest = new ArrayList();
//为了完成一个完整拷贝, 我们需要献给dest 复制, 大小和list.size()一样
for(int i = 0; i<list.size(); i++){
dest.add("");
}
//拷贝
Collections.copy(dest, list);
System.out.println(dest);

//boolean replaceAll(List list, Object oldVal, Object newVal):
// 使用新值替换 List 对象的所有旧值

 

 

 

posted on 2022-03-17 22:22  我要当程序源  阅读(19)  评论(0编辑  收藏  举报

导航