Java:HashSet集合和LinkedHashSet集合(13)

Java:HashSet集合和LinkedHashSet集合(13)_第1张图片

DemoHashSet集合:

package demo29HsahSet集合;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/*
java.util.Set接口 extends Collection接口
Set接口的特点:
  1.不允许存储重复的元素
  2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
java.util.HashSet集合 implements Set接口
HashSet特点:
  1.不允许存储重复的元素
  2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
  3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
  4.底层是一个哈希表结构(查询的速度非常快的)
 */
public class DemoHahSet {
    public static void main(String[] args) {
        Set set= new HashSet<>();
        //使用add方法往集合中添加元素
        set.add(1);
        set.add(3);
        set.add(2);
        set.add(1);//不允许存储重复元素
        //使用迭代器遍历set集合
        Iterator it=set.iterator();
        while(it.hasNext()){
            Integer n=it.next();
            System.out.println(n);//1 2 3
        }
        System.out.println("===================");
        //增强for循环遍历集合
        for (Integer i : set){
            System.out.println(i);
        }
    }
}

 Java:HashSet集合和LinkedHashSet集合(13)_第2张图片

Person类:

package demo29HsahSet集合;

public class Person extends Object {//不写继承默认也会继承Object
}

hashCode类:

package demo29HsahSet集合;
/*
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际的物理地址)
在Object类有一个方法,可以获得对象的哈希值
hashCode():返回对象的哈希码值

 */
public class hashCode {
    public static void main(String[] args) {
        //Person类继承了Object类,所以可以使用Object类的hashCode
        Person P1=new Person();
        int h1=P1.hashCode();
        System.out.println(h1);//356573597

        Person P2=new Person();
        int h2=P2.hashCode();
        System.out.println(h2);//1735600054

        /*
        toString方法:
         返回:包名.类名.@十六进制地址值
         */
        System.out.println(P1);//demo29HsahSet集合.Person@1540e19d
        System.out.println(P2);
        System.out.println(P1==P2);// false,实际物理地址是不相等的

        /*
        String类的哈希值
        String类重写了Object类的hashCode方法
         */
        String s1=new String("abc");
        String s2=new String("abc");
        System.out.println(s1.hashCode());//96354
        System.out.println(s2.hashCode());//96354

        System.out.println("种地".hashCode());//988931
        System.out.println("重地".hashCode());//1179395
        System.out.println("通话".hashCode());//1179395

    }
}

 Java:HashSet集合和LinkedHashSet集合(13)_第3张图片

 Student类:

package demo29HsahSet集合;

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
 Hash自定义类型元素:
package demo29HsahSet集合;

import java.util.HashSet;

/*
HashSet存储自定义类型元素
set集合保证元素唯一: 哈希值 和内容相同才认定是同一个元素,如果哈希值相同,内容不同则是不同元素

  存储元素(String、Interger、..Student)必须重写hashCode方法和equals方法
  要求:
    同名年龄的人,视为同一个人,只能存储一次
 */
public class Hash自定义类型元素 {
    public static void main(String[] args) {
        //创建HashSet集合存储Person
        HashSet set=new HashSet<>();
        Student p1=new Student("小美女",18);
        Student p2=new Student("小美女",18);//如果没有重写hasCode方法和equals方法,相同的会存储进去
        Student p3=new Student("小美女",19);
        System.out.println(p1.hashCode());//734175839,重写方法了哈希值相同
        System.out.println(p2.hashCode());//734175839

        System.out.println(p1==p2);//比较对象地址false
        System.out.println(p1.equals(p2));//true 哈希值相同,equals返回true
        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println(set);

    }
}

Java:HashSet集合和LinkedHashSet集合(13)_第4张图片

 DemoLinkedHashSet集合:

package demo30LinkedHashSet集合;

import java.util.HashSet;
import java.util.LinkedHashSet;

/*
java.util.linkedHashSet集合 extends HashSet集合
linkedHashSet集合特点:
  底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序,保证元素有序)
 */
public class DemoLinkedHashSet {
    public static void main(String[] args) {
        HashSet set=new HashSet<>();
        set.add("www");
        set.add("aaa");
        set.add("bbb");
        System.out.println(set);//[aaa, bbb, www],无序,不允许重复

        LinkedHashSet linked=new LinkedHashSet<>();
        linked.add("www");
        linked.add("aaa");
        linked.add("bbb");
        System.out.println(linked);//[www, aaa, bbb] 有序,不允许重复
    }
}

Java:HashSet集合和LinkedHashSet集合(13)_第5张图片

 

你可能感兴趣的:(java基础知识,java,蓝桥杯,开发语言)