HashSet:位于java.util包下

1 HashSet概述

特点:作为Set集合的一种,首先是无序的,不可重复的;允许存放null值;底层封装HashMap;实现是不同步的,线程不安全;

常用构造:

public HashSet() :构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。

常用方法:

1)添加功能

boolean  add(E e)  : 如果此 set 中尚未包含指定元素,则添加指定元素

2)判断功能

boolean  isEmpty(): 如果此 set 不包含任何元素,则返回 true。

boolean contains(Object o): 如果此列表中包含指定的元素,则返回 true

3)获取功能

int size() : 返回此 set 中的元素的数量(set 的容量)。

4)删除功能

void clear() :移除此列表中的所有元素。注意:此方法比较暴力,一般不使用。

boolean remove(Object o):如果指定元素存在于此 set 中,则将其移除。

5)迭代器功能

public Iterator iterator() 返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。

2 HashSet的使用

1)使用HashSet存储字符串:如何实现存储元素的唯一性??

package SetTest;

import java.util.HashSet;

import java.util.Set;

public class HashSetDemo1 {

public static void main(String[] args) {

Set set = new HashSet();

set.add("java");

set.add("js");

set.add("sql");

set.add("java");

set.add("js");

set.add("jquery");

for(String s:set){

System.out.println(s);

}

}

}

输出结果:

java

js

jquery

sql

分析:

1)通过查看add()方法的源码,底层是使用HashMap的put()方法实现元素的存取,继续查看put存储元素的源码,可知要保证存储元素的唯一性依赖于元素的equals和hashCode方法的实现,首先看hashCode方法,如果存在hash值和待存储元素的hash值相等的元素,则继续通过equals方法比较二者。如果相等则不存储。

2)由于String类重写了equals()和hashCode()方法: 这两个方法都是依赖于String对象的内容》》只有字符串内容一样就认为是相等的,不会在集合中存储。

public int hashCode() {

int h = hash;

if (h == 0 && value.length > 0) {

char val[] = value;

for (int i = 0; i < value.length; i++) {

h = 31 * h + val[i];   //hash值的生成依赖于字符串的内容

}

hash = h;

}

return h;

}

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {    //判断两个字符串是否相等,依赖于字符串的内容是否一样

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

同样在存储其他基本类型的装箱类型也可以实现存储元素的唯一性,因为这些装箱类型也实现了equals()和hashCode()方法。(如Integer,Character等)

2)使用HashSet存储自定义对象:如何保证存储元素的唯一性(此处我们认为Student的name和age相等就意味着元素相等)

package SetTest;

public class Student {

private String name;

private int age;

public Student(String name,int age){

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Student [name=" + name + ", age=" + age + "]";

}

@Override

public int hashCode() {

int hash = name.hashCode()+age;

return hash;

}

@Override

public boolean equals(Object obj) {

if(this==obj)

return true;

if(obj instanceof Student){

Student stu = (Student)obj;

if(stu.getName().equals(name) && stu.getAge()==age)

return true;

}

return false;

}

}

package SetTest;

import java.util.HashSet;

import java.util.Set;

public class HashSetTest {

public static void main(String[] args) {

Set set = new HashSet();

Student stu1 = new Student("hu",12);

Student stu2 = new Student("wen",27);

Student stu3 = new Student("rt",12);

Student stu4 = new Student("you",15);

Student stu5 = new Student("hu",12);

Student stu6 = new Student("te",17);

Student stu7 = new Student("wen",27);

set.add(stu1);

set.add(stu2);

set.add(stu3);

set.add(stu4);

set.add(stu5);

set.add(stu6);

set.add(stu7);

for(Student s:set){

System.out.println(s.getName()+"------"+s.getAge());

}

}

}

输出结果:

te------17

hu------12

wen------27

rt------12

you------15

分析:

从输出结果可知,此集合的存储保证了元素的唯一性,主要是因为我们在自定义类中重写了equals和hashCode方法。

总结:

要想在hashSet集合中实现元素存取的唯一性,由于底层判断依赖于equals和hashCode方法,故所存取的元素需要重写这两个方法,以按照我们的期待存取元素。保证元素唯一性。

重新强调下:

hashCode和equals方法的使用概念非常重要:不仅可以用于set还可以用于map。

1)使用java系统类,如String/Date/或者数字包装类(Integer/Float),不必重写hashCode和equals方法。

2)如果要在set或者map中添加自定义类的实例,就要确保equals和hashCode方法能正常工作,否则代码可能出现无法预料的结果

HashSet和其子类LinkedHashSet的区别:

简单的例子:

HashSet set1 = new HashSet();

Student stu1 = new Student("wen",12);

Student stu2 = new Student("di",15);

Student stu3 = new Student("wu",13);

Student stu4 = new Student("yy",14);

Student stu5 = new Student("fr",16);

Student stu6 = new Student("vc",11);

Student stu7 = new Student("aw",10);

set1.add(stu1);

set1.add(stu2);

set1.add(stu3);

set1.add(stu4);

set1.add(stu5);

set1.add(stu6);

