哈希存储
接口 - 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"));
}
}