集合框架 -- LinkedHashMap
LinkedHashMap继承自HashMap,加上了链表的结构来实现顺序迭代,有两种迭代顺序,一种是按照数据插入的顺序,一种是按照数据访问的顺序
基础源码public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
transient LinkedHashMap.Entry<K,V> head;
transient Link ...
集合框架 -- 集合框架
[TOC]
Collection最基本的集合接口;有一个帮助类叫做Collections用于表示任何对象或元素组,想要尽可能以常规方式处理一组元素时,就使用这一类,实际上使用很少;
List实现了collection接口,list其实就是数组,允许重复元素,通过角标可以直接定位元素
LinkedList是个双向链表,所以可以当做队列和栈来使用,线程不安全
需要取出指定位置的数据的时候有一个加速机制,判断一下index和size一半的大小,也就是搞清楚是在前半段还是后半段,然后决定从头遍历还是从尾部遍历
ArrayList
Array(数组)和ArrayLish的异同点
ArrayList可以看成是一个增强的Array一个动态的数组
数组在定义的时候就要确定长度,ArrayList确可以动态的增长
数组里面只能存储同一类型的数据,ArrayList可以存储不同的对象
数组可以存储基本类型和引用类型,ArrayList只能存储引用类型
内存分配的机制:基于数组,当内存不够用的时候会去重新申请一片两倍于现在的内存空间,并将所有元素复制到新的内存中
Vector可 ...
基础 -- Java笔记9--正则表达式
Java笔记9–正则表达式
2016年1月20日
15:33
正则表达式(regular expression):描述一种字符串匹配的语法规则
语法:有一系列的匹配字符、通过各种匹配规则组成,其核心就是匹配字符和匹配规则。
起源:有两位神经生理学家研究出一种数学方式来描述神经网络的–神经时间的表示法,其中一个”正则集的代数“的表达式,采用了”正则表达式“这个术语。
已使用 Microsoft OneNote 2016 创建。
基础 -- java笔记12--设计模式
设计模式概述:前人总结的一些解决问题的思想,设计模式不是技术而是思想;
23种设计模式:
创建型模式:
工厂方法
单例 :设计模式–单例.note
抽象工厂、建造者、原型
结构型模式:
适配器
装饰器
代理 :设计模式–代理.note
桥接、组合、外观、享元
行为型模式:责任链接、命令、解释器、迭代、中介者、备忘录、观察者、状态、策略、模板方法、访问者
参考https://www.cnblogs.com/magee-khl/p/7491813.html
集合框架 -- ArrayList
[TOC]
ArrayList底层封装了一个Object[],长度可变,如果未指定长度默认为10,当新增的元素没有空间存放的时候,扩容为原本的1.5倍,线程不安全;
构造方法ArrayList(int initialCapacity);
ArrayList();
ArrayList(Collection<? extends E> c);
三种方式进行初始化,第二种一开始是创建的空数组在添加元素的时候才会初始化为长度10
扩容两种扩容方法,上面构造方法中说了一种,第二种在add方法中,判断数组长度不足调用grow方法进行扩容,在newCapacity方法中,会将数组长度扩展1.5倍,然后将老数组复制过来
线程安全从源码上可以看到增减操作都没有做任何安全性限制
那么如何实现线程安全呢:
通过synchronized关键字
创建ArrayList对象的时候采用Collections类中的静态方法synchronizedList(new ArrayList<>()),推荐使用这个
还有一个叫Vector线程安全类,不过已经不怎么使用了,11里面已经找不 ...
集合框架 -- HashMap
HashMap描述一下java中HashMap的实现,HashMap是用来存储键值对的,实际存储的时候通过key算出hash值,内部有一个数组将数据都存储在这个数组上,如果同一个位置有多个数据需要存储的时候用链表进行存储,链表长度达到8会转为红黑树
部分源码public class HashMap<k,v> extends AbstractMap<k,v> implements Map<k,v>, Cloneable, Serializable {
private static final long serialVersionUID = 362498820763181265L;
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量
static final float DEFAULT_LOAD_FACTOR = 0. ...
2019 -- java基础
[TOC]
一、数据类型基本类型
byte
char
short
int
long
double
float
boolean
包装类
Byte、Character、Short、Integer、Long、Double、Float、Boolean
==所有的包装类都是final修饰的,为什么???==
==基本类型存在的意义是什么,为什么不直接用包装类,万事万物皆对象,为什么还要有基本数据类型==
基本数据类型除了Boolean以外都是可以相互转换的,但是由于各自占的空间大小不同,高精度转换为低精度时可能会丢失,而且他是直接通过位来截断的,可能会被转得面目全非,所以最好不要轻易进行降精度的转换
int到Integer的转换
Integer a = 1;
int b = a;
// 包装类转基本数据类型
int b = a.valueOf(1);
int c = 1;
Integer d = c;
// 基本数据类型转包装类
Integer d = c.intValue(1);
空指针
Integer a = nul ...
2019 -- why
断言
aop ioc spring
位运算:2<<3 将2左移3位相当于28 2乘2的3次方,这也是28的最优效率的计算方式,同样的任何数乘上2的倍数的时候都可以使用位运算来进行
数据库中日期类型的默认值该如何设置
在创建表的时候考虑字段取最能节省空间的类型
字段中存储特殊字符(表情)要调整表的编码格式
数据库通过两个字段进行查询的时候可否只给第一个字段建立索引
2019 -- 并发
[TOC]
一、线程状态转换以前记录的状态创建、可运行、运行中、阻塞、死亡;这几个很好理解,创建就是线程对象被创建,但是还没有调用start方法来开启,而开启之后也不是立马就能得到执行的,是否执行取决于CPU调度,这时就是可运行状态,得到CPU调度之后叫做运行中,而线程在运行中因某些原因不能继续运行时叫做阻塞,当线程执行完run方法后认为它死去
更详细的版本
新建:创建后尚未启动
可运行:可能在在运行也可能在等待CPU时间片
阻塞:等待获取一个排它锁,如果其他线程释放了锁就会结束此状态(阻塞和等待的区别在于,阻塞是被动的在程序运行的时候出现不被开发者控制的,等待是主动的编码的时候就已经确定了)
无限期等待:等待其他线程显式的唤醒,否则不会被分配CPU时间片,下面整理了会进入这个状态的情形和退出的方法(关于这些内容的详细解释留在下面的内容中)
没有设置Timeout参数的Object.wait()方法,退出Object.notify()/Object.notifyAll()
没有设置Timeout参数的Thread.join()方法,被调用的线程执行完毕
Lock ...
2019 -- 摘录
[TOC]
面试摘录java平台的理解
一次书写,到处运行,跨平台性
垃圾收集
解释执行,通常是javac编译为字节码文件,虚拟机将字节码转换为机器码;但是常见的虚拟机都提供了动态编译器运行时将热点代码编译成机器码,这个时候是解释执行
语言特性:泛型、IO、网络、并发安全等基础类库
JVM的一些概念,常见的垃圾收集器
这里很好奇PHP是怎么做到的热更新
exception和error的区别
都继承了Throwable类
尽量不要直接捕捉Exception这样的通用异常,给出明确的异常和处理更清晰
异常信息的打印一定要有明确的日志
大家认为java的异常设计存在缺陷,第一是大多数情况下我们捕获异常后都不可能恢复程序运行,第二是不兼容functional编程
try catch会有额外的性能消耗影响JVM对代码的优化,所以尽量不要直接包含一大段代码;第二是不要用来做流程控制,因为性能远低于if else
java没实例化一个exception都要对栈做快照,这个过程性能消耗很大
final、finally、 finalize的不同
fin ...