set1.add(stu7);

System.out.println("-----------------HashSet----------------------");

for(Student stu:set1){

System.out.println(stu.getName()+"-----------"+stu.getAge());

}

System.out.println("-----------------LinkedHashSet----------------------");

LinkedHashSet set2 = new LinkedHashSet();

set2.add(stu1);

set2.add(stu2);

set2.add(stu3);

set2.add(stu4);

set2.add(stu5);

set2.add(stu6);

set2.add(stu7);

for(Student stu:set2){

System.out.println(stu.getName()+"-----------"+stu.getAge());

}

输出结果是:

-----------------HashSet----------------------

wu-----------13

yy-----------14

vc-----------11

wen-----------12

di-----------15

fr-----------16

aw-----------10

-----------------LinkedHashSet----------------------

wen-----------12

di-----------15

wu-----------13

yy-----------14

fr-----------16

vc-----------11

aw-----------10

LinkedHashSet的功能与HashSet类似,毕竟是其子类。

有一个重要的区别:LinkedHashSet返回的元素顺序是可以预测的,即元素添加到集合的顺序。

该功能可以用来快速查找并判断集合中是否包含指定对象,或者用于检索元素并按照元素的添加顺序返回元素。

java hashset char_java集合之HashSet相关推荐

  1. java使用hashset_Java集合(二)HashSet的使用

    HashSet和TreeSet都实现了Collection下的Set接口,他们实现的原理分别是HashMap和TreeMap,基本的数据结构是哈希表和Red-Black Tree package co ...

  2. 常见的数据结构:栈 队列 数组 链表 红黑树——List集合 _ HashSet集合、可变参数 collections集合 Map集合

    2021-06-07复习java 一.常见的数据结构 栈(先进后出) 队列 数组 链表 红黑树 二.List集合_介绍&常用方法 ArrayList集合 Linkedlist集合 三.Hash ...

  3. Java中Set集合的用法

    java.util.Set 接口 extends Collection接口 1.Set接口的特点: (1)不允许存储重复的元素. (2)没有索引,没有带索引的方法,也不能使用普通的for循环遍历. 2 ...

  4. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:工匠初心 cnblogs.com/LiaHon/p/1125 ...

  5. java基础---集合之HashSet

    Set接口   HashSet  *  *java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,      * 它与Collection接口中的方法 ...

  6. java ee是什么_死磕 java集合之HashSet源码分析

    问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...

  7. JAVA集合Set之HashSet详解_Java基础———集合之HashSet详解

    1.HashSet简介 Set是一个继承于Collection的接口,即Set也是集合中的一种.Set是没有重复元素的集合. HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素, ...

  8. java输出set集合元素_java Set集合,HashSet类详细介绍

    下面要给大家介绍的就是java Set集合方面的内容,本文主要讲到了HashSet类的一些知识,主要包括了HashSet类的特点,HashSet 类的常用构造方法重载形式以及代码演示了创建两种不同形式 ...

  9. JAVA Hashset求集合的交集并集差集

    JAVA Hashset求集合的交集并集差集 Hashset是Set接口较为常见的一个子类,该子类的最大特点是不允许保存重复的元素,并且所有的内容都采用散列(无序)的方式进行存储. package c ...

最新文章

  1. 在Ubuntu 12.04 64bit上搭建Crtmpserver视频直播服务
  2. 马斯克39页火星计划PPT曝光,我们能学到什么
  3. 7. PowerShell -- Provider,数据操作和注册表操作
  4. error LNK2019: 无法解析的外部符号 public: virtual void * __thiscall
  5. Kruskal算法的C语言程序
  6. 互联网到了什么程度?
  7. js中遍历注册事件时索引怎么获取
  8. java varbinary_SQL 中存放 varbinary型数据
  9. “约见”面试官系列之常见面试题之第一百零二篇之vue-router的两种模式(建议收藏)
  10. Can't process attribute android:fillColor=@color/gray,添加vector属性报错解决方法
  11. end to end testing
  12. 如何用木板做桥_为这份动手能力点赞!旧木板打磨后做成橱柜,效果可媲美定制的...
  13. 用户登入验证码代码示例
  14. Qt视频直播软件--项目实战(Day3)
  15. 最新谷歌GOOGLE搜索命令大全
  16. MySQL函数及用法
  17. 基于MATLAB的分子相互作用的表征模型
  18. 物理:相量代数式和相量极坐标式的互相转换
  19. 一、响应式编程基本介绍
  20. Received empty response from Zabbix Agent at [agent]. Assuming that agent dropped connection because

热门文章

  1. [LeetCode] 144. Binary Tree Preorder Traversal Java
  2. 转:Java NIO系列教程(二) Channel
  3. php之面向对象(2)
  4. [转]Winform不规则窗体的实现心得
  5. JAVA通过调用数据库函数调用存储过程
  6. [导入]屏蔽相应键盘按钮
  7. rocketmq集成boot
  8. Tree Restoration Gym - 101755F (并查集)
  9. MySQL忘记密码解决方案
  10. hibernate之初学复合主键