第17章(下)--集合

1.LinkedHashSet

 

 

 

 

 

 

 

 1 import java.util.LinkedHashSet;
 2 
 3 public class LinkedHashSetDemo {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         
 8         LinkedHashSet linkedHashSet = new LinkedHashSet();
 9         
10         linkedHashSet.add(new Car("奥拓",1000));
11         linkedHashSet.add(new Car("奥迪",300000));
12         linkedHashSet.add(new Car("法拉利",10000000));
13         linkedHashSet.add(new Car("奥迪",300000));
14         linkedHashSet.add(new Car("保时捷",70000000));
15         linkedHashSet.add(new Car("奥迪",300000)); //这条加入不了,因为重复了.
16         
17         //当我们遍历后,发我们发现LinkedHashSet的特点
18         //1. 添加时,仍然是有HashSet规则.
19         //2. 维护了双向链表,保证遍历的顺序
20         for (Object object : linkedHashSet) {
21             System.out.println(object);
22         }
23 
24     }
25 
26 }
27 
28 class Car {
29     private String name;
30     private double price;
31 
32     
33     //使用eclipse生成 
34     //这里hashCode将属性考虑到. 如果我们的属性相同,则hashCode就相同
35     //重写hashCode的目录:就是希望通过你(程序员)指定的属性,返回一个唯一的hashCode值.
36     //目的是希望只要你给的的属性值相同,那么返回的hashCode()
37     
38 //    @Override
39     public int hashCode() {
40         final int prime = 31;
41         int result = 1;
42         result = prime * result + ((name == null) ? 0 : name.hashCode());
43         long temp;
44         temp = Double.doubleToLongBits(price);
45         result = prime * result + (int) (temp ^ (temp >>> 32));
46         return result;
47     }
48 
49     
50     //这里比较时重写equals, 主要是比较属性值是否相同
51 //    @Override
52     public boolean equals(Object obj) { //==
53         if (this == obj)
54             return true;
55         if (obj == null)
56             return false;
57         if (getClass() != obj.getClass())
58             return false;
59         Car other = (Car) obj;
60         if (name == null) {
61             if (other.name != null)
62                 return false;
63         } else if (!name.equals(other.name))
64             return false;
65         if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
66             return false;
67         return true;
68     }
69 
70     
71     public Car(String name, double price) {
72         super();
73         this.name = name;
74         this.price = price;
75     }
76 
77     
78     public String getName() {
79         return name;
80     }
81 
82     public void setName(String name) {
83         this.name = name;
84     }
85 
86     public double getPrice() {
87         return price;
88     }
89 
90     public void setPrice(double price) {
91         this.price = price;
92     }
93 
94     @Override
95     public String toString() {
96         return "Car [name=" + name + ", price=" + price + "]";
97     }
98 
99 }

 

 2.Map

 

 

 

 

 

 

 

1) HashMap和Hashtable 实行了Map接口,使用虚线表示

2) Properties 是Hashtable的子类

3) LinkedHashMap 是HashMap的子类

4) SortedMap是一个Map子接口

5) TreeMap 是SortedMap的实现子类,是可以进行排序处理.

 

3.Map常用方法

 

 

 

 

 1 import java.util.HashMap;
 2 import java.util.Map;
 3 
 4 public class MapDemo {
 5 
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         Map map = new HashMap();//这是一个hashmap对象实例
 9         
10         //1. 映射关系的数据:Key-Value
11         //2. Map 中的 key 和  value 都可以是任何引用类型的数据
12         //3. Map 中的 key 用Set来存放,不允许重复, 如果有重复key,则后面的value覆盖前面value, 等同于修改
13         //4. Map 中的 value 可以重复
14         //5. Map 的key 可以为 null, value 也可以为null 
15         //6. Map元素是无序的,因为key是用Set来存放的
16         map.put("邓超", new Book("天龙八部",100));
17         map.put("邓超", "孙俪");
18         map.put("王宝强", "马蓉");
19         map.put("宋喆", "马蓉");
20         map.put("刘令博", null);
21         map.put(null, "刘亦菲");
22         map.put("鹿晗", "关晓彤");
23         
24         
25         
26         //这时我们遍历Map是使用其他的方案(仍然是迭代器,但是使用方法有变化)
27         System.out.println(map);
28 
29         //通过get 可以获取到对应的值
30         Object object = map.get("邓超");
31         System.out.println("object=" + object);
32         //通过remove可以删除某对key-value
33         map.remove("鹿晗");
34         System.out.println(map);
35         
36         //containsKey 用于判断该map中是否有该key,返回boolean
37         //containsValue 用于判断该map中是否有该value,返回boolean
38         System.out.println(map.containsKey("王宝强")); // true
39         System.out.println(map.containsKey("王宝强~")); // false
40         System.out.println(map.containsValue("刘亦菲"));// true
41         System.out.println(map.containsValue("刘亦菲~"));// false
42         
43         //size和isEmpty
44         System.out.println(map.size()); // 5
45         System.out.println(map.isEmpty()); // false
46         
47         //clear:清除
48         map.clear();//将map中的所有key-value全部清空
49         System.out.println(map);
50  
51     }
52 
53 }
54 
55 class Book {
56     private String name;
57     private int price;
58     public Book(String name, int price) {
59         super();
60         this.name = name;
61         this.price = price;
62     }
63     
64 }

 

4.Map的遍历

 

 

 

 

 

 

 

 

 5.HashMap的扩容机制

 

 

 

 

 

 

 

1)      ashMap底层维护了Node类型的数组table,默认为null [看源码]

2)      当创建对象时,将加载因子(loadfactor)初始化为0.75.

3)      当添加元素时(调用putVal方法),需要通过该元素的哈希值获取在table中的索引。然后判断该索引处是否有元素,如果没有元素直接添加。如果该索引处有元素,需要继续判断是否相等(equals),如果              相 等,则直接覆盖;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容。

4)      如果第一次添加,则需要扩容table容量为16,临界值(threshold)为12.[即使用到12个空间,就要扩容, 公式=table容量* loadfactor = 16 * 0.75 = 12 ]

5)      如果其他次添加,则需要扩容table容量为原来的2倍,临界值为原来的2倍[公式=table容量* loadfactor = 16 * 0.75 = 12]。

 

6.TreeMap

 

 

7.     Map接口实现类-Hashtable

     HashTable的基本介绍

 

1)      This class implements a hash table[该类实现hashtable]

2)      which maps keys to values [元素是键值对]

3)      Any non-null object can be used as a key or as a value [hashtable的键和值都不能为null]

4)      所以是从上面看,hashTable 基本上和hashMap一样的.

 

8.集合的选择

 

 9.Collection工具类

 

 

  • 查找、替换

1)      Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素

2)      Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素

3)      Object min(Collection)

4)      Object min(Collection,Comparator)

5)      int frequency(Collection,Object):返回指定集合中指定元素的出现次数

6)      void copy(List dest,List src):将src中的内容复制到dest中

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

posted @ 2020-06-25 15:18  --学无止境--  阅读(193)  评论(0编辑  收藏  举报