2020 - 面试刷题 ING(java基础知识点巩固)_开发小头目的博客-CSDN博客
1.JAVA入门知识点分析
-
是一种编程范式,从程序设计角度理解:面向对象编程是把构成问题的各个事务分解成各个对象,通过对象行为和状态变化来描述事务的发展
-
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
-
连续空间和非连续空间
Java基础知识
Java基础语法
-
对象三大特性:继承|封装|多态
-
建立在继承基础上,子类重写父类方法,在初始化对象的时候 :父类声明子类实例
-
重写方法:参数,方法名都保持一致 | 重载方法:方法名一致,入参必须不一致
-
基本类型|引用类型
Java基本数据类型
-
8种 Java 中的字节(Byte)和位(Bit)以及基本数据类型各占多少字节_java byte bit-CSDN博客
byte short int long float double char boolean 对应包装类 Byte Short Integer Long Float Double Char Boolean 对应bit数(二进制数位) 8 16 32 64 32 64 16 8 byte数(字节数) 1 2 4 8 4 8 2 1 -
不能
-
见问题一答案
-
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
-
Java包装类
-
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是进行正则表达式匹配
-
不能
-
将字符串写入常量池
Java集合容器
-
初始化方式|长度是否固定|存储类型|存储空间 | 操作效率(详情见问题传送门)
-
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
Java工具类
-
X
-
X
-
X
-
X
-
X
Java运算符/循环结构
-
X
-
X
-
X
-
X
-
X
-
X
-
X
Java反射
-
上边已经回答过 ,4中方式
-
在运行期间,对任意类都能获取其属性信息和调用类方法的机制
-
对象.class | 类名的getClass
-
先获取Class对象,然后通过getFileds和getMethods获取
-
先获取Field,然后设置access=true,然后进行设置
-
有
-
有使用,都使用了
-
是的,定义注解类,通过Class类的getAnnotation() 方法获取注解上的信息,然后定义注解需要执行的逻辑
Java流IO
-
X
-
X
-
X
Java错误/异常 (顶层异常接口类ThrowAble,只有实现它才会被cache)
-
throwAble接口
-
throw是动作放在cache中,表示抛出异常,throws放在方法上,表示往上抛异常
-
Exception表示所有异常,RuntimeException表示运行时异常
-
编辑器表示在编译过程中就能识别,需要捕获的异常 | 运行时异常,编译器无法识别,需要代码运行才能发现的异常
-
OOM | StackOverFlow | IOException | FileNotFoundException | ClassCast | SqlException | NullPoint | IndexOutof | ClassNotFound..
-
Error 无需捕获,出现就表示程序已无法运行 | Exception 可捕获,出现程序还可继续运行
-
XX
-
报错,范围大的异常需要在后边,否则后续异常永远都运行不到 --- 编译器报错
Java线程知识
-
增加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