Java基础之:Set——HashSet——LinkedHashSet
LinkedHashSet简单介绍
LinkedHashSet是HashSet的子类
LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
LinkedHashSet添加性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。(因为底层维护了一个hash表+双向链表)
LinkedHashSet底层是一个LinkedHashMap,维护的链表是一个双向链表。
使用案例:
package class_TreeSet_LinkedHashSet;import java.util.LinkedHashSet;import java.util.Set;public class ClassTest02_LinkedHashSet { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { Set set = new LinkedHashSet(); set.add(new String("AA")); set.add(456); set.add(456); set.add(new Customer("刘",1001)); set.add(123); System.out.println(set); }}class Customer{ private String name; private int id; public Customer(String name, int id) { super(); this.name = name; this.id = id; } @Override public String toString() { return "Customer [name=" + name + ", id=" + id + "]"; }}
案例说明:
在LinkedHastSet 中维护了一个hash表和双向链表( LinkedHashSet 有 head 和 tail )
每一个节点有 pre 和 next 属性, 这样可以形成双向链表。
在添加一个元素时,先求hash值,在求索引., 确定该元素在hashtable的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加[原则和hashset一样])。
这样的话,我们遍历LinkedHashSet 也能确保插入顺序和遍历顺序一致。
简单使用案例
使用的Car 类(属性:name,price), 需要重写hashCode和equlas 方法. 如果 name 和 price 一样,就不能加入到LinkedHashSet
package class_TreeSet_LinkedHashSet;import java.util.LinkedHashSet;public class ClassWork01 { @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { Car car1 = new Car("蔚来SE",460000); Car car2 = new Car("吉普",660000); Car car3 = new Car("蔚来SE",460000); LinkedHashSet linkedHashSet = new LinkedHashSet(); linkedHashSet.add(car1); linkedHashSet.add(car2); linkedHashSet.add(car3); for(Object obj:linkedHashSet) { System.out.println(obj); } }}class Car{ private String name; private double price; public Car(String name, double price) { super(); this.name = name; this.price = price; } @Override public String toString() { return "Car [name=" + name + ", price=" + price + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } //可以自己定义对比机制,也可以系统生成。 //alt + shift + s --> h //右键 --> Source --> Generate hashCode() and equals() @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); long temp; temp = Double.doubleToLongBits(price); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Car other = (Car) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price)) return false; return true; }}
原文转载:http://www.shaoqun.com/a/504090.html
heap:https://www.ikjzd.com/w/2012
墩煌网:https://www.ikjzd.com/w/189
Java基础之:Set——HashSet——LinkedHashSetLinkedHashSet简单介绍LinkedHashSet是HashSet的子类LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。LinkedHashSet添加性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。(
米谷:米谷
菜鸟网络:菜鸟网络
三亚槟榔谷十一国庆节门票有优惠吗?国庆节槟榔谷优惠政策?:三亚槟榔谷十一国庆节门票有优惠吗?国庆节槟榔谷优惠政策?
2020年深圳车展举办地点在哪里呢?:2020年深圳车展举办地点在哪里呢?
亚马逊预计将于10月初成为全球首家市值破万亿美元公司!:亚马逊预计将于10月初成为全球首家市值破万亿美元公司!
No comments:
Post a Comment