欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java容器介绍HashSet

程序员文章站 2022-07-10 18:44:01
今天由小编来继续回顾容器,上次我们总结了List接口下的ArrayList和LinkedList,那么我将介绍List的兄弟接口Set。Set接口下有一个HashSet实现类,HashSet的底层是用HashMap实现的,因此,查询效率高。由于采用Hashcode算法直接确定元素的内存地址,增删效率也高。HashSet 接口中的元素无序不可重复 ,不包含重复元素,最多包含一个 null,元素没有顺序 。无序:虽说没有顺序,其实Hashset类内部有其内置的排序算法,使用者无序的将其存入,Hashse...

今天由小编来继续回顾容器,上次我们总结了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);
} 

Java容器介绍HashSet

遍历

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"));

Java容器介绍HashSet

由此可见,方法返回的是一个布尔类型的字符串。

Map

接下里,我将为大家介绍学习的重点对象Map接口下实现的类HashMap,毫不过分的说,这是容器中的重点。

给大家一个用例,假如你的List中有8000个数据对象,我现在要从8000个数据对象中查找一条,问怎么查找最快?

Map也是容器的一种,但是没有继承Collection接口,以键值对的形式存放数据,一个key对应一个value。key和value都是引用数据类型,我们可以通过key找到对应的value。

Map类中存储是以键--值对的形式,通过键来标识,所以不能重复。

接口Map,其中规定了Map的规范,各种方法的定义。方法如下:

Java容器介绍HashSet

常见的实现类有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