Set 接口
概念
- 元素有序,以某种规则保证存入的元素不出现重复
- 主要有两个实现类:HashSet 和 TreeSet 。
HashSet 根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取、查找功能
TreeSet 以二叉树的方式存取元素,可以实现对集合中的元素进行排序
HashSet
存储的元素不可重复,并且元素无序
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("hello");
set.add("hi");
set.add("hello");
set.add("ABC");
for(Object x:set){
System.out.println(x);
}
}
对于自定义类型对象存入 HashSet 要重写 hashCode() 和 equals() 方法
class Per{
public int id;
public String name;
public Per(int id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return id+": " + name ;
}
@Override
public int hashCode() {
return Objects.hashCode(id);
//return Objects.hash(id,name);
}
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(obj == null || getClass() != obj.getClass()){
return false;
}
Per p = (Per) obj;
return id == p.id && Objects.equals(id,p.id);
}
}
public class demoTest {
public static void main(String[] args) {
HashSet set = new HashSet();
Per p1 = new Per(1,"张三");
Per p2 = new Per(2,"李四");
Per p3 = new Per(3,"王五");
Per p4 = new Per(2,"李四");
Per p5 = new Per(2,"赵六");
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
System.out.println(set);
}
}
TreeSet
内部采用平衡二叉树来存储元素,集合中元素不可重复,并且元素有序
public static void main(String[] args) {
TreeSet t = new TreeSet();
t.add(1);
t.add(3);
t.add(4);
t.add(2);
System.out.println(t);
System.out.println("首元素:"+ t.first());
System.out.println("尾元素:"+ t.last());
System.out.println("集合中小于或等于2的最大的一个元素:"+t.floor(2));
System.out.println("集合中大于2的最小的元素:"+t.higher(2));
t.pollFirst();
System.out.println("删除第一个元素后:"+t);
}
自然排序
向 TreeSet 集合中存储的元素所在类必须实现 Comparable 接口,并且重写 compareTo() 方法,默认进行升序排序
class Per implements Comparable{
public int id;
public String name;
public Per(int id,String name){
this.id = id;
this.name = name;
}
@Override
public String toString(){
return id+": " + name ;
}
@Override
public int compareTo(Object o) {
Per p = (Per) o;
if(this.id - p.id > 0){
return 1;
}
if(this.id - p.id == 0){
return this.name.compareTo(p.name);
}
return -1;
}
}
public class demoTest {
public static void main(String[] args) {
TreeSet t = new TreeSet();
Per p1 = new Per(1,"张三");
Per p2 = new Per(2,"李四");
Per p3 = new Per(3,"王五");
Per p4 = new Per(2,"李四");
t.add(p1);
t.add(p2);
t.add(p3);
t.add(p4);
System.out.println(t);
}
}
Map 接口
概念
Map 接口是一种双列集合,每个元素都包含一个 Key 和 Value ,一个键对象 Key 对应唯一一个值对象 Value ,并且 Key 不允许重复
HashMap
该集合的键和值允许为空,但键不重复,并且集合中元素无序
向集合中添加已存在的键值元素时会覆盖已存在的键值元素
public static void main(String[] args) {
Map map = new HashMap();
map.put(1,"Hi");
map.put(2,"Hello");
map.put(3,"World");
map.put(3,"Word");
System.out.println(map);
}
TreeMap
不允许出现重复的 Key ,同样存储键值映射关系
public static void main(String[] args) {
Map map = new TreeMap();
map.put(1,"Hi");
map.put(3,"World");
map.put(2,"Hello");
map.put(3,"Word");
System.out.println(map);
}
HashTable
Map 接口还有一个实现类 HashTable ,它和 HashMap 相似
HashTable 类有一个子类 Properties 在实际中很重要,Properties 主要用来存储字符串类型的键和值,但实际开发中,Properties常用来存取应用的配置项