java基础33 Set集合下的HashSet集合和TreeSet集合

集合的体系:

---------| collection  单例集合的根接口
--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合中的有序不是指自然顺序,而是指添加进去的顺序与出来的顺序是一致的
------------------| ArrayList  ArrayList底层维护了一个object数组的实现的。(线程不安全),特点:查询速度快,增删速度慢。有序,可重复
------------------| LinkedList  LinkedList底层是使用链表结构实现的,特点:查询速度慢,增删速度快。有序,可重复
------------------| Vector(了解即可)  底层也是维护一个Object数组的实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低
--------------| Set  如果实现了set接口的集合类,具备的特点:无序,不可重复     注:集合中的无序不是指自然顺序,而是指添加元素进去的顺序与元素出来的顺序是不一致的
------------------| HashSet  Set接口的实现,特点:没有特定的顺序,不允许有重复的元素。
------------------| TreeSet   Set接口的实现,特点:没有特定的顺序,不允许有重复的元素。

1、HashSet 集合

HashSet集合是Set接口(集合)的一个实现;集合中的元素:无序,且不可重复性

1.1、HashSet 集合常用方法

add(Object):将指定的元素添加到集合中
    remove(object):从HashSet集合中移除指定的元素
    size():返回当前集合中元素的个数
    iterator():返回此集合中的元素的迭代器
    toArray():返回一个包含此集合中所有元素的数组    相当于把集合转换成数组的形式
    contain(object):判断某元素是否在HashSet集合中(包含关系)

其实这几个集合的常用方法几乎一样,比如 collection集合的一些常用方法

1.2、HashSet 集合不能添加重复元素的原理

当调用add(Object)方法添加元素的时,首先会调用Object的hashCode方法判哈希码是否已经存在,如不存在则直接插入元素;如果已存在,则再去调用Object对象的equals()方法,判断是否返回true,如果为true则说明元素已经存在,就不能再往HashSet集合中添加元素了;如为返回false,则说明元素不存在,可以继续往HashSet集合中插入元素。

1.3、实例

 1 package com.dhb.collection;
 2
 3 import java.util.HashSet;
 4
 5 /**
 6  * @author DSHORE / 2018-5-21
 7  *
 8  */
 9 /* HashSet的实现原理:往HasSet添加元素的时候,会先调用hashCode方法得到元素的咍希值,然后通过元素的哈希值经过移运算,就可以算出该元素存储在咍希表的存储位置。
10  *  1、如果算出该元素哈希码值的存储位置处还没有任何的元素,那么该元素可以直接存储到该位置上
11  *  2、如果算出该元素哈希码值的存储位置处已经有元素了,那么就会调用该元素的equals方法与该位置的元素做一次比较,如果equals返回值是true,那么该元素与这个位置已经存在的元素就被视为重复元素,不允许再添加了;如果equals返回的是false,那么该元素还可以添加进集合里。
12  * */
13 class Personer{
14     int id;
15     String name;
16
17     public Personer(int id,String name) {
18         this.id=id;
19         this.name=name;
20     }
21     @Override
22     public String toString() {//重写toString()的作用:让返回值以字符串的形式输出;若不重写,返回值则是内存地址
23         return "Person [id=" + id + ", name=" + name + "]";
24     }
25     @Override
26     public int hashCode() {//重写hashCode()的作用:只通过id来作判断
27         System.out.println("========HashCode========");//输出了5遍   原因:只要add()多少次,hashCode()就运行多少遍。
28         return id;
29     }
30     @Override
31     public boolean equals(Object obj) {//重写equals()的作用:用id来判断是否是同一个元素
32         System.out.println("======这是equals方法========");//输出了一遍  原因:只需要进行判断的元素,equals()才运行。 如:只有狗娃处,才需要判断(因为只与id有关)
33         Personer p=(Personer)obj;
34         return this.id==p.id;
35     }
36 }
37 public class Demo11 {
38
39     public static void main(String[] args) {
40         HashSet<Personer> set=new HashSet<Personer>();//<Personer>:表示泛型
41         set.add(new Personer(110,"狗娃"));
42         set.add(new Personer(120,"狗剩"));
43         set.add(new Personer(119,"狗蛋"));
44         set.add(new Personer(1000,"狗蛋"));
45
46         //假设只要编号一致,就是同一个人
47         System.out.println("添加元素成功了吗? "+set.add(new Personer(110, "狗娃")));//返回值:false   如果不重写equals()方法,那么返回值为true。原因在代码最上面
48         System.out.println(set);//返回值:[Person [id=119, name=狗蛋], Person [id=110, name=狗娃], Person [id=10000, name=狗蛋], Person [id=120, name=狗剩]]
49     }
50 }

