hashset: 1.//遍历 和存储顺序不一致 对迭代顺序不做保证 2.set集合不包含重复元素 3.哈希值:根据地址或者字符串或数字算出来的int类型数值 Object类中的hashCode()可以获得哈希值 4. 保证HashSet元素唯一性通过 重写hashCode()和equals()方法实现 hash 表存入时依赖于对象的 hashcode 和equals()方法 可以对其进行重写 5.Hash表存储元素:(jdk8之前,数组+链表实现 一个以链表为元素的数组)(jdk8之后,在长度较长时,实现了优化) ①算元素的hash值 ②创建一个长度为16的哈希表(链表数组) ③hash%16得到存储位置 ④判断哈希值和内容是否相同 6.LinkedHashset (哈希表和链表实现的set集合、可预测迭代顺序)
package com.demo11;
import java.util.HashSet;
import java.util.LinkedHashSet;
public class Demo {
public static void main(String[] args) {
//遍历 和存储顺序不一致 对迭代顺序不做保证
/* System.out.println("--------");
System.out.println("种地".hashCode());
System.out.println("通话".hashCode());
HashSet<String> s=new HashSet<String>();
s.add("100");*/
/* 哈希表
HashSet<Student> set=new HashSet<Student>();
Student s1= new Student("C罗","36");
Student s2= new Student("梅西","34");
Student s3= new Student("内马尔","29");
Student s4= new Student("哈兰德","21");
Student s5= new Student("穆勒","32");
Student s6= new Student("穆里尼奥","48");
Student s7= new Student("梅西","34");
//add
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
set.add(s7);
*//* System.out.println(s1.hashCode());//764977973 764977973同一个值多次调用hashcode 算出来的值一致;
System.out.println(s1.hashCode());
System.out.println("--------");
System.out.println(s2.hashCode());//默认情况下,不同对象的hash值不同,但通过方法重写可以实现哈希值是相同的;*//*
for(Student s:set){
System.out.println(s.getName()+"----"+s.getAge());
}*/
LinkedHashSet<String> lhs=new LinkedHashSet<String>();
lhs.add("C罗");
lhs.add("梅西");
lhs.add("内马尔");
lhs.add("内马尔");
for(String s:lhs){
System.out.println(s);
}
}
}
Student类
package com.demo11;
/*this 关键字;
用this 修饰后表示成员变量;用this指代后表示成员变量;
解决局部变量隐藏成员变量;
在方法中区分局部和成员变量*/
/*application progranming interfing
* java API JDK中提供的Java类 在底层中被封装了起来
* 可查看JDk汉化帮助文档
* Java.lang下的函数是不需要导入包的
* 查看api 返回值 方法名 参数 描述
* */
public class Student {
//属性
private String name;
private String age;
private String sid;
private String address;
//方法
//构造方法 在生成对象的时候调用
public Student() { System.out.println("无参构造方法"); }
//重载
public Student(String name, String age) {
this.sid=sid;
this.address=address;
this.name = name;
this.age = age;
}
//重载
public Student(String sid, String name, String age, String address) {
this.sid=sid;
this.address=address;
this.name = name;
this.age = age;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public void doHomework() {
System.out.println("做作业");
}
public void study() {
System.out.println("学习");
}
public String getAge() {
return age;
}
public void setAge(String age) {
int age1=Integer.parseInt(age);
if (age1 > 0 || age1 < 120) {
this.age = age;
} else {
System.out.println("年龄有误!");
}
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAddress(String address){ this.address =address; }
public String getAddress() {return this.address; }
public void show() {
System.out.println(this.sid+"---"+this.name + "---" + this.age+"岁"+"---"+this.address);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (name != null ? !name.equals(student.name) : student.name != null) return false;
if (age != null ? !age.equals(student.age) : student.age != null) return false;
if (sid != null ? !sid.equals(student.sid) : student.sid != null) return false;
return address != null ? address.equals(student.address) : student.address == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (age != null ? age.hashCode() : 0);
result = 31 * result + (sid != null ? sid.hashCode() : 0);
result = 31 * result + (address != null ? address.hashCode() : 0);
return result;
}
}