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

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

猜你喜欢

转载自www.cnblogs.com/dshore123/p/9068474.html