package com.asse.ljb;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
/**
* 1.set集合不允许添加相同的元素
* 2.使用equals(),比较set是否相同
* 3.HashSet 是 Set 接口的典型实现类,大多数时候使用 Set 集合时都使用这个实现类。
* 4.HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
* 5.HashSet 具有以下特点:
* 不能保证元素的排列顺序
* HashSet 不是线程安全的
* 集合元素可以使用 null
*/
public class SetTest {
public static void main(String[] args) {
System.out.println("------Set用法--------");
Set set = new HashSet();
set.add("abc");
set.add(123);
set.add(456);
System.out.println("重复加入123:" + set.add(123));//添加重复元素时为false,不能添加
System.out.println("输出所有元素");
for (Object o : set) {//foreach输出所有元素
System.out.println(o);
}
Set set2 = new HashSet();
set2.add(123);
set2.add("abc");
set2.add(456);
System.out.println("==方法判断相等是不对的:" + (set == set2));//此方法不对
System.out.println("equals()方法判断set,set2是否相同:" + set.equals(set2));//判断set,set2是否相同
System.out.println("添加null:" + set2.add(null));//集合元素可以null
for (Object object : set2) {
System.out.println(object);
}
System.out.println("--------------");
//hashset用法
System.out.println("---hashset用法------------");
HashSet hs = new HashSet();
hs.add(123);
hs.add("abc");
System.out.println("hs hashcode:" + hs.hashCode());//哈希码值
HashSet hs2 = new HashSet();
hs2.add(123);
hs2.add("abc");
System.out.println("hs2 hashcode:" + hs2.hashCode());//哈希码值
System.out.println("hs.equals(hs2):" + hs.equals(hs2));//两个hashset对象是否相同
System.out.println();
System.out.println("hs add null");
hs.add(null);//hashset可以储存null
System.out.println("hs hashcode:" + hs.hashCode());
System.out.println("hs2 hashcode:" + hs2.hashCode());
System.out.println("hs.equals(hs2):" + hs.equals(hs2));
System.out.println("输出hs");
hs.add("cde");
hs.add("123");
for (Object object : hs) {
System.out.println(object);
}
/**
* TreeSet用法
* 1.TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
* 2.按大小排序储存
* 3.
*/
System.out.println("-------TreeSet用法---------");
TreeSet ts = new TreeSet();
ts.add("abc");
ts.add("cde");
ts.add("efg");
ts.add("aac");
ts.add("xyz");
System.out.println("按大小有顺序输出");
for (Object object : ts) {//输出是有顺序的
System.out.println(object);
}
System.out.println("输出第一个元素 :" + ts.first());
System.out.println("输出最后一个元素:" + ts.last());
System.out.println("输出比abc大一个的元素:" + ts.lower("abc"));
System.out.println("输出比abc小一个的元素:" + ts.higher("abc"));
System.out.println("----headSet------");
System.out.println("输出cde的头部(不包括cde)及cde前面的元素");
for (Object object : ts.headSet("cde")) {
System.out.println(object);
}
System.out.println("-------tailSet--------");
System.out.println("输出cde的尾部(包括cde)及cde后面的元素");
for (Object object : ts.tailSet("cde")) {
System.out.println(object);
}
/**
* LinkedHashSet用法
* 1. LinkedHashSet 是 HashSet 的子类
* 2.LinkedHashSet 集合根据元素的 hashCode 值来决定元素的存储位置
* 但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
* 3. LinkedHashSet 性能插入性能略低于 HashSet
* 但在迭代访问 Set 里的全部元素时有很好的性能。
* 4.LinkedHashSet 不允许集合元素重复。
*/
System.out.println("-------LinkedHashSet用法------------");
LinkedHashSet lhs = new LinkedHashSet();
lhs.add("abc");
lhs.add("123");
lhs.add("cde");
System.out.println("按插入的顺序输出");
for (Object object : lhs) {//输出顺序是插入顺序
System.out.println(object);
}
System.out.println("再次添加123:" + lhs.add("123"));
LinkedHashSet<Car> lhsEmp = new LinkedHashSet<Car>();
lhsEmp.add(new Car("stn"));
lhsEmp.add(new Car("dz"));
lhsEmp.add(new Car("lsls"));
}
}
class Car{
String name;
public Car(String name) {
this.name = name;
}
}