0 前言
鄙人对java语言,实话说,不是很感冒。比如解决一个问题,笔者的行为流程一般是这样的:
有了这个,你再跟我说什么封装,继承,多态,这显然一下子限制妨碍了笔者的想象力。另一方面,这几年做开发,有些方面囫囵吞枣,有些方面理解不透彻。温故而知新,因此,本人按照正常做事的思维,去复习回顾下之前用的高频java技术。
总体的复习结构如图:
1 语言特性
1.1 封装
封装可以用隐藏,模块化,组件化来理解。虽然A同事写了一大堆代码,但是我不想知道代码的细节,我只想知道怎么调用这段代码。
1.1.1 对象创建
一个对象的创建,必须经历声明->创建->初始化 3个步骤。
1.1.2 对象内存分配和引用
对象的创建,同时在内存中给予其分配一块内存,使用索引可访问该内存的地址。在java的语言设计中,为了内存的高效使用,在内存分配上,会使用“引用“的概念。这个概念类似C语言的指针。
比如,在对象clone上,深clone,会clone该对象引用指向的所有对象。
1.2 继承
继承有点类似于”沿用“一词,你做了什么,我沿用你的套路;如果我的情况不一样,我可以做些部分更改。在归纳”对象集合“的时候,比如归纳狗的时候,需要梳理狗的种类,皮毛颜色,三围,原产地,先总结一些公共特征,然后子类沿用公共特征,这样可以简化描述对象的难度。
1.3.1 重载和重写
1.3 多态
”多态“这个词字面上不好理解。它实际描述的是”行为“,即”Action“,或者”DO-WHAT“。
表述就是某一对象的不同行为;多个对象的多种行为。
1.4 抽象
抽象就是抽象。也是简化描述现实的常用思想。
2 集合
2.1 Array
数组不属于集合的划分。由于本人用的高频,而且数组内涵蛮丰富的,所以就放在这里。
(1)集合特点
集合关注点一般有几个主要特点:
- 有序,无序;
- 速度快慢;
- 安全性。
抽象理论不提,一般应用主要根据数据特点。
1 一般有序数据的应用较多。有序集合,大多是List。
List,根据生成数据方式,分为,ArrayList 和LinkedList
2 另一个是无序数据,这类数据,分为2类,一类为带标记,一类为纯无序。
纯无序,因其数据特点,互联网端见的较少,一般用HashSet,因为相同的元素具有相同的hashCode,不能有重复元素。
带标记的,通常用HashMap,是一种用键值对存储的数据存储方式。还有一种树型数据结构,TreeSet,暂不提。
日常人们数据交互中,有几项常见交互模式:
- 增删改查
- 排序
- 线性关系
- 非线性关系
似乎没有通用的数据结构。
对于集合的快慢,这里重点复习下hashCode。
hashCode是通过一种算法生成的编码。hashCode 编码可用于对象在内存中地址位置。
安全性方面,主要是线程安全。速度快的,都是线程不安全的。这部分比较复杂,不提。
(2)hashCode的应用笔记
hashMap由于采用hashCode分配内存思路,时间复杂度为O(n),所以速度很快。
在判断对象重复时,有2个步骤:
- 通过hashCode定位内存地址,地址是空的,则没有重复;
- 如果地址非空,调用它的equals方法与新元素进行比较。
这里面又涉及了判断方法等细节。常见的判断方法有:==、equals()、hashCode()。
三者的具体解析,参见:
https://www.cnblogs.com/xudong-bupt/p/3960177.html
总结就是:
- ==是比较两个对象在JVM中的地址,地址相同,则对象相同。
- 根类Obeject中的方法equals,直接调用==,比较对象地址;string中的equals,先比较地址,如果不同,挨个比较两个字符串对象内的字符。
- 根类Obeject中的方法hashCode,返回对象的32位jvm内存地址。hashCode跟equals有联动关系,重写时,务求