工作中需要用到的Java知识(集合篇)
上一篇我提到了基本数据类型,引用数据类型String,还有StringBuffer和StringBuilder的作用与区别,这些内容是我们在进行开发中经常会用到的内容,当我们了解了这些之后我们应该了解一下集合
其实在集合之前我们还有一些其他的内容,但是我这个可能是单纯的复习,不是系统的学习,所以一些内容就不说了,如果有大佬有更深的理解或更好的内容,请分享给我,谢谢啦。
1.集合类型
集合在工作中也经常会遇见,其实Java语言进行WEB后端开发的时候,全都是数据库内容的增删改查存取功能。当我们在数据库查询出了多条数据,我们该如何将数据提取出来呢?这时候我们就需要用到集合来将内容提取出来,之前我写了List集合与Map集合在Mybatis中的运用,这两种集合类型在工作中是用的最多的。接下来我会大概说一下我理解的集合类型以及什么时候使用。
①集合简介
集合是一个容器,当我们需要保存很多条数据时我们就会用到集合,集合一共分为两种,一种是实现Collection接口,另一种是实现Map接口
这就是集合的家族,有很多分支,其中每个内容都有他们各自的特点,但是单单在我的工作中常用的有ArrayList,HashMap这两种集合,当我们创建了实体类的时候我们可以用List<Object>
来接收内容,当我们不想创建对象时我们可以用Map<String, String>
来接收对应键的value,Set集合用的比较少,基本上就是用来将List集合进行去重用的。
②集合遍历比较
既然有了集合那我们就不能避免需要遍历集合中内容,那我们如何遍历呢?遍历集合就一定有效率,有可能我们需要遍历的集合是一个很大的集合,我目前使用的遍历集合方式是使用for循环遍历List集合,使用forEach遍历Map集合
为什么要采用这种方式来遍历集合呢,原因是List集合继承了AbstractList类,这个类实现了RandomAccess接口,
通过Collections类的binarySearch()方法我们可以看到里面有用到RandomAccess,它先判断集合是否实现了RandomAccess从而判断是使用indexedBinarySearch()方法还是iteratorBinarySearch()方法,也就是说这两个方法才是决定ArrayList是如何进行快速随机访问的关键
这两个方法才是影响遍历速度的根本原因,当实现RandomAccess接口后使用for循环遍历快,当没有实现RandomAccess接口时使用forEach或迭代器遍历快。同理你也可以去找找Set集合该如何遍历呢?
备注:
⚪ 由于ArrayList是线程不安全的,当我们需要线程安全的使用集合时,我们可以使用Vector集合,暂时我还没有用到,这个类型的集合线程是安全的,不过要花费大量的时间。
⚪ 我们还可以使用同步类型的List,使用方式为:
通过Collections.synchronizedList()方法变为线程安全的集合
③Set集合
我们简单说一下Set集合,这个集合是基于HashMap实现的,当我们创建一个Set集合时,会创建一个对应的Map集合。
我们存放的所有值,都是作为Map集合的Key存在的,Value的值都固定为PRESENT。
当我们添加内容时,就会调用Map集合的put方法,向集合中添加元素
此时,我常用的Collection下的集合就介绍完了,一些其他的方法当具体使用的时候我们再去学习,但是还有一种类型我们没有说到,那就是Queue类型。
Queue类型是队列,在工作中我没有遇到需要使用这个类型的情况,这个类型的内容我暂时也没有理解,好像是用到了生产者消费者模型,这个等过一段时间学习到了以后再来分享一下吧,不好意思啦。
我终于来填坑啦,有需要的查看下面的文章↓
工作中需要用到的Java知识(Queue队列篇)
④Map集合
Map集合是一个键值对形式的集合,HashMap是基于Hash表中Map接口的非同步实现,无论是HashMap还是TreeMap,他们的Key都是不可重复的,这是因为每添加一个键值对,首先会得到这个键值对中Key的HashCode值,看是否相同,如果不相同则放入一个数组中,如果相同则通过equals()方法比较两个值是否相同,如果相同则替换,如果不同则放入链表。
JDK1.8以后,当链表长度大于8,数组长度大于64时,就会形成红黑树,以减少搜索键值对时所用的时间。
HashMap与HashTable的区别
有的面试题中会询问这两个内容的区别,区别就是HashMap线程不安全,HashTable线程安全,但是HashTable是过时的,在代码编程中不要使用HashTable这个类如果需要使用线程安全的,可以使用ConcurrentHashMap
HashMap与TreeMap的选择
当我们删除添加元素比较多的时候选择HashMap;当我们遍历元素比较多的时候选择TreeMap,我这个也是在网上看到的哈,嘿嘿
LinkedHashMap集合
跟HashMap集合差不多,只不过多维护了一个双向链表,这么做需要一定空间,所以性能就要差一点,不过他是按插入顺序进行排序的,如果需要将集合按照插入顺序排序,可以选择这个集合。
identityHashMap集合
同样与HashMap集合差不多,只不过HashMap是用hashCode方法与equals方法来比较相等的,而identityHashMap集合是使用\“==\”来判断相等的。用来排重。
SortedMap集合
用来进行有排序需要的集合,其中有获取第一个元素和最后一个元素的方法。
NavigableMap集合
在 SortedMap 基础上,支持快速搜索符合条件的最近的元素。
TreeMap集合
实现了NavigableMap集合,支持排序的Map集合。
WeakHashMap集合
当内存不足的时候,WeakHashMap集合会将没有使用的键值对进行垃圾回收(弱键回收机制),所以很少会报出内存不足异常。
ConcurrentHashMap集合
ConcurrentHashMap 集合是将表进行分段锁,在JDK1.8后又进行了升级,在线程安全的基础上又提升了速度。
集合类我觉得了解这些就可以了,如果想要深入了解一下集合类,友情推荐一篇帖子:
Java集合容器面试题(2020最新版)
如果有兴趣的同学可以看看这个。
查看下一篇请戳这里↓
工作中需要用到的Java知识(Java概念篇)