Set
-
特点:储存的元素无序唯一,是一个抽象的接口,不能直接实例化一个set对象。
-
定义:public interface Set extends Collection
-
常见方法:
-
add( ) 向集合中添加元素
-
clear( ) 去掉集合中所有的元素
-
contains( ) 判断集合中是否包含某一个元素
-
isEmpty( ) 判断集合是否为空
-
iterator( ) 主要用于递归集合,返回一个Iterator()对象
-
remove( ) 从集合中去掉特定的对象
-
size( ) 返回集合的大小
-
-
迭代方法:foreach,迭代器
-
迭代器接口:Iterator 用来迭代元素; Iterable 可以作为foreach的目标
public static void main(String[] args){ //Set Set<String> sets=new HashSet<>(); //添加 sets.add("格莱美"); sets.add("奥斯卡"); sets.add("图灵奖"); System.out.println(sets.add("图灵奖")); System.out.println(sets); System.out.println("迭代元素"); for(String str:sets){ System.out.println(str); } System.out.println("迭代器迭代元素"); Iterator<String> it=sets.iterator(); while (it.hasNext()){ System.out.println(it.next()); } }
HashSet
概念
Set集合的一种,首先是无序的,不可重复的;允许存放null值;底层封装HashMap;实现是不同步的,线程不安全。
常用构造: public HashSet() :构造一个新的空 set,其底层 HashMap
实例的默认初始容量是 16,加载因子是 0.75。
迭代器功能:public Iterator iterator() 返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
常用方法
-
boolean add(E e) : 如果此 set 中尚未包含指定元素,则添加指定元素
-
boolean isEmpty(): 如果此 set 不包含任何元素,则返回
true
。 -
boolean contains(Object o): 如果此列表中包含指定的元素,则返回
true
-
int size() : 返回此 set 中的元素的数量(set 的容量)。
-
void clear() :移除此列表中的所有元素。
-
boolean remove(Object o):如果指定元素存在于此 set 中,则将其移除。
注意事项:hashset存储自定义对象时一定要重写hashcode和equals方法。
public static void main(String[] args){
//创建一个HashSet
HashSet<User> ss=new HashSet<User>();
//添加User对象
ss.add(new User(6300,"疾风剑豪"));
ss.add(new User(4800,"雷霆咆哮"));
ss.add(new User(6300,"疾风剑豪"));
System.out.println(ss);
}
}
class User{
private int money;
private String name;
public User(){
}
public User(int money,String name){
super();
this.money=money;
this.name=name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString(){
return "User[money="+money+",name="+name+"]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + money;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (money != other.money)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
TreeSet
概念
TreeSet是一个不同步的非线程安全的二叉树。是SortedSet接口的实现类。
优缺点: 维护数据的大小 (有序),添加速度和删除速度高于ArrayList 比其他的都低
查询速度高于List 低于Hash。
如果对于存储的数据有 排序的要求,那么首选TreeSet。
常用方法
与HashSet方法大致相同;多了些针对排序元素的操作。
-
Object first(): 返回集合中的第一个元素。
-
Object last():返回集合中的最后一个元素。
-
Object lower(Object e):查找小于给定元素的最小元素
-
Object higher(Object e): 查找大于给定元素的最小元素
-
Object ceiling(Object e):返回大于或等于给定元素的最小元素
-
Object floor(Object e):返回小于或等于给定元素的最小元素
public static void main(String[] args){ TreeSet<String> treeSet=new TreeSet<>(); //添加元素 treeSet.add("o"); treeSet.add("a"); treeSet.add("b"); treeSet.add("e"); treeSet.add("j"); System.out.println(treeSet); //查找 System.out.println("查找大于或等于给定元素的最小元素:"+treeSet.ceiling("e")); System.out.println("查找大于给定元素的最小元素:"+treeSet.higher("e")); System.out.println("获取最小元素:"+treeSet.first()); System.out.println("获取最大元素:"+treeSet.last()); System.out.println("查找小于或等于给定元素的最小元素:"+treeSet.floor("e")); System.out.println("查找小于给定元素的最小元素:"+treeSet.lower("e")); for(String str:treeSet){ System.out.println(str); } Iterator it=treeSet.iterator(); while (it.hasNext()){ System.out.println(it.next()); } }
注意事项
如果存储的元素需要按照指定的需求进行排序,创建TreeSet对象时 指定比较器。
如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeSet对象是 指定外部比较器Comparetor接口 重写compare方法
set中每个元素存储的时候 都是存储在一个map集合中 map集合的键是set中的元素, map中的值是自动添加的一个默认值。
public static void main(String[] args){
MyCom m=new MyCom();
//传入一个比较器
//TreeSet<String> treeSet=new TreeSet<>(new MyCom());
TreeSet<String> treeSet=new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
//添加元素
treeSet.add("oracle");
treeSet.add("ajax");
treeSet.add("bootstrap");
treeSet.add("ejb");
treeSet.add("java");
System.out.println(treeSet);
}
}
class MyCom implements Comparator<String>{
@Override
public int compare(String o1,String o2){
return o1.length()-o2.length();
}
}
Map
概念
Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
常用方法
-
get方法:获取指定键(key)所对应的值(value);
-
put方法:将指定的键与值对应起来,并添加到集合中,方法返回值为键所对应的值;
-
remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value);
public static void main(String[] args){
//创建map对象
Map<String,String> mps=new HashMap<>();
//put 如果存在键 返回对应的值 添加的值会覆盖之前的值
mps.put("圣城游侠","奥巴马");
mps.put("皮城女警","女警");
mps.put("德玛西亚","大宝剑");
System.out.println(mps.put("圣城游侠","卢锡安"));
System.out.println(mps.remove("德玛西亚"));//如果键不存在 返回null 如果存在返回值
System.out.println(mps);
System.out.println(mps.size());
System.out.println("获取键对应的值:"+mps.get("皮城女警"));//如果键不存在 返回null 如果存在返回值
System.out.println("查看键是否存在:"+mps.containsKey("皮城女警"));
System.out.println("查看值是否存在:"+mps.containsValue("女警"));
}
迭代方法
- 获取键 迭代键的过程中通过get方法获取值
- 获取Entry对象,通过getKey和getValue获取键和值
public static void main(String[] args){
//创建map对象
Map<String,String> mps=new HashMap<>();
//put 如果存在键 返回对应的值 添加的值会覆盖之前的值
mps.put("圣枪游侠", "奥巴马");
mps.put("皮城女警", "女警");
mps.put("德玛西亚", "大宝剑");
//迭代元素
System.out.println("迭代所有的key:");
Set<String> keys=mps.keySet();
for(String key:keys){
System.out.println(key+"==="+mps.get(key));
}
System.out.println("迭代所有的值Value");
Collection<String> coll=mps.values();
for(String value:coll){
System.out.println(value);
}
//获取entry对象
Set<Map.Entry<String,String>> kvs=mps.entrySet();//返回一个set集合 该集合中的每个元素都是entry对象
//实际上是HashSet中的Node对象 因为Node实现了Map中的Entry接口
for(Map.Entry<String,String>entry:kvs){
System.out.println(entry.getKey()+"=="+entry.getValue());
}
}
HashMap
- 概念:
最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,添加、删除、修改效率都很高。底层是数组+链表。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
- 注意事项:
- 存储自定义对象作为键时 要保证当前自定义类重写hashcode和equals方法什么情况下要重写,当前两个对象的属性相同 我们觉得是同一个对象 此时要重写。
- 覆写equals方法时必须覆写hashcode()
- 如果两个对象的equals方法返回值为true,则两个object对应的HashCode值应该相同
- 如果两个对象的equals方法返回false,但是这两个object对应的HashCode是有可能会相同的,(但是必须意识到: HashCode返回独一无二的值,对后续存储此对象的hashtable\hashmap等容器更好的处理有很大帮助。因此覆写的时候可以考虑下hashcode的算法,尽量避免重复情况)
TreeMap
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
注意事项:
如果存在的元素是自定义对象:
1:要么自定义对象的所属类 实现了内部比较器Comparable接口 重写compareTo方法
2:要么创建TreeMap对象是 指定外部比较器Comparetor接口 重写compare方法
HashMap与TreeMap
-
在添加、删除和定位映射关系上,TreeMap类要比HashMap类的性能差一些,但是其中的映射关系具有一定的顺序。
-
如果不需要一个有序的集合,则建议使用HashMap类;如果需要进行有序的遍历输出,则建议使用TreeMap类。