java面试之集合类

1、结构图:

|---Collection<E>:存储一组对象

|------List:可重复,可以有序

|---------LinkedList:双向链表,插入、删除。移动操作较快,随机访问操作差

|---------ArrayList:数组方式,擅长随机访问,但是插入、删除、移动操作慢

|---------Vector:数组方式,线程安全,与ArrayList的区别就是线程安全

|------------Stack:实现栈

|------Set:不可重复

|---------HashSet:哈希表实现,无序

|---------TreeSet:红黑树实现,排序

|------Queue:先进先出容器

|---------PriorityQueue:不允许null,按照所指定顺序对元素排序,非线程安全

|---Map<K, V>存储关键字/值对

|------HashMap:允许有Null,非线程安全

|------HashTable:不允许有Null(已被HashMap代替),线程安全

|------TreeMap:有序(Comparable制定)

|---Interator<E>:迭代输出,新输出标准,较Enumeration<E>增加一个remove()方法

|---Enumeration<E>:旧的输出标准

  • 帮助理解:

Map中的一组方法允许您把键或值的组作为集合来处理。

publicSet keySet() //不可重复

publicCollection values() //可重复

public SetentrySet() //一个实现 Map.Entry 接口(包含getKey/getValue/hasCode/setValue/equals方法)的元素 Set

2、注意知识点

2.1、什么是Iterator

  一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用 Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本身。(主要的方法有:next()hasNext()remove()

2.2、Iterator与ListIterator有什么区别?

Iterator:只能正向遍历集合,适用于获取移除元素。ListIerator:继承Iterator,可以双向列表的遍历,同样支持元素的修改。

2.3、Iterator与Iterable接口的区别

  • 从接口定义的方法看:

Iterator接口:hasNext、next 、remove

Iterable接口:iterator

  • 从功能看:

Iterator接口实现之后的功能是“使用”一个迭代器

Iterable接口实现之后的功能是“返回”一个迭代器

2.4、什么是HaspMap和Map?

Map是接口,Java 集合框架中一部分,用于存储键值对,HashMap是用哈希算法实现Map的类。

2.5、HashMap与HashTable有什么区别?对比Hashtable VS HashMap

  两者都是用key-value方式获取数据。Hashtable是原始集合类之一(也称作遗留类)。HashMap作为新集合框架的一部分在Java21.2版本中加入。它们之间有一下区别:

  • HashMapHashtable大致是等同的,HashMap是非同步的和且允许键和值都是空值。
  • HashTable使用Enumeration遍历,而HashMap使用Iterator遍历(Enumerationiterator的区别是iterator可以删除元素,现在一般用Iterator)。
  • HashTablehash数组的默认大小事11,增加方式是old*2+1,而HashMaphash数组的默认大小事16,而且一定是2的指数。
  • 哈希值的使用不同,HashTable直接使用对象的hashcode,而HashMap会重新计算hash值。

2.6、Collections和Collection的区别:

Collections是集合类(Collection是个java.util下的接口,它是各种集合结构的父接口。Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。

2.7、Comparable和Comparator接口的区别

  • 从接口定义的方法:

Comparable接口:compareTo(arg)

Comparator接口:compare(arg1, arg2)、equals(arg1, arg2)

  • 从需求:

Comparable接口是比较类需要实现的接口

Comparator接口的实现类是比较器

  • 从用法:

自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序;

而Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

一个是自已完成比较,一个是外部程序实现比较的差别而已。

  •  Comparator接口实例(类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身,实现算法和数据分离,策略设计模式)


  • Comparabler接口实例:

3、hashcode

3.1、常用hashcode算法

  • Object类的hashCode:返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  • String类的hashCode:根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
  • Integer,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

3.2、hashcode与HashTable、HashMap

  • HashMap结构图(链表散列):

从图中我们可以看到一个hashmap就是一个数组结构,当新建一个hashmap的时候,就会初始化一个数组Entry[] table。其中Entry是数组的元素,

Entry还持有一个指向下一个元素的引用,这就构成了链表

  • HashMap工作原理(put/get):

当我们往hashmap中put元素的时候,先根据keyhashcode得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

从hashmap中get元素时,首先计算keyhashcode,找到数组中对应位置的某一元素,然后通过keyequals方法在对应位置的链表中找到需要的元素。

  • key的hashcode与equals方法改写

HashMap中get方法的过程:首先计算key的hashcode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。所以,hashcodeequals方法对于找到对应元素是两个关键方法。 

Hashmap的key可以是任何类型的对象,例如User这种对象,为了保证两个具有相同属性的user的hashcode相同,我们就需要改写hashcode方法,比方把hashcode值的计算与User对象的id关联起来,那么只要user对象拥有相同id,那么他们的hashcode也能保持一致了,这样就可以找到在hashmap数组中的位置了。

如果这个位置上有多个元素,还需要用key的equals方法在对应位置的链表中找到需要的元素,所以只改写了hashcode方法是不够的,equals方法也是需要改写。

只重写了equasl方法的Key类在用做Hash中的键值的时候两个equasl为true的对象不能获取相应的Value的;

而重写了hashCode方法和equals方法的key_类两个相等的对象可以获取同一个Value的,这样更符合生活中的逻辑。

HashMap对象是根据Key的hashCode来获取对应的Vlaue,因而两个HashCode相同的对象可以获取同一个Value。

  • HashMap中的hash算法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值