例2

 1 package com.dhb.collection;
 2
 3 /**
 4  * @author DSHORE / 2018-5-21
 5  *
 6  */
 7 public class Demo13 {
 8     public static void main(String[] args) {
 9         String str1="hello";
10         String str2=new String("hello");
11         System.out.println("两个是同一个对象?"+(str1==str2));//返回值:false
12         System.out.println("str1的hasCode:"+str1.hashCode());//返回值:99162322
13         System.out.println("str2的hasCode:"+str2.hashCode());//返回值:99162322
14         /*
15          * HashCode默认情况下表示的内存地址,String类已经重写了Object的hasCode方法
16          * 注意:如果两个字符串的内容一致,那么返回的hashCode码也会一致
17          * */
18     }
19 }

2、TreeSet 集合

TreeSet集合也是Set接口(集合)的一个实现;集合中的元素:无序,且不可重复性

2.1、


原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/9068474.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

原文地址:https://www.cnblogs.com/dshore123/p/9068474.html

时间: 2024-10-10 00:45:03

java基础33 Set集合下的HashSet集合和TreeSet集合的相关文章

JavaSE入门学习7:Java基础语法之语句(下)

继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for. (5)Java循环语句之while 语法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 运行

Java基础之路(一)下--引用数据类型之数组

上次我们说了java的基础数据类型,今天我们就来说一下引用数据类型中的数组. 什么是数组 数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合. 数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引(下标)从0开始. 数组的定义 第一种方式:类型[] 数组名; 如 int[] nums;  第二种方式:类型数组名[]; 如 int nums[]; 大多数Java程序员喜欢使用第一种风格,因为它把数据类型int[],和变量名num分开了. 数组的初始化 J

java基础学习_面向对象(下)01_day08总结

==========================================================================================================================================================涉及到的知识点有:1:继承(掌握) (0)Java继承概述 (1)继承定义 (2)Java中如何表示继承呢?格式是什么呢? (3)继承的好处 (4)继承的弊端 A:让类的耦合性增强.这样某个类

Java中list集合和set集合遍历的区别

public static void main(String[] args) {        List list=new ArrayList();        list.add(1);        list.add(2);        list.add(2);        list.add(4);        for(Object i:list){            System.out.println(i);        }    } public static void m

【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean

Dao层代码: 1 package com.it.dao; 2 3 public interface SayHell { 4 public void sayHello(); 5 } Dao的Impl实现层: 1 package com.it.dao.impl; 2 3 import java.util.List; 4 import java.util.Map; 5 6 import com.it.dao.SayHell; 7 8 /** 9 * Spring如何知道setter方法?如何将值注入

.NET基础拾遗(3)字符串、集合和流

一.字符串处理 1.1 StringBuilder类型有什么作用? 众所周知,在.NET中String是引用类型,具有不可变性,当一个String对象被修改.插入.连接.截断时,新的String对象就将被分配,这会直接影响到性能.但在实际开发中经常碰到的情况是,一个String对象的最终生成需要经过一个组装的过程,而在这个组装过程中必将会产生很多临时的String对象,而这些String对象将会在堆上分配,需要GC来回收,这些动作都会对程序性能产生巨大的影响.事实上,在String的组装过程中,

.NET基础拾遗(3)字符串、集合和流2

二.常用集合和泛型 2.1 int[]是值类型还是引用类型? .NET中无论是存储值类型对象的数组还是存储引用类型的数组,其本身都是引用类型,其内存也都是分配在堆上的.所有的数组类型都继承自System.Array,而System.Array又实现了多个接口且直接继承自System.Object.. 不同之处则在于存储值类型对象的数组所有的值都已经包含在数组内,而存储引用类型对象的数组,其值则是一个引用,指向位于托管堆中的实例对象. 下图直观地展示了二者内存分配的差别(假设object[]中存储

Set集合和Map集合

Set集合元素无序 (元素存取顺序不一致),元素不重复.Set集合保证元素的唯一性是靠重写HashCode()方法和equals()方法.SetHashSet,LinkedHashSet,TreesetHashSet:此类实现Set接口,由哈希表(实际是是一个HsahMap实列)支持它不保证Set的迭代顺序;特别是他不保证该顺序恒久不变.此类允许使用null元素.底层的数据结构是哈希表,线程不安全,效率高,允许存储null元素,元素无序且唯一.唯一性:是要靠元素重写HashCode()和equa

.NET基础拾遗(3)字符串、集合和流3

三.流和序列化 3.1 流的概念以及.NET中有哪些常见的流? 流是一种针对字节流的操作,类似于内存与文件之间的一个管道.读取文件的过程就可以看作是字节流的一个过程. 常见的流类型包括:文件流.终端操作流及网络Socket等,在.NET中,System.IO.Stream类型被设计为作为所有流类型的虚基类,当需要自定义一种流类型时也应该直接或者间接地继承自Stream类型.下图展示了在.NET中常见的流类型以及它们的类型结构: 从上图中可以发现,Stream类型继承自MarshalByRefOb