今天给大家分享一下,修真院官网JAVA任务一,有关集合类的一些东西
1.背景介绍
集合的由来
通常,我们的程序需要根据程序运行时才知道创建多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是数组只能放统一类型的数据,而且其长度是固定的,那怎么办呢?集合便应运而生了!
2.知识剖析
集合是什么
Java集合类存放于 java.util 包中,是一个用来存放对象的容器。
注意:①、集合只能存放对象。比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。
②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。
③、集合可以存放不同类型,不限数量的数据类型。
3.常见问题。
i.什么是随机访问,和顺序访问有什么区别?
java集合类中元素的访问分为随机访问和顺序访问。随机访问一般是通过index下标访问,行为类似数组的访问。而顺序访问类似于链表的访问,通常为迭代器遍历。 以List接口及其实例为例。ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。List接口既定义了下标访问方法又定义了迭代器方法。所以其实例既可使用下标随机访问也可以使用迭代器进行遍历。但这两种方式的性能差异很明显。
比如,ArrayList是数组结构,随机访问具有常量时间。 LinkedList是链表结构,随机访问分为两步:
- 首先根据index查找Node,通常是一个for循环查找index对应的Node
- 然后返回Node中存储的元素
从结果来看,ArrayList的下标遍历性能远高于LinkedList的下标遍历。
5.编码实战
List排序:
输出结果:
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这个工具类读取属性的:
点开properties这个类的源码:
然后查看他的一些方法的源码,再通过测试,发现properties加载的顺序的确是无序的!
这个东西比如在shiro配置拦截器顺序的时候可能会有坑,后来看开涛大佬的博客,他是拿ini的方式解决的。不过我没有动态加载这个需求,直接在xml里面写死了。
2.boot工程装配组件的顺序问题
有多个@RestControllerAdvice的时候要实现@Order接口,否则无序,可能达不到想要的效果
合理利用@Bean和new()两个依赖注入方式,前者哪怕在一个@Configuration类中注册顺序可能也是无序的
3.其他 比如单元格测试的时候,最好不要直接跑整个测试类,因为多个@Test单元格的测试顺序也是无序的,而不是自上而下
tip:其实这里,与其说无序,我更想描述为“非直观”的,因为多次执行的结果,顺序其实都一致的,只不过结果往往和直观的肉眼观察不一致(搞清楚散列就很容易理解)。
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 东轩幽客