Java基础之集合浅析(一)

Java中的集合整体上分为两大类:单列集合和双列集合(当然还有持久化集合properties)。单列集合的顶层是Collection接口,其中collection继承了iterable接口。双列集合的顶层是Map接口,下面是我画的一张单列集合的层级图,为了使结构清晰明了,摒弃了一些抽象类的模板。

思维导图

List和Set的区别?

List接口和set接口都是继承自Collection接口,两者都是集合,都具有集合增删改查的功能,同时都支持迭代遍历取出每一个元素,迭代的时候需要注意的是,不能使用Collection集合的remove方法,会导致并发修改异常,可以使用iterable的remove方法(印象中是一个无参方法)。

两者的区别是,List是有序集合,而且允许重复,Set是无序集合,不允许重复,list的顺序是通过索引维护的,因此list集合可以通过索引取出对应的值,而Set没有对应的get方法。

分析完两者的特性后,给大家出一个题,list的实现类的四种遍历和set接口的实现的三种遍历你都知道吗?

HashSet去重的原理?

上文说到了Set集合的特性,提到了一个闪亮的特性,不允许重复,那么它是通过什么来去重的呢?其实HashSet去重的方式也是很简单的,它主要是通过hashCode和equals方法来实现去重的。需要注意的是在使用HashSet集合存储对象的时候,想要实现对象属性相同去重的效果,对象必须重写hashCode和equals方法。

HashCode相等和equals返回值的关系?

本质上来说,这两个方法的实现没有什么关系,他们都是Object的方法,但是hashCode方法的设计就是为了减少equals方法的调用,提高效率的,所以在HashMap、HashTable及HashSet的实现去重的功能里都会优先调用hashCode方法,然后才会调用equals方法,此设计的用意是为了解决集合存储数据量大的时候调用equals方法效率低下的问题。所以想要利用这些集合实现属性值相同去重的效果,必须重写hashCode方法。

String类的hashCode方法和equals方法的关系?

首先我要告诉你一个结论是,hash值相等,equals值不一定为true,而equals返回true,则hash值肯定相等。专业点说,hash值是equals返回true的一个必要条件。那么这又是什么原因呢?这就要去看String类对hashCode和equals方法的实现。先看一下

hashCode方法:

可以看出String类的实现还是很简单的,下面来看一下equals方法的实现:

简单分析下这段代码,首先判断是不是同一个对象,然后遍历字符数组,一个字符一个字符的比较,如果equals返回true,你在看一下hash值的实现,你告诉我hash值相同不?答案很显然是相同的,那么这时你会不会有另一个疑问真的存在hash值相等,equals返回false的两个字符串吗?答案是存在的,下面我会给你逐步分析。

首先,我先通过程序获取一下"ab"的hash值为3105,由于码表不好查,所以我就大胆猜想能否在数字和字母中找到hash值为3105,而不是ab的字符串(楼主比较贪心,把字符串的长度也限定为2),简单逻辑分析

设计的代码:

运行结果:

证明方程存在两组解,查码表第一组解是ab,第二组解是bC

验证结果:

是不是证明了hash值相同,equals会返回false的结论。

ArrayList和Vector的区别?

首先两者都是数组结构的集合,都是查询快,插入慢.两者的初始长度都是10.要说他俩的区别其实只有三点区别:

1.Vector线程安全,ArrayList线程不安全,当只有一个线程操作集合的时候,不考虑线程安全的问题,可以考虑使用ArrayList集合,性能会要好一些,当有多线程操作集合的时候,就要考虑线程安全的问题了,此时可以考虑使用Vector集合,就不需要考虑线程同步的问题了。

2.就是扩容长度不同,ArrayList是50%,而Vector是100%。

3.Vector集合可以设置增长因子,ArrayList没有此构造方法,数据量大的情况下使用Vector较好.Vector可以指定扩容参数。

给大家推荐一款App,微信读书,资源很全,各种书籍都有!!!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180424G1M9D600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券