一些Java集合类(List,Map,Set)的使用心得

时间:2021-10-30 17:00:08
大家好,我是IT修真院上海分院第5期的学员卢炳伸,一枚正直纯洁善良的JAVA程序员


今天给大家分享一下,修真院官网JAVA任务一,有关集合类的一些东西


1.背景介绍

集合的由来

通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了!


2.知识剖析


集合是什么


Java集合类存放于 java.util 包中,是一个用来存放对象的容器。


注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。


   ②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。


   ③、集合可以存放不同类型,不限数量的数据类型。


3.常见问题。


i.什么是随机访问,和顺序访问有什么区别?


4.解决方案

java集合类中元素的访问分为随机访问和顺序访问。随机访问一般是通过index下标访问,行为类似数组的访问。而顺序访问类似于链表的访问,通常为迭代器遍历。  以List接口及其实例为例。ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。List接口既定义了下标访问方法又定义了迭代器方法。所以其实例既可使用下标随机访问也可以使用迭代器进行遍历。但这两种方式的性能差异很明显。 
比如,ArrayList是数组结构,随机访问具有常量时间。  LinkedList是链表结构,随机访问分为两步: 
- 首先根据index查找Node,通常是一个for循环查找index对应的Node 
- 然后返回Node中存储的元素 
从结果来看,ArrayList的下标遍历性能远高于LinkedList的下标遍历。

5.编码实战

List排序:

一些Java集合类(List,Map,Set)的使用心得


一些Java集合类(List,Map,Set)的使用心得

一些Java集合类(List,Map,Set)的使用心得

输出结果:

一些Java集合类(List,Map,Set)的使用心得

一些Java集合类(List,Map,Set)的使用心得

map:

HashMap和HashTable的区别

主要是:HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。详细可见:http://www.importnew.com/7010.html

这里想说的是,spring里面关于HashTable的一些坑。前几天学习boot,因为其自动扫描装配的顺序问题,吃了不少的亏,这里特地列举出来讲一讲:

1.properties配置文件读取的顺序问题:

比如spring其实是通过PropertiesLoaderUtils这个工具类读取属性的:

一些Java集合类(List,Map,Set)的使用心得

点开properties这个类的源码:

一些Java集合类(List,Map,Set)的使用心得

然后查看他的一些方法的源码,再通过测试,发现properties加载的顺序的确是无序的!

这个东西比如在shiro配置拦截器顺序的时候可能会有坑,后来看开涛大佬的博客,他是拿ini的方式解决的。不过我没有动态加载这个需求,直接在xml里面写死了。

2.boot工程装配组件的顺序问题

有多个@RestControllerAdvice的时候要实现@Order接口,否则无序,可能达不到想要的效果

合理利用@Bean和new()两个依赖注入方式,前者哪怕在一个@Configuration类中注册顺序可能也是无序的

3.其他 比如单元格测试的时候,最好不要直接跑整个测试类,因为多个@Test单元格的测试顺序也是无序的,而不是自上而下


tip:其实这里,与其说无序,我更想描述为“非直观”的,因为多次执行的结果,顺序其实都一致的,只不过结果往往和直观的肉眼观察不一致(搞清楚散列就很容易理解)。


Set

一些Java集合类(List,Map,Set)的使用心得

一些Java集合类(List,Map,Set)的使用心得


本次测试对象:

一些Java集合类(List,Map,Set)的使用心得

重写:

一些Java集合类(List,Map,Set)的使用心得


一些Java集合类(List,Map,Set)的使用心得

如果不重写方法,那么打印出来的就有三条信息


那如果某些情况下,我们需要更细一步地条件去重呢?比如地址和内容一样,我就认为是同一条信息

如果为了安全 可以考虑继承重写的方法:

一些Java集合类(List,Map,Set)的使用心得

一些Java集合类(List,Map,Set)的使用心得

输出结果:

一些Java集合类(List,Map,Set)的使用心得

老板:老子做都做到一半了  还想换口味???没门!


6.扩展思考

  《阿里巴巴Java开发手册》


7.参考文献


  https://www.cnblogs.com/ysocean/p/6555373.html

  https://blog.csdn.net/HHcoco/article/details/53117525

https://blog.csdn.net/yaogebeizhan/article/details/78180448?fps=1&locationNum=7

《JAVA编程思想》



8.更多讨论

9.鸣谢

YSOcean 东轩幽客