Java--哈希存储

哈希存储

接口 - Collection
- Set
- HashSet(可以去重)
- TreeSet(可以去重,还自动排序)

  • 集合,是不能够放重复元素的
  • 对集合进行遍历,不能用普通循环,因为没有get方法,集合里的元素是零散放的
public class Test01 {

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("grape");
        set.add("blueberry");
        set.add("pitaya");
        set.add("apple");
        System.out.println(set.size());
        System.out.println("========for-each循环========");
        for (String str : set) {
            System.out.print(str.hashCode() + "--->");
            System.out.println(str);
        }
        
        System.out.println("========迭代器========");
        set.remove("pitaya");
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            
        }
    }
}
  • 哈希函数
    好的哈希函数:让不同的对象尽可能产生不同的哈希码

  • 哈希存储 / 哈希函数有的地方也称之为散列存储 / 散列函数
    哈希存储只要能设计出一个好的哈希函数就是存取性能都特别好的存储方案

  • HashSet:
    如果要使用HashSet,那么一定要重写两个方法(用eclipse自动生成):

hashCode() ----> 让相同的对象产生相同的哈希码,让不同的对象尽可能产生不同的哈希码
equals()     ----> 定义比较两个对象的规则(比引用、类型、属性)
  • TreeSet:
    要使用TreeSet,那么对象必须是课比较的,因为TreeSet底层是一颗排序树
    可以通过实现Comparable接口并重写compareTo方法来实现比较的功能
class Student implements Comparable<Student>{
    private String name;
    private int age;
    
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 17;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }



    @Override
    public String toString() {
        return name + ":" + age;
    }
    @Override
    public int compareTo(Student other) {
        if (this.name.compareTo(other.name) == 0) {
            return this.age - other.age;
        }
        else {
            return this.name.compareTo(other.name);
        }
    }
}
 

class Test02 {

    public static void main(String[] args) {
        //Set<Student> set = new HashSet<>();
        Set<Student> set = new TreeSet<>();
        Student s1 = new Student("王大锤", 18);
        set.add(s1);
        set.add(new Student("Jack", 36));
        Student s2 = new Student("王大锤", 18);
        set.add(s2);
        System.out.println(set.size());
        for (Student student : set) {
            System.out.print(student.hashCode() + "--->");
            System.out.println(student);
        }
    }
}
  • 模糊查找的方法
package org.mobiletrain;

//indexOf是查找第一次出现的位置
class Test03 {

    public static void main(String[] args) {
        String string = "hello,world";
        System.out.println(string.indexOf("lo"));
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,188评论 18 399
  • 上一篇文章介绍了Set集合的通用知识。Set集合中包含了三个比较重要的实现类:HashSet、TreeSet和En...
    Ruheng阅读 15,889评论 3 57
  • Java集合框架 Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述...
    小石38阅读 2,976评论 0 0
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,772评论 0 16
  • 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include <math.h>引入m...
    壁花烧年阅读 1,832评论 0 0

友情链接更多精彩内容