java中的集合(一)

先上图,大概的继承结构。

知识点1:List、Set、Map是这个集合体系中最主要的三个接口。
      其中List和Set继承自Collection接口。
      Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。
      List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
      Map也属于集合系统,但和Collection接口不同。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是三个主要的实现类。
      SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

 

知识点2:ArrayList和Vector有的区别;HashMap和HashTable的区别

Vector和HashTable是线程同步的(synchronized)。性能上,ArrayList和HashMap分别比Vector和Hashtable要好。

 

知识点3:如何排序

可以用java.util.Collections.sort(List list)和其重载方法java.util.Collections.sort(List list,Comparator c),第一种list内的如果是object,需要实现Comparable,复写其compareTo方法,第二种可以声明一个匿名内部Comparator ,复写其compareTo方法。

Comparable的时候,return this.id - ((PersonBean)o).id;是按id升序
Comparator的时候,return o1.id-o2.id;是按id升序

 

知识点4:hashSet去重

我们会发现hashset存储int或者string是可以去重的,存储我们自己定义的对象,发现不能去重,这是为什么呢?

这要从hashset的去重原理开始讲起,hashset去重,实际上是因为底层维护了一个hashmap,而hashmap中的put方法,我们看到key不能重复,当用对象当key的时候,有这么一个判断。

先判断对象的hashcode是否一样,如果不一样,肯定就是不同的两个对象,如果是一样,再用equals比较,看true还是false.

那就很清楚了,我们new出来的两个对象,如果没有复写hashcode方法,所有对象都是继承object,object的hashcode方法返回的是一个规则加一个随机数,因此两个对象的默认hashcode值肯定不相同。

然后我们去看看int 和 String, 发现其都复写hashcode方法,都跟他们的值有关,值相同hashcode就相同。那怎么复写hashcode呢,因为hashcode方法是要得到一个int值,我通常是把每一个属性的hash相乘,但即使如此,仍有可能两个属性不完全相同的对象,他的hashcode是一样的,所以即使hashcode相同,仍要复写equals,比较每一个属性。同时,这也降低了比较的次数,先比较hash,再equals。所以hashcode如何复写,只有更好,没有最好。呐,hashcode值一样,还得equals方法为true,所以我们也得复写equals方法,比对对象的每一个属性值,如果相同就认为是同一个对象。int和string也是这么干的,如果值相同就是同一个对象。

 

彩蛋:如何直接使用一个集合,又去重又排序?

可以使用treeSet,并且让存储的对象实现Comparable接口即可。又去重又排序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值