HashSet
元素是无序的
向Hashset中添加元素时,是如何判断元素是否重复的:
添加元素时,如果用equals判断效率太低,因为equals是一个一个字符比较
HashSet底层用到hashCode和equals
一个内容:"sahdihwo"计算hash值,值相同则内容相同
但是有可能出现值相同内容不同的情况,因此值相同时再用equals判断这样子节省了很多时间
HashSet<String> set=new HashSet<>();
//只输出一个
set.add("dsadw");
set.add("dsadw");
set.add("dwdq");
//通话和重地hash值一样但可以放进数组说明上述底层实现的方式
set.add("通话");
set.add("重地");
System.out.println(set);
HashSet<Teachers> set1=new HashSet<>();
Teachers teachers1=new Teachers(1,"hh");
Teachers teachers2=new Teachers(2,"hhh");
Teachers teachers3=new Teachers(1,"hh");
Teachers teachers4=new Teachers(4,"hhhh");
添加时,判断会调用hashCode计算hash值,如果这个类没有hashCode比如Teachers就没有就会调用父类Object中的hashCode:public native int hashCode();native是本地方法(操作系统提供的)所以只要是new出来的都调用Object类中hash值,时内存地址,所以不相同
set1.add(teachers1);
set1.add(teachers2);
set1.add(teachers3);
set1.add(teachers4);
System.out.println(set1);
因为teahcer1和teacher3是两个对象,在内存地址中是两个东西,所以Object的hashCode算出来的不一样,两个类都会输出,如果想要算内容的hash值就得自己在这个新类中重写hashCode和equals方法
Set 不能存储重复元素
TreeSet底层时树形结构 左边小右边大
添加进来的元素可以排序(按元素的自然顺序)
TreeSet<Teachers> set1=new TreeSet<>();
Teachers teachers1=new Teachers(1,"hh");
Teachers teachers2=new Teachers(2,"hhh");
Teachers teachers3=new Teachers(1,"hh");
Teachers teachers4=new Teachers(4,"hhhh");
set1.add(teachers1);
set1.add(teachers2);
set1.add(teachers3);
set1.add(teachers4);
System.out.println(set1.toString());
TreeSet底层用的是comparable接口中的compareTo进行比较
新创建的类没有compareTo需要方法重写
public class Teachers extends Object implements Comparable<Teachers>
@Override
public int compareTo(Teachers o) {
return this.num - o.num;
}
重写toString:
public String toString(){
return num+name;
}
Iterator<Teachers> it= set1.iterator();
while(it.hasNext()){
Teachers t= it.next();
System.out.println(t.toString());
}
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
HashMap<String,String> map=new HashMap<>();
map.put("A","aaa");
map.put("B","bbb");
map.put("C","ccc");
map.put("D","ddd");
map.put("E","eee");
map.put("A","qqq");
//键值不能重复,后面的会覆盖前面的
System.out.println(map.get("A"));//qqq
//map.clear();//清空所有键值映射
//System.out.println(map.remove("B"));//删除键值映射,并返回改键对应的值
System.out.println(map.containsKey("C"));//true,是否包含keyC
System.out.println(map.containsValue("dsa"));//flase,是否包含值dsa
System.out.println(map.size());
Collection<String> values=map.values();//保存map的所有值
System.out.println(values);//[qqq, bbb, ccc, ddd, eee]
Set<String> keys=map.keySet();//保存map的所有key
System.out.println(keys);//[A, B, C, D, E]
System.out.println(map);//{A=qqq, B=bbb, C=ccc, D=ddd, E=eee}