Java容器介绍HashSet
今天由小编来继续回顾容器,上次我们总结了List接口下的ArrayList和LinkedList,那么我将介绍List的兄弟接口Set。
Set接口下有一个HashSet实现类,HashSet的底层是用HashMap实现的,因此,查询效率高。由于采用Hashcode算法直接确定元素的内存地址,增删效率也高。HashSet 接口中的元素无序不可重复 ,不包含重复元素,最多包含一个 null,元素没有顺序 。
无序:虽说没有顺序,其实Hashset类内部有其内置的排序算法,使用者无序的将其存入,Hashset类有序的将其存放。来一段代码:
Set<String> set = new HashSet<>();
set.add("AAAA");
set.add("CCCC");
set.add("EEEE");
set.add("DDDD");
set.add("BBBB");
for (String s : set) {
System.out.println(s);
}
遍历
HashSet作为Set接口的实现类,底层不像List接口那样以数组和节点来实现,没有相应的下标,所以普通的for循环无法遍历Hashset容器,但不用着急,总有办法遍历,就用增强for循环和迭代器来解决。上代码:
for(String s : set){
System.out.println(s);
}
Iterator<String> iterator=set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
容器中有一个常用的方法contains(),可以用来查找容器中是否含有当前对象,代码如下:
System.out.println(set.contains("AAAA"));
由此可见,方法返回的是一个布尔类型的字符串。
Map
接下里,我将为大家介绍学习的重点对象Map接口下实现的类HashMap,毫不过分的说,这是容器中的重点。
给大家一个用例,假如你的List中有8000个数据对象,我现在要从8000个数据对象中查找一条,问怎么查找最快?
Map也是容器的一种,但是没有继承Collection接口,以键值对的形式存放数据,一个key对应一个value。key和value都是引用数据类型,我们可以通过key找到对应的value。
Map类中存储是以键--值对的形式,通过键来标识,所以不能重复。
接口Map,其中规定了Map的规范,各种方法的定义。方法如下:
常见的实现类有HashMap、HashTable等。
注意: 如果存入的键值对中key相同,那么后面的会覆盖掉前面的当数据存放到Map之后,我们是无法控制存放数据的顺序的。当然是以其内部的规则来存放的。
HashMap作为Map的实现类,其中的方法都进行了实现,并且定义了可以存储数据 的空间,其中使用了一个叫做Entry的内部类,作为数据的存储,后面将会提到。先来一段代码,如何创建,存放数据:
Map<String, String> map = new HashMap<>();
map.put("1","一,壹,Ⅰ");
map.put("2","二,贰,Ⅱ");
map.put("3","三,叁,Ⅲ");
System.out.println(map.get("1"));
HashMap中存储数据的特点:
1.存储的元素是以K-V的形式存在的
2.map集合中 key 必须要唯一,如果添加了相同的键值对(键相同)会发生覆盖
3.map集合中元素(键值对)是无序的,和Set集合类似。
Map的遍历
前面所有讲过的所有容器都是直接遍历的,而HashMap则有点特殊,必须间接遍历。
将Map所有的 key 获取存入 Set 集合中,遍历存储 key 的 Set 集合,结合 get(key) 方法可以获取map 中每一个 key 以及对应的 value。代码如下:
Set<String> keys = map.keySet();
// 增强for
for(String key : keys){
System.out.println(key + " - " + map.getKey(key));
}
// 迭代器
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.println(key + " - " + map.getKey(key));
}
另一种遍历方法,将所有的 value 值获取后存入Collection集合中,遍历存储了所有 key 的集合,则可以获取到所有的 value 值,但此种方式只能获取到每一个value,并不能获取到key。
Collection<String> values = map.values();
// 增强for
for (String value : values) {
System.out.println(value);
}
// 迭代器
Iterator<String> it = values.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
EntrySet
EntrySet是HashMap中的一个内部类,将Map集合中的每一个键值对作为一个 Entry 对象获取到一个Set集合中,通过对象的 getKey 和 getValue 方法获取 key 和 value。
Set<Map.Entry<String, String>> entries = map.entrySet();
// 增强for
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
// 迭代器
Iterator<Map.Entry<String, String>> it = entries.iterator();
while(it.hasNext()){
Map.Entry<String, String> entry = it.next();
System.out.println(entry.getKey() + "-" + entry.getValue());
}
在我看来,无论是List还Set或者是Map都是集合,都是为了存储具有不同特征的数据,根据实际情况选择不同的容器即可。
所有代码都已经上传,想要学习请自行下载(免费开源0积分)。
总结:
List(ArrayList,LinkedList):单个数据,数据是可以重复的,而且可以指定位置。
Set:单个数据,数据是不可以重复,而且是无序的(不由用户来指定位置|顺序) 。
Map:成键--值对的数据,数据是没有顺序的,键是不可以重复的,hashCode在Set和Map集合中判断对象是否重复(相同) equals也是用来判断对象是否相同(重复)
身材不好就去锻炼,没钱就努力去赚。别把窘境迁怒于别人,唯一可以抱怨的,只是不够努力的自己。
本文地址:https://blog.csdn.net/qq_42121367/article/details/107898358
上一篇: 网易面试笔试题(游乐场买票)
下一篇: Java面向对象(萌新的学习心得及笔记)