LinkedHashSet
1、在LinkedHashSet 中维护一个hash表的双向链表 LinkedHashSet有head和tail
2、每一个节点有pre和next属性这样形成一个双向链表
3、在添加一个元素先求hash值再求索引 确定该元素在hashtable的位置
然后将添加的元素加入到双向链表中如果已经存在不添加
tail.next = newElement
new,Element.pre=tail
tail = newElement
4、这样保证了 插入顺序和取出数据一致
package com.company.Collection.Set_;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSet_ {
public static void main(String[] args) {
//分析一下LinkedHashSet
Set set = new LinkedHashSet();
set.add(new String("AA"));
set.add(456);
set.add(456);
set.add(new Customer("刘",1001));
set.add(123);
set.add("ZJQ");
System.out.println("set"+set);
//1、LinkedHashSet 加入顺序和取出元素/数据顺序一致
//2、LinkedHashSet 底层维护的是一个LinkedHashMap(是hashmap的之类)
//3、LinkedHashSet 底层结构(数组+双向链表)
}
}
class Customer{
private String name;
private int age;
public Customer(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
4、初始化为
大小为16 table 初始化大小 table是node 类别
每个node节点存放的是
5、数组是
存放的节点
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
其中 Entry 继承了 HashMap.Node 继承关系是在内部类中完成的
table的 after 即 hash中entryket
练习:
比较先比较 hash值是否相同 再比较 内容是否相同
如果要确定两个对象的是否相同
//本题中 只要是名称和价格相同则认为就是对象相同
//则需要重写hashcode方法
//步骤如下
选择java7版本
选择认为相同内容就选择hash值相同的属性
package com.company.Collection.Set_;
import java.util.LinkedHashSet;
import java.util.LinkedList;
public class LinkedHashSetExercise {
public static void main(String[] args) {
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add(new Car("奥托",10000));
linkedHashSet.add(new Car("奥迪",300000));
linkedHashSet.add(new Car("法拉利",1000000000));
linkedHashSet.add(new Car("奥迪",300000));
}
}
class Car{
private String name;
private double price;
public Car(String name, double price){
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
if (Double.compare(car.price, price) != 0) return false;
return name != null ? name.equals(car.name) : car.name == null;
}
@Override
public int hashCode() {
int result;
long temp;
result = name != null ? name.hashCode() : 0;
temp = Double.doubleToLongBits(price);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}
.hashCode() : 0;
temp = Double.doubleToLongBits(price);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}