Set容器--HashSet集合

Set容器特点

①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序;

②   最常用的两个Set接口的实现类是HashSet和TreeSet;

1         HashSet<String> data=new HashSet<String>();
2         data.add("张三");
3         data.add("李四");
4         data.add("jay");
5         data.add("jack");
6         data.add("jay");
7         System.out.println(data);

输出结果:

[张三,李四,jay,jack]

此处第二个jay没有存入;

可以将其打印出来System.out.println(data.add("jay"));,结果显示第一个为true,第二个为false

编写一个Student类:

 1 class Student{
 2     private String name;
 3     private int age;
 4     public Student(String name, int age) {
 5         super();
 6         this.name = name;
 7         this.age = age;
 8     }
 9     public String getName() {
10         return name;
11     }
12     public void setName(String name) {
13         this.name = name;
14     }
15     public int getAge() {
16         return age;
17     }
18     public void setAge(int age) {
19         this.age = age;
20     }
21 }

主方法中添加及输出

1         HashSet<Student> stuSet=new HashSet<Student>();
2         System.out.println(stuSet.add(new Student("张三",20)));
3         System.out.println(stuSet.add(new Student("李四",30)));
4         System.out.println(stuSet.add(new Student("张三",20)));
5         System.out.println(stuSet.size());
6     

输出结果:

true

true

true

3

由此可见:new Student("张三",20)两次都创建了,若想字相同时只创建一次则需重构hashCode和equals方法

如下:

 1     @Override
 2     public int hashCode() {
 3         final int prime = 31;
 4         int result = 1;
 5         result = prime * result + age;
 6         result = prime * result + ((name == null) ? 0 : name.hashCode());
 7         return result;
 8     }
 9     @Override
10     public boolean equals(Object obj) {
11         if (this == obj)
12             return true;
13         if (obj == null)
14             return false;
15         if (getClass() != obj.getClass())
16             return false;
17         Student other = (Student) obj;
18         if (age != other.age)
19             return false;
20         if (name == null) {
21             if (other.name != null)
22                 return false;
23         } else if (!name.equals(other.name))
24             return false;
25         return true;
26     }

再次执行,输出结果:

true

true

false

2

总结:HashSet的内部操作的底层数据是HashMap,只是我们操作的是HashMap的key;

时间: 2024-10-16 16:08:35

Set容器--HashSet集合的相关文章

java基础之容器、集合、集合常用方法

一.容器(Collection):数组是一种容器,集合也是一种容器 java编程中,装其他各种各样的对象(引用类型)的一种东西,叫容器 注意: 1.数组的长度是固定的 2.集合:长度不固定, 可以随时添加和删除,只要不超出内存, 随便往里添加 二.集合接口(六大接口) 1.Collection(包括List接口和Set接口) List---(有顺序, 可以重复-->可以互相equals(引用类型))---下标(重复的标准就是相互equals) LinkedList(链表)---(改快,查慢) *

java 17 - 9 HashSet集合、TreeSet集合的练习

HashSet集合的练习 1 package zl_TreeSetTest; 2 /* 3 创建学生类 4 成员变量: 5 A:姓名 6 B:语文成绩 数学成绩 英语成绩 7 */ 8 public class Student { 9 private String name ; 10 private int chinese; 11 private int english; 12 private int math; 13 14 public Student() { 15 super(); 16 /

C# HashSet集合类型使用介绍

1.HashSet集合 使用HashSet可以提高集合的运算.使用HashSet集合不自带排序方法,如果需要排序的需求可以参考使用List<T>集合配合Sort方法. HashSet的优势在与运算快,作为一种存放在内存的数据,可以很快的进行设置和取值的操作.HashSet无法向里面添加重复的数据,避免添加HashSet<T>里面的数据重复.我们使用HashSet常常在集合相加集合相减这些集合与集合之间的操作之中. 使用HashSet作为内存存储的快速数据库,这个需要随时跟新Hash

JAVA学习第三十六课(常用对象API)- 集合框架(四)— Set集合:HashSet集合演示

随着Java学习的深入,感觉大一时搞了一年的ACM,简直是明智之举,Java里很多数据结构.算法类的东西,理解起来就轻松多了 Set集合下有两大子类开发常用 HashSet集合 .TreeSet集合 Set集合的元素是不重复且无序 一.HashSet集合 API文档解释:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持.它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null 元素. 此类为基本操作提供了稳定性能,注意,此实现不是同步的. 由上可

HashSet集合是如何保证元素的唯一性的?

HashSet集合的特点是元素无序和不重复 . 首先,HashSet的底层数据结构是哈希表.哈希表就是存储一系列哈希值的表,而哈希值是由对象的hashCode()方法生成的. 确保元素唯一性的两个方法,hashCode()和equals()方法. 当调用add()方法向集合中存入对象的时候,先比较此对象与原有对象的哈希值有没有一样的,如果都不一样就直接存入:如果有与之相同的哈希值,则要继续比较这两个对象是否为同一个对象,此时就要调用对象的equals()方法了. 总之,只有HashCode的至相

Set\HashSet集合为什么能去重(转)

如果想查找一个集合中是否包含有某个对象,大概的程序代码怎样写呢?当发现某个元素与要查找的对对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息.如果是一个集合中有很多元素,譬如有一万个元素,并且没有包含要查找的对象时,则意味着你的程序需要从该集合中取出一万个元素进行啄一的比较才能得到结论,有人发明了一种hashCode算法,来提高查找的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个

Java学习(set接口、HashSet集合)

一.set接口 概念:set接口继承自Collection接口,与List接口不同的是,set接口所储存的元素是不重复的. 二.HashSet集合 概念:是set接口的实现类,由哈希表支持(实际上是一个HashMap集合).HashSet集合元素的提取顺序与存储顺序不相同. 采用哈希表数据结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法. 2.1哈希表 什么是哈希表? 链表与数组的组合. 哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时

Java中的容器(集合)之HashMap源码解析

1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是一个以键值对存储的容器. hashMap底层实现为数组+链表+红黑树(链表超过8时转为红黑树,JDK7为数组+链表). HashMap会根据key的hashCode得到对应的hash值,再去数组中找寻对应的数组位置(下标). hash方法如下: static final int hash(Object key

Java中的容器(集合)

1.Java常用容器:List,Set,Map List: 继承了Collection接口(public interface List<E> extends Collection<E> ),有序且允许出现重复值. Set: 继承了Collection接口(public interface Set<E> extends Collection<E> ),无序且不允许出现重复值. Map: 是一个使用键值对存储的容器(public interface Map<