是一种编程范式,从程序设计角度理解:面向对象编程是把构成问题的各个事务分解成各个对象,通过对象行为和状态变化来描述事务的发展
8种
访问修饰符 & 属性类型 & 名称..
都可以做属性类型|都可以有属性,都可以被继承
XX
XX
XX
XX
类-单继承、接口-多继承、抽象类 :父类未实现的方法,需要在子类实现,接口间继承无需关注方法实现
方法实现
4种 , public | protect |缺省 | private
控制权限
public | protect | 缺省 | private | |
---|---|---|---|---|
非同包 | Y | |||
同包 | Y | Y | ||
继承 | Y | Y | Y | |
自己 | Y | Y | Y | Y |
修饰类:静态类 | 修饰属性:表示类属性|修饰方法:表示类方法
类:无法继承|属性:无法修改|方法:无法重写
方法有4种: java 创建对象常见的几种方式_stone_tomcat的博客-CSDN博客_newinstance会触发构造方法吗?
new - 构造函数
Class.forName.newInstance | 通过Class获取constructor方法,然后getInstance()
Object.clone()
序列化
++i :先加一后返回引用 |i++ :先返回引用在加一
= 是赋值,==是引用比较
有3种
int[] a = new int[2];
int[] a=new int[]{1,2,3};
int a = {1,2,3};
2种
new String("ABC");
="ABC"
Object, 所有类都继承他,都可以使用它的方法
List | set | map
连续空间和非连续空间
对象三大特性:继承|封装|多态
建立在继承基础上,子类重写父类方法,在初始化对象的时候 :父类声明子类实例
重写方法:参数,方法名都保持一致 | 重载方法:方法名一致,入参必须不一致
基本类型|引用类型
8种
byte | short | int | long | float | double | char | boolean | |
---|---|---|---|---|---|---|---|---|
对应包装类 | Byte | Short | Integer | Long | Float | Double | Char | Boolean |
对应字节bit数 | 8 | 16 | 32 | 64 | 32 | 64 | 8 | 8 |
不能
见问题一答案
16 | 32
false | 0
不能,反之可以,大空间可以放小数值,小空间放大数值会丢失数据
-2^31 ~ 2^31-1
byte : 中文名字节,日常使用,一个byte=8个bit,2个byte可以存放一个中文 | bit :中文名二进制位 ,存放0/1,是计算机的语言,
见问题一答案
见问题六答案
ASCII 码表
向0的方向靠近
1
取余数和取模的区别:以 -9取5 为例子
取余数向0靠近,取模向负无穷靠近
-9 除 5 = -1.8
取余数:-9 - (-1)5 = -4. | 取模: -9-(-2)5=1
Object有13个方法:clone | serialize | finalize | toString |hash| equals | wait |wait(Time)|wait(T,U)| notify | notifyAll | getClass
clone是浅copy , 序列化是深copy
finalize 是给回收对象最后一次逃逸机会
Integer 是int类型包装类
四句口诀:
Integer x= 123 等价于 Integer x = Integer.ValueOf(123 );
x == (Integer) 123 与1条件等价
int x = 123 拆箱操作,任何数值与x比较等于数值大小比较
x == 123 与3条件等价
YES,反射,属性私有化方法授权控制
不能
不能
split | contains | replace | replaceAll | length | equals | hash |
字符串直接赋值:创建会先去常量池中捞取,如果有直接取地址,new每次必会创建新空间分配
三句口诀:
"a". 是常量池直接分配
"a"+"b" 也是常量池直接分配
"a" + B , 只要涉及对象,就会进行new StringBuffer 对象拼接
stringbuffer现场安全,使用synchronize修饰
indexOf 获取匹配的第一个字符串索引位置
都是匹配替换所有,但是replace是进行字符串匹配,replaceAll是进行正则表达式匹配
不能
将字符串写入常量池
初始化方式|长度是否固定|存储类型|存储空间 | 操作效率(详情见问题传送门)
List :ArrayList | linkedList , set : hashSet | TreeSet , Map:HashMap |TreeMap
一个是接口,一个是工具类
一个是迭代器 iterator , 一个是迭代接口,实现该接口需要实现迭代器
排序接口有int ComPare(B),和 Compare(A,B) ,但是如果返回
大于0,表示A|B的顺序需要调换
等于0可以不动可以换
小于0不动
Collection的方法需要传入删除值,然后是先去遍历找到对应的值删除,iterator是迭代的过程中进行remove,至于删除哪个值,remove不关注
list可重复,有顺序,有get方法 , set不可重复,无序,无get方法
list可重复,有顺序,可存储null,Map无序,key不能重复,key只能存一个null,val可以存多个null
内存空间上是连续,查询数组的快,可直接定位。增|删:链表方便,数组需要移动数据位置(除了头尾增删)
不安全| 例子??
CopyOnWriteArrayList是写队列,写时有锁,读时无锁使用的是读写锁
set不允许重复,用户集合搜集
hashset是根据hash计算值去重,treeset通过树形结构去重
size , interator, add | remove, stream
put | get ,keysets,values |foreach
key和val都能存null,但是key只能存一个null
16, 当存储值大于 16*0.75
put会先进行 hash值计算获取数组index位置,然后判断是否已经存在值了,如果不存在,直接初始化链表,插入val值|如果存在,从头到尾判断key是否重复:重复进行更新|匹配到最后如果不重复,就在尾部插入值(拉链法解决hash冲突)
get就是put的逆过程
size获取key的值
安全问题
CurrentHashMap是安全的,比hashTable高效
hashMap底层是数组加链表,1.8之后底层是数组+链表|红黑树
同1.7,hash的方式有变化,增加红黑树与链表的转换
同1.7,后续记录都以1.8为主
同1.7,后续记录都以1.8为主
拉链法
1.7不做记录,后续记录都以1.8为主
1.7不做记录,后续记录都以1.8为主
1.7不做记录,后续记录都以1.8为主
1.7不做记录,后续记录都以1.8为主
通过CAS + Volatile 和Synchronize , 目前JDK团队对Synchronize 的优化已经不输AQS
CAS + Volatile
Node节点数量 > 64 这个前提下,链表大于8开始转为红黑树,树小于6转为链表
1.8的并发度由数组长度决定,1.7固定大小16,有segment决定
put操作:
先计算hash值,确定操作 Node[]数组的位置 index
如果数组为空,先初始化数组 Node[]
设置初始head值在index位置 - CAS + Volatile
使用Synchronize :
设置链上数据,如果key相同,就是更新,如果没有重复key,就存放val到尾巴上。(拉链法,尾插)
插入的方式根据当前结构:链表结构插入|树形结构插入
进行链表和树的转化判断
判断是否需要扩容
get操作:计算hash,获取链|树的数据
size,先进行2次不加锁的查询,如果还没有成功,就进行lock获取
跳表结构是多层索引结构---跳表的复杂度是 O(LogN)
加快查询速度
空间还时间
先排序,二分查询
红黑树的5条规则------红黑树的查询复杂度是树的深度
节点非红即黑
根节点必黑
叶子节点必黑
兄弟节点的颜色相同,红色节点下是2个黑色节点
任何节点到左右叶子节点的黑点数量相同
通过左旋右旋,靠近平衡二叉树
XXX
X
X
X
X
X
X
X
X
X
X
X
X
上边已经回答过 ,4中方式
在运行期间,对任意类都能获取其属性信息和调用类方法的机制
对象.class | 类名的getClass
先获取Class对象,然后通过getFileds和getMethods获取
先获取Field,然后设置access=true,然后进行设置
有
有使用,都使用了
是的,定义注解类,通过Class类的getAnnotation() 方法获取注解上的信息,然后定义注解需要执行的逻辑
X
X
X
throwAble接口
throw是动作放在cache中,表示抛出异常,throws放在方法上,表示往上抛异常
Exception表示所有异常,RuntimeException表示运行时异常
编辑器表示在编译过程中就能识别,需要捕获的异常 | 运行时异常,编译器无法识别,需要代码运行才能发现的异常
OOM | StackOverFlow | IOException | FileNotFoundException | ClassCast | SqlException | NullPoint | IndexOutof | ClassNotFound..
Error 无需捕获,出现就表示程序已无法运行 | Exception 可捕获,出现程序还可继续运行
XX
报错,范围大的异常需要在后边,否则后续异常永远都运行不到 --- 编译器报错
增加CPU的利用率,提高程序性能
时间片轮转的一种古老的算法,表示将cpu的运行权分隔成一块块的时间,每个进程轮流分配
并行时线程同时处理的数量,并发时单位时间内有多少线程运行
协作式,系统来分配CPU时间片归属
XX
new Thread , runnable callable
有run方法和start方法,有sleep方法和interrupt方法,还有threadlocal
runnable
run只是普通方法,start表示启动新的线程
有无返回值
通过get方法获取
线程池提交线程任务后,可以通过Future获取
XXX
XXX
ready - running - block / Wait / WAIT TIMEOUT --- terminated
synchronized的Object对象锁,wait线程阻塞进入WAIT状态, notify唤醒任意阻塞的线程,notifyAll唤醒所有阻塞线程
sleep休眠会占用CPU资源,wait阻塞会释放CPU资源
一个是执行中断,一个是中断状态
interrupt,安全中断
临界资源互相占有,但是友互相等待对方释放
synchronized基本类型无法使用,引用类型数据可以使用
都可以
volatile修饰的属性可以保证数据可见性,synchrnized保证对象的可见性,数据一致性,操作原子性
线程局部变量
XXX
XXX
减少线程创建造成的资源消耗,复用线程
coreThread | maxThread|TimeOut | BlockQueue | ThreadFactory | RejectRefrence
IO密集型:Core线程数可以开高一些CPU数*N | CPU密集型:core线程数控制在CPU核 *1
看任务性质选择,有界 OR 无界
拒绝策略是为了防止任务堆积,出现服务停止。 拒绝策略按照任务性质选择,最好自定义实现,做好日志记录
先进先出,队列为空时,弹出动作会阻塞 | 队列满时,压入队列动作会阻塞
见上一条问题回答
延迟到期才会弹出
add | put | offer | remove | pull | take
XXX
XXX
cas | reentrantLock | readWriteLock |
cas 乐观锁 ,竞争少 , SYC悲观锁,竞争多
CAS 竞争多的时候,CPU消耗高,ABA修改,增加版本号控制
ReetrantLock
实现抽象类AQS,可行方法,tryAcquire ,tryRelease
try finally
在tryacquire动作中最新进入的任务是否直接取竞争锁,区分公平与非公平
是否可重入通过state 是否可以大于1来区分,重入几次,state就等于几
读写锁,读写隔离,读锁可重入,写锁与写锁不可重入,写锁与读锁不可重入
AQSXXX
XX
XX
XX
XX
XX