Set集合
Set集合中对象不按特定方式排序,只是简单的把对象加入集合中,但set集合中不能包含重复的对象。
set 集合常用的实现类是HashSet与TreeSet:
Hashset实现set 接口,由哈希表支持。他不保证set 的迭代顺序,特别不保证该顺序恒久不变。该类允许使用null元素。
TreeSet类不仅实现了set接口,还实现了java.util.SortedSet接口。因此TreeSetsh实现的Set集合在遍历集合中能按自然顺序进行递增排序。底层用的红黑树,一种自平衡的有序二叉查找树
TreeSet类增加的方法:
方法 | 描述 |
first() | 返回此Set中当前第一个(最低的 )元素 |
Last() | 返回此Set中当前最后一个(最大的 )元素 |
comparator() | 返回对此Set中的元素进行排序的比较器,如果set使用的自然排序,那么返回null |
headSet(E toElement) | 返回一个新的Set集合,新集合是toElement(不包含)之前的所有对象 |
subSet(E fromElement,E fromElement) | 返回一个新的Set集合,新集合是包含fromElement到fromElement(不包含)的对象 |
tailSet(E fromElement) | 返回一个新的Set集合,新集合包含对象fromElement(包含)之后所有的对象 |
后面三个我们可以看出是对先集合的切片索引(截取)。
eg:
import java.util.Iterator;
import java.util.TreeSet;
public class UpdateStu implements Comparable<Object>{
String name;
long id;
public UpdateStu(String name,long id){
this.name=name;
this.id=id;
}
@Override
public int compareTo(Object o) {
UpdateStu updateStu = (UpdateStu) o;
int result=id> updateStu.id?1:(id==updateStu.id ? 0:-1);
return result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public static void main(String [] args){
UpdateStu updateStu1=new UpdateStu("李同学",0011);
UpdateStu updateStu2=new UpdateStu("张同学",0117);
UpdateStu updateStu3=new UpdateStu("王同学",0046);
UpdateStu updateStu4=new UpdateStu("孙同学",0114);
TreeSet<UpdateStu> treeSet=new TreeSet<>();
treeSet.add(updateStu1);
treeSet.add(updateStu2);
treeSet.add(updateStu3);
treeSet.add(updateStu4);
Iterator<UpdateStu> iterator=treeSet.iterator();
System.out.println("集合中的所有元素是:");
while (iterator.hasNext()){
UpdateStu stu= (UpdateStu) iterator.next();
System.out.println(stu.getId()+" "+stu.getName());
}
iterator=treeSet.headSet(updateStu2).iterator();
System.out.println("截取前面部分集合的所有元素是:");
while (iterator.hasNext()){
UpdateStu stu= (UpdateStu) iterator.next();
System.out.println(stu.getId()+" "+stu.getName());
}
iterator=treeSet.subSet(updateStu3,updateStu4).iterator();
System.out.println("截取中间集合中的所有元素是:");
while (iterator.hasNext()){
UpdateStu stu= (UpdateStu) iterator.next();
System.out.println(stu.getId()+" "+stu.getName());
}
}
}
输出:
集合中的所有元素是:
9 李同学
38 王同学
76 孙同学
79 张同学
截取前面部分集合的所有元素是:
9 李同学
38 王同学
76 孙同学
截取中间集合中的所有元素是:
38 王同学
注意:存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法
比较此对象与指定对象的顺序;如果该对象小于、等于或大于指定对象,则分别返回负整数,0,正整数0
Map集合
Map集合没有继承Collection的接口,其提供的是key到Value的映射。Map中不能包含相同的Key,每个Key只能映射一个value。Key还决定了存储对象的存储位置,这不是Key对象指定的,而是由散列函数决定的,产生一个散列吗的整数值。散列码通常用作一个偏移量,该偏移量对应分配给的映射内存区域的起始位置,从而决定存储对象在映射中的存储位置。
map接口
Map接口提供将key映射到value的对象。不能有重复的key,且一个key只能映射一个值。
方法 | 功能描述 |
put(K key,V value) | 向集合中添加指定的Key与value的映射关系 |
containsKey(Object key) | 如果此映射包含指定的key映射关系,则返回true |
containsValue(Object value) | 如果此映射将一个或多个key映射到指定值,则返回true |
get(Object key) | 如果存在指定的key对象,则返回该对象对应的值,否则返回null |
keySet() | 返回该集合中的所有Key对象形成的Set集合 |
values() | 返回该集合中所有值对象形成的Collection集合 |
eg:
import java.util.*;
public class UpadteStu_two {
public static void main(String [] args){
Map<String,String> map =new HashMap<>();
map.put("01","李同学");
map.put("02","张同学");
map.put("03","王同学");
map.put("04","孙同学");
Set<String> Key_set=map.keySet();
Iterator<String> iterator=Key_set.iterator();
System.out.println("key集合中的元素是:");
while (iterator.hasNext()){
System.out.println(iterator.next());
}
Collection<String> Value_collection=map.values();
Iterator<String> iterator1=Value_collection.iterator();
System.out.println("value集合中的元素是");
while (iterator1.hasNext()){
System.out.println(iterator1.next());
}
}
}
输出:
key集合中的元素是:
01
02
03
04
value集合中的元素是
李同学
张同学
王同学
孙同学
Map接口的实现类
Map接口常用的接口就两种:HashMap TreeMap
一般情况下建议使用HashMap,因此HashMap底层是由哈希表实现的,添加、删除、查询效率都很高,HashMap通过哈希码对其内部的映射关系进行快速查找。
而TreeMap的映射关系存在一定的顺序,因此如果希望Map集合中的对象也存在一定的顺序,应该使用treeMap
HashMap允许null值和null键;但是由于TreeMap有自动排序,因此不允许有键对象是null的
eg:
public class Emp {
private String e_id;
private String e_name;
public Emp(String e_id,String e_name){
this.e_id=e_id;
this.e_name=e_name;
}
public String getE_id() {
return e_id;
}
public void setE_id(String e_id) {
this.e_id = e_id;
}
public String getE_name() {
return e_name;
}
public void setE_name(String e_name) {
this.e_name = e_name;
}
}
import java.util.*;
public class MapText {
public static void main(String [] args){
Map<String,String> map=new HashMap<>();
Emp emp=new Emp("351","张三");
Emp emp2=new Emp("512","李四");
Emp emp3=new Emp("853","王一");
Emp emp4=new Emp("125","赵六");
Emp emp5=new Emp("341","黄七");
map.put(emp4.getE_id(),emp4.getE_name());
map.put(emp5.getE_id(),emp5.getE_name());
map.put(emp.getE_id(),emp.getE_name());
map.put(emp2.getE_id(),emp2.getE_name());
map.put(emp3.getE_id(),emp3.getE_name());
Set<String> set =map.keySet();
Iterator<String> iterator=set.iterator();
System.out.println("HashMap实现的集合(无序)");
while (iterator.hasNext()){
String str= iterator.next();
String name=(String) map.get(str);
System.out.println(str+" "+name);
}
TreeMap<String,String> tree_map =new TreeMap<>();
tree_map.putAll(map);
Iterator<String> tree_iterator=tree_map.keySet().iterator();
System.out.println("TreeMap实现的集合(有序)");
while (tree_iterator.hasNext()){
String str= tree_iterator.next();
String name=(String) tree_map.get(str);
System.out.println(str+" "+name);
}
}
}
程序输出:
HashMap实现的集合(无序)
341 黄七
125 赵六
512 李四
853 王一
351 张三
TreeMap实现的集合(有序)
125 赵六
341 黄七
351 张三
512 李四
853 王一
注意:TreeMap底层也是用的红黑树