java set接口

Hashset集合是set接口的子类

底层是一个哈希表,不能存储重复的元素,通过hashcode方法和equals方法来保证数据的唯一性。取出数据时,不能保证数据的顺序和存入数据的顺序一致

hashcode方法用来比较2个元素的哈希值,如果哈希值一样,就调用equals方法,比较元素的内容是否一样

什么是哈希表呢? 

哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。

当哈希值一样的时候,内容不一样的时候就会存储在同哈希值链表的下面。

1 public static void method01(){
2         HashSet<String> set =new HashSet<String>();
3         set.add("abc");
4         set.add("abc");
5         System.out.println(set);
6     }

HashSet存储自定义元素

HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

1 public static void method03(){
2         HashSet<Person> set =new HashSet<Person>();
3         set.add(new Person("a",20));
4         set.add(new Person("b",30));
5         set.add(new Person("c",40));
6         for(Iterator it =set.iterator();it.hasNext();){
7             System.out.println(it.next());
8         }
9     }
 1 package com.orcale.demo01;
 2 
 3 public class Person {
 4     private String name;
 5     private  int age;
 6     public Person(){};
 7     public Person(String name, int age) {
 8         this.name = name;
 9         this.age = age;
10     }
11     public String getName() {
12         return name;
13     }
14     public void setName(String name) {
15         this.name = name;
16     }
17     public int getAge() {
18         return age;
19     }
20     public void setAge(int age) {
21         this.age = age;
22     }
23     public String toString() {
24         return "Person [name=" + name + ", age=" + age + "]";
25     }
26     public boolean equals(Object obj) {   //重写equals方法,先判断这2个的值是否一样,再判断这个值是不是空的,
                            如果都不是就判断这个值是不是Person类,因为是obj类父类,所有要向下转型,然后判断值是否一样
27 if(this==obj){ 28 return true; 29 } 30 if(obj==null){ 31 return false; 32 } 33 if(obj instanceof Person){ 34 Person p=(Person) obj; 35 return name.equals(p.name)&&age==p.age; 36 } 37 return false; 38 } 39 40 public int hashCode() { 41 final int prime = 31; 42 int result = 1; 43 result = prime * result + age; 44 result = prime * result + ((name == null) ? 0 : name.hashCode()); 45 return result; 46 } 47 }

LinkedHashSet集合是HashSet集合的子类,他取出数据的顺序和存入数据的顺序是一致的,数据也是唯一性

1 public static void method05(){
2         LinkedHashSet<Integer> set=new LinkedHashSet<Integer>();
3         set.add(1);
4         set.add(2);
5         set.add(3);
6         for(Integer i:set){
7             System.out.println(i);
8         }
9     }

 

猜你喜欢

转载自www.cnblogs.com/wangrongchen/p/9122461.html
今日推荐