散列表、泛型
1.Set
1.1 HashSet使用
for(Object object:set){}
2.散列表(哈希表)
2.1 概述
散列结构 可以理解为 数组中保存的是链表的首节点,用来保存k和v 键值对操作
hash算法 一种安全的加密机制,可以把不定长的数据转换为定长数据,并且不能保证其唯一性,又叫哈希冲突
在java中指的就是hashCode方法
对一个对象生成多次hash值,值一定相同,多个对象可能生成相同的hash值,为哈希冲突
k不可以重复,v可以重复
添加过程
1.根据要添加的key,调用的它的hashCode方法,生成hash值
2.通过一定的算法,根据hash值生成数组的下标
3.判断该下标是否有数据,如果没有就把该键值对映射关系保存到数组中
4.若该下标有数据,则调用key的equals方法和对应的所有数据进行比较,不相等则添加到尾部
5.如果有相同数据,key不再添加,但是value值会替换原来的value值
因为链表在查询性能上较差,所以每个数组中的链表个数如果大于等于7,则会转换为红黑树
数组默认初始化容量为16
节点内布类为单向链表,保存当前hash值、添加的key、添加的value、下一个节点对象
3.Map
3.1概述
Map是无序的,并且保存的是kv键值对映射关系
HashMap:底层是散列表
TreeMap:底层是红黑树
映射关系:比如商品和购买数量
3.2继承体系
见笔记中图
3.3常用方法
HashMap map = new HashMap(); //创建map
map.put("A","one"); //添加K V
//K 重复不添加,value替换
//支持k和v都null,但没有意义
System.out.println(map.size()); //个数
System.out.println(map.get("A"));//根据k获取v的值
System.out.println(map.containsKey(k)); //判断是否包含某个k
System.out.println(map.containsValue("one")); //判断是否包含某个value
map.remove(); //根据key删除该映射关系,返回对应的value值
Collection values = map.values(); //获取所有的value,并放到集合中返回
for(Object object:values){
System.out.println(object);
}
//keyset:获取所有key,封装到set对象中并返回
Set keys = map.leySet();
for(Object object :keys){
System.out.println(object + ":" + map.get(object));
}
//把map转换为set。Entry类中,保存了k和v两个变量,把map中的k和v转换额外ientry类的
对象存储,所以我们只需要保存entry对象,就相当于保存了k和v
Set set = map.entrySet();
for(Object object:set){
System.out.println(object);
Entry entry = (Entry) object; //转换为entry类型
System.out.println(entry.getKey()+ ":" +entry.getValue());
}
3.5 TerrMap
保存的元素会按照一定的规则进行排序,底层是红黑树
使用compareTo时,如果返回类型是double,不能直接比较返回,应return 1;这种
4.泛型
4.1概述
在编译过程中检测数据类型是否匹配
必须是引用类型,不能使用基本类型
优点:统一了数据类型,减少了类型转换
缺点:只能保存同一种类型
4.2使用方式
//没有使用泛型,什么也能放,取的时候拿到的是Object,使用
//需要进行判断和向下转型才行
//使用泛型 规定 该集合中 只能保存A类型
List<A> list2 = new ArrayList<A>();
list2.add(new A());
//添加其他的报错,而且是编译报错
//使用的时候拿到的就直接是A类型,不会出现类型转换异常,因为只要能运行一定是A
for(A a: list2){
}
4.3注意
泛型只能写引用类型,若想保存基本类型,需要编写对应的包装类类型
List<int> list3 = new ArrayList<int>();
List<Integer> list4 = new ArrayList<Integer>();
4.4自定义泛型
使用大写字母A~z表示,写什么都一样,占位符而已,但某些字符有特殊含义
E:Element 一般代表元素,而集合中的数据我们叫元素
K:key表示键
V:value表示值,k和v一般在散列表中出现(Map)
T:type表示一个Java类型
N:表示number
?:表示不确定的类型
如果规定了泛型使用的地方没有指定泛型,则默认Object类型
5.题
Map以Value进行排序
Map是没办法按照value排序的,因为源码中写死了,用key比较
所以只能保存到list中进行排序
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<String, Integer>();
map.put("b", 11);
map.put("a", 21);
map.put("c", 145);
map.put("d", 41);
map.put("e", 15);
System.out.println(map);
// 把Map封装到entry中并保存到set中
Set set = map.entrySet();
// 把Set 保存到list中 , 通过ArrayList的有参构造可以直接把set转换为list
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>> (set);
// 排序
Collections.sort(list, new Comparator<Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o1.getValue()-o2.getValue();
}
});
System.out.println(list);
}
tab 取数据
map:保存k和v
entry遍历就和map没有关系了
泛型:中药柜子
泛型01