java的集合映射_Java 集合和映射表

75b9685b378a17720b7177d3bf50aff7.png

集合

可以使用集合的三个具体类HashSet、LinkedHashSet、TreeSet来创建集合

bbdd57fc342c0f8448a29830efd727e0.png

400ca586adc3f10190542b1ff3d4fd57.png

b172d8a56db31fd8f43a16757f11eae8.png

HashSet类

负载系数

当元素个数超过了容量与负载系数的乘积,容量就会自动翻倍

HashSet类可以用来存储互不相等的任何元素。考虑到效率的因素,添加到散列集中的对象必须以一种正确分散散列码的方式来实现hashCode方法。

如果两个对象相等,那么这两个对象的散列码必须一样。两个不相等的对象可能有相同的散列码

继承Collection接口,所以Collection中的所有方法,都可以用

例子:

8158b74f76c099b128340fa02bd2949b.png

4d97e36d51c943631f1a3f691bd61455.png

70c6c89c535c8d0a5810d59a35cc22c3.png

LinkedHashSet类

LinkedHashSet用一个链表实现来扩展HashSet类,他支持对集合内的元素排序

HashSet中的元素是没有被排序的,而LinkedHashSet中的元素可以按照他们插入集合的顺序提取。

例子:

f3bb9ebf0e26c328f0ee7b1baad28bb3.png

0a4fbfcdaa36dcd691e80d81d1900bd7.png

LinkedHashSet保持了元素插入时的顺序。

TreeSet类

1dfaca8e39fde34d7e8c1d692d4fed41.png

例子:

public classTextTreeSet {public static voidmain(String [] args) {

Set set = new HashSet();

set.add("London");

set.add("Paris");

set.add("New York");

set.add("Zon");

TreeSet treeSet = new TreeSet(set);

System.out.println("Sorted tree set : " +treeSet);

System.out.println("first : " +treeSet.first());

System.out.println("last : " +treeSet.last());

System.out.println(treeSet.headSet("New York")); //输出New York 之前的数据

System.out.println(treeSet.tailSet("New York")); //输出 New York 之后的数据

System.out.println("小于: " + treeSet.lower("Paris")); //返回一个小于给定的元素

System.out.println("大于: " + treeSet.higher("New York")); //返回一个大于给定的元素

System.out.println("小于或等于: " + treeSet.floor("P")); //返回一个小于或等于给定的元素

System.out.println("大于或等于:" + treeSet.ceiling("P")); //返回一个大于或等于给定的元素

System.out.println("pollFirst: " +treeSet.pollFirst());

System.out.println("pollLast: " +treeSet.pollLast());

System.out.println("New tree set: " +treeSet);

}

}

1d9efb5e63b9e55e1754d98575edfffc.png

a77fb743612e14dc7b6f751eb0359745.png

9687192017f51bdd033e394131533cb7.png

例子:

b91bf4e438d0a0914c75e6b4336deba8.png

HashSet,LinkedHashSet和TreeSet有什么区别?

HashSet使用哈希表实现的,元素是无序的。添加、删除操作时间复杂度都是O(1)。TreeSet内部结构是一个树结构(红黑树),元素是有序的,添加、删除操作时间复杂度为O(log(n)),并且提供了first(), last(), headSet(), tailSet()等方法来处理有序集合。LinkedHashSet是介于HashSet 和 TreeSet之间,内部是一个双向链表结构,所以它的插入是有序的,时间复杂度是O(1)。

映射表

d3f3f4404bcf18313085281c6bd6e1e3.png

5a0561439d3f1efe070438614fe5a051.png

32a0fd95355381354e1671b9e99ca485.png

更新方法包括clear、put、putAll和remove,方法clear()从映射表中删除所有的条目。

方法put(K,V)为映射表中的指定的键和值添加条目,如果这个映射表原来就包含键的一个条目,这原来的值将被新的值所替代,并且返回与这个键相关联的原来的值

查询方法包括containsKey、containsValue、isEmpty和size。

f547c4baf01b23e019a760416d5fb9a9.png

3c97cf73388407a574884dcdd699c4c5.png

LinkedHashMap类是用链表来实现来扩展HashMap类,他支持映射表中的条目的排序。HashMap没有顺序,而LinkedHashMap,元素可以按照插入的顺序来顺序排序,也可以按他们被最后一次访问时的顺序从最早到最晚排序,

TreeMap类在遍历排好顺序的键时是很高效的。键可以使用Comparable接口或Comparator接口来排序

例子:

87e32fc91c4367b122bf7b8a60901f85.png

fe9512f7a0e4b7edc3b6b0de0c5c5e30.png

05a3670fb0625c2f9339c2d32d4cc64c.png

LinkedHashMap如果使用了按访问顺序排序,那么被访问的,会放在映射表的末尾

三种映射表的使用情况

ed9a240d66bee1bb7546471eac6872d2.png

统计单词出现次数例子:

public classCountOccurentOfWords {public static voidmain(String [] args) {

String text= "Good morning. have a good class. Have a good visits. Have fun!.";

Map map = new TreeMap<>();

String [] words= text.split("[ \n\t\r.,;:?!(){}]");for(int i=0; i

String key=words[i].toLowerCase();if(key.length() > 0) {if(!map.containsKey(key)) {

map.put(key,1);

}else{int value =map.get(key);

value++;

map.put(key, value);

}

}

}

Set> wordSet =map.entrySet(); //调用entrySet()方法 可以返回一个Set集合for(Map.Entrys: wordSet) {

System.out.println(s.getKey()+ " " +s.getValue());

}

}

}

e208e2eff47c681f28b9d14cf1690196.png

单元素与不可变的合集和映射表

59280084a27d5443e743efce66636a09.png

ef1853f048a2388f6965d2df99bfb034.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值