Map,hashmap,set,list

他们之间怎样互相转呢
list map,set,collection
set集合唯一但无序,list不唯一根据下标排序,collection不唯一也无序。
集合跟泛型更搭哟,只能存入指定的类型,还不用强转输出。最重要的是在遍历输出的时候可以接着调用泛型的方法(比如,在输出的时候就可以输出,element.toUpstring()这个方法进行转换)

排序

排序都是通过Compareable接口进行实现的,Collection 有sort方法进行排序。Colection.sort(list1)j就是对list1排序(这是对基本数据类型进行的排序string和int)。对自定义类型的排序需要实现comparable或者comparator接口。
1:将需要实现排序的类implement Comparable重写compareTo方法(该方法返回int类型,-1由高到低,1低到高,0相等或者直接返回 return this.age-o.age)。感觉是只适合int类型
2使用匿名内部类重写一个比较器

Collection.sort(list,new Comparator<需要排序的类>{
@override
public int compare(Cell o1,Cell o2){
   		return o1.getY() - o2.getY();//int类型这样比较,string类型用 o1.getname().comareTo(o2.getname())
   	}
});

compareTo原理:首先将两个对象转化为字符数组,获得其长度在从第一个进行比较,比较次数为段数组的长度。如果两个字符不相等就返回c1-c2的int值。好像是根据返回的值来排序的。
原理:本质是调用Arrylist.sort (归并以及插入排序)
https://www.imooc.com/article/257268

List

重点是扩容
ArryList本质是一个数组,只是实现了长度可变。因为是连续空间所以查询以及根据下标访问快,但是添加删除操作复杂,因为它涉及到后面的所有元素,都需要移动。
LinkList 是一个双向链表,查询慢,因为它不知道下标只能从头遍历,但是添加删除快,只需改变前后节点的指向就可以了。
扩容都是二进制的右移并异或操作。

set

hashset,linkhashset,treeset

hashmap原理

hashmap是由数组加链表实现的(只数组实现,查找效率低)。数组下标通过key的hashcode来得到(hashcode值略大,需要对数组的长度进行%运算),然后将对象(这个对象是Entry对象)插入数组(其实数组中存的是该对象的地址值)。因为hashcode%运算之后得到的结果可能一样,此时用到了链表。在数组的同一位置使用链表,为了使效率提高,每次都将新来的插在链表头部(Node.next=header),并将数组中的引用地址换成新插入的对象的节点。在这里插入图片描述
如果插入一个原来相等的key,会将本来的值给覆盖掉(便利该链表,来查重,但是不会每次都遍历完链表的所有的对象,只要找到重复的就会返回,这样提高效率)。key为空时,固定把它放在第一位。
hashmap扩容时比较麻烦,所有节点都需要转移到新的扩容后的表中。1)先扩容生成新的hashmap,然后有一个新的Entry对象来作为中间人进行转移,它指向同一个下标下的链表的第一个entry对象,将其地址复制到对应新表的位置,它的next属性指向链表的下一个。
在这里插入图片描述

.
.
.
.
.

根据value取值

//先找最大值在根据value找key
Collection values = hashMap.values();
      Integer max =(int) Collections.max(values);
      
for(Object obj:hashmap.keyset()){
if(hashmap.get(obj)==max){
obj跟max的值都找到了。
}
}

map中插入的key一样的话,会覆盖原来的key。

遍历map

 for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
 //这里放int报错,要放Integer,自动封装成int对象
            if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
                majorityEntry = entry;
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值