2020 - 面试刷题 ING(java基础知识点巩固)-- 答案整理

2020 - 面试刷题 ING(java基础知识点巩固)_开发小头目的博客-CSDN博客

1.JAVA入门知识点分析

  1. 是一种编程范式,从程序设计角度理解:面向对象编程是把构成问题的各个事务分解成各个对象,通过对象行为和状态变化来描述事务的发展

  2. 8种

  3. 访问修饰符 & 属性类型 & 名称..

  4. 都可以做属性类型|都可以有属性,都可以被继承

  5. XX

  6. XX

  7. XX

  8. XX

  9. 类-单继承、接口-多继承、抽象类 :父类未实现的方法,需要在子类实现,接口间继承无需关注方法实现

  10. 方法实现

  11. 4种 , public | protect |缺省 | private

  12. 控制权限

    publicprotect缺省private
    非同包Y
    同包YY
    继承YYY
    自己YYYY

  13. 修饰类:静态类 | 修饰属性:表示类属性|修饰方法:表示类方法

  14. 类:无法继承|属性:无法修改|方法:无法重写

  15. 方法有4种: java 创建对象常见的几种方式_stone_tomcat的博客-CSDN博客_newinstance会触发构造方法吗?

    1. new - 构造函数

    2. Class.forName.newInstance | 通过Class获取constructor方法,然后getInstance()

    3. Object.clone()

    4. 序列化

  16. ++i :先加一后返回引用 |i++ :先返回引用在加一

  17. = 是赋值,==是引用比较

  18. 有3种

    1. int[] a = new int[2];

    2. int[] a=new int[]{1,2,3};

    3. int a = {1,2,3};

  19. 2种

    1. new String("ABC");

    2. ="ABC"

  20. Object, 所有类都继承他,都可以使用它的方法

  21. List | set | map

  22. 连续空间和非连续空间

Java基础知识

Java基础语法

  1. 对象三大特性:继承|封装|多态

  2. 建立在继承基础上,子类重写父类方法,在初始化对象的时候 :父类声明子类实例

  3. 重写方法:参数,方法名都保持一致 | 重载方法:方法名一致,入参必须不一致

  4. 基本类型|引用类型

Java基本数据类型

  1. 8种

    byteshortintlongfloatdoublecharboolean
    对应包装类ByteShortIntegerLongFloatDoubleCharBoolean
    对应字节bit数8163264326488
  2. 不能

  3. 见问题一答案

  4. 16 | 32

  5. false | 0

  6. 不能,反之可以,大空间可以放小数值,小空间放大数值会丢失数据

  7. -2^31 ~ 2^31-1

  8. byte : 中文名字节,日常使用,一个byte=8个bit,2个byte可以存放一个中文 | bit :中文名二进制位 ,存放0/1,是计算机的语言,

  9. 见问题一答案

  10. 见问题六答案

  11. ASCII 码表

  12. 向0的方向靠近

  13. 1

  14. 取余数和取模的区别:以 -9取5 为例子

    1. 取余数向0靠近,取模向负无穷靠近

    2. -9 除 5 = -1.8

    3. 取余数:-9 - (-1)5 = -4. | 取模: -9-(-2)5=1

Java包装类

  1. Object有13个方法:clone | serialize | finalize | toString |hash| equals | wait |wait(Time)|wait(T,U)| notify | notifyAll | getClass

  2. clone是浅copy , 序列化是深copy

  3. finalize 是给回收对象最后一次逃逸机会

  4. Integer 是int类型包装类

  5. 四句口诀:

    1. Integer x= 123 等价于 Integer x = Integer.ValueOf(123 );

    2. x == (Integer) 123 与1条件等价

    3. int x = 123 拆箱操作,任何数值与x比较等于数值大小比较

    4. x == 123 与3条件等价

  6. YES,反射,属性私有化方法授权控制

  7. 不能

  8. 不能

  9. split | contains | replace | replaceAll | length | equals | hash |

  10. 字符串直接赋值:创建会先去常量池中捞取,如果有直接取地址,new每次必会创建新空间分配

  11. 三句口诀:

    1. "a". 是常量池直接分配

    2. "a"+"b" 也是常量池直接分配

    3. "a" + B , 只要涉及对象,就会进行new StringBuffer 对象拼接

  12. stringbuffer现场安全,使用synchronize修饰

  13. indexOf 获取匹配的第一个字符串索引位置

  14. 都是匹配替换所有,但是replace是进行字符串匹配,replaceAll是进行正则表达式匹配

  15. 不能

  16. 将字符串写入常量池

Java集合容器

  1. 初始化方式|长度是否固定|存储类型|存储空间 | 操作效率(详情见问题传送门)

  2. List :ArrayList | linkedList , set : hashSet | TreeSet , Map:HashMap |TreeMap

  3. 一个是接口,一个是工具类

  4. 一个是迭代器 iterator , 一个是迭代接口,实现该接口需要实现迭代器

  5. 排序接口有int ComPare(B),和 Compare(A,B) ,但是如果返回

    1. 大于0,表示A|B的顺序需要调换

    2. 等于0可以不动可以换

    3. 小于0不动

  6. Collection的方法需要传入删除值,然后是先去遍历找到对应的值删除,iterator是迭代的过程中进行remove,至于删除哪个值,remove不关注

  7. list可重复,有顺序,有get方法 , set不可重复,无序,无get方法

  8. list可重复,有顺序,可存储null,Map无序,key不能重复,key只能存一个null,val可以存多个null

  9. 内存空间上是连续,查询数组的快,可直接定位。增|删:链表方便,数组需要移动数据位置(除了头尾增删)

  10. 不安全| 例子??

  11. CopyOnWriteArrayList是写队列,写时有锁,读时无锁使用的是读写锁

  12. set不允许重复,用户集合搜集

  13. hashset是根据hash计算值去重,treeset通过树形结构去重

  14. size , interator, add | remove, stream

  15. put | get ,keysets,values |foreach

  16. key和val都能存null,但是key只能存一个null

  17. 16, 当存储值大于 16*0.75

  18. put会先进行 hash值计算获取数组index位置,然后判断是否已经存在值了,如果不存在,直接初始化链表,插入val值|如果存在,从头到尾判断key是否重复:重复进行更新|匹配到最后如果不重复,就在尾部插入值(拉链法解决hash冲突)

  19. get就是put的逆过程

  20. size获取key的值

  21. 安全问题

  22. CurrentHashMap是安全的,比hashTable高效

  23. hashMap底层是数组加链表,1.8之后底层是数组+链表|红黑树

  24. 同1.7,hash的方式有变化,增加红黑树与链表的转换

  25. 同1.7,后续记录都以1.8为主

  26. 同1.7,后续记录都以1.8为主

  27. 拉链法

  28. 1.7不做记录,后续记录都以1.8为主

  29. 1.7不做记录,后续记录都以1.8为主

  30. 1.7不做记录,后续记录都以1.8为主

  31. 1.7不做记录,后续记录都以1.8为主

  32. 通过CAS + Volatile 和Synchronize , 目前JDK团队对Synchronize 的优化已经不输AQS

  33. CAS + Volatile

  34. Node节点数量 > 64 这个前提下,链表大于8开始转为红黑树,树小于6转为链表

  35. 1.8的并发度由数组长度决定,1.7固定大小16,有segment决定

  36. put操作:

    1. 先计算hash值,确定操作 Node[]数组的位置 index

    2. 如果数组为空,先初始化数组 Node[]

    3. 设置初始head值在index位置 - CAS + Volatile

    4. 使用Synchronize :

      1. 设置链上数据,如果key相同,就是更新,如果没有重复key,就存放val到尾巴上。(拉链法,尾插)

      2. 插入的方式根据当前结构:链表结构插入|树形结构插入

      3. 进行链表和树的转化判断

    5. 判断是否需要扩容

  37. get操作:计算hash,获取链|树的数据

  38. size,先进行2次不加锁的查询,如果还没有成功,就进行lock获取

  39. 跳表结构是多层索引结构---跳表的复杂度是 O(LogN)

  40. 加快查询速度

  41. 空间还时间

  42. 先排序,二分查询

  43. 红黑树的5条规则------红黑树的查询复杂度是树的深度

    1. 节点非红即黑

    2. 根节点必黑

    3. 叶子节点必黑

    4. 兄弟节点的颜色相同,红色节点下是2个黑色节点

    5. 任何节点到左右叶子节点的黑点数量相同

  44. 通过左旋右旋,靠近平衡二叉树

  45. XXX

Java工具类

  1. X

  2. X

  3. X

  4. X

  5. X

Java运算符/循环结构

  1. X

  2. X

  3. X

  4. X

  5. X

  6. X

  7. X

Java反射

  1. 上边已经回答过 ,4中方式

  2. 在运行期间,对任意类都能获取其属性信息和调用类方法的机制

  3. 对象.class | 类名的getClass

  4. 先获取Class对象,然后通过getFileds和getMethods获取

  5. 先获取Field,然后设置access=true,然后进行设置

  6. 有使用,都使用了

  7. 是的,定义注解类,通过Class类的getAnnotation() 方法获取注解上的信息,然后定义注解需要执行的逻辑

Java流IO

  1. X

  2. X

  3. X

Java错误/异常 (顶层异常接口类ThrowAble,只有实现它才会被cache)

  1. throwAble接口

  2. throw是动作放在cache中,表示抛出异常,throws放在方法上,表示往上抛异常

  3. Exception表示所有异常,RuntimeException表示运行时异常

  4. 编辑器表示在编译过程中就能识别,需要捕获的异常 | 运行时异常,编译器无法识别,需要代码运行才能发现的异常

  5. OOM | StackOverFlow | IOException | FileNotFoundException | ClassCast | SqlException | NullPoint | IndexOutof | ClassNotFound..

  6. Error 无需捕获,出现就表示程序已无法运行 | Exception 可捕获,出现程序还可继续运行

  7. XX

  8. 报错,范围大的异常需要在后边,否则后续异常永远都运行不到 --- 编译器报错

Java线程知识

  1. 增加CPU的利用率,提高程序性能

  2. 时间片轮转的一种古老的算法,表示将cpu的运行权分隔成一块块的时间,每个进程轮流分配

  3. 并行时线程同时处理的数量,并发时单位时间内有多少线程运行

  4. 协作式,系统来分配CPU时间片归属

  5. XX

  6. new Thread , runnable callable

  7. 有run方法和start方法,有sleep方法和interrupt方法,还有threadlocal

  8. runnable

  9. run只是普通方法,start表示启动新的线程

  10. 有无返回值

  11. 通过get方法获取

  12. 线程池提交线程任务后,可以通过Future获取

  13. XXX

  14. XXX

  15. ready - running - block / Wait / WAIT TIMEOUT --- terminated

  16. synchronized的Object对象锁,wait线程阻塞进入WAIT状态, notify唤醒任意阻塞的线程,notifyAll唤醒所有阻塞线程

  17. sleep休眠会占用CPU资源,wait阻塞会释放CPU资源

  18. 一个是执行中断,一个是中断状态

  19. interrupt,安全中断

  20. 临界资源互相占有,但是友互相等待对方释放

  21. synchronized基本类型无法使用,引用类型数据可以使用

  22. 都可以

  23. volatile修饰的属性可以保证数据可见性,synchrnized保证对象的可见性,数据一致性,操作原子性

  24. 线程局部变量

  25. XXX

  26. XXX

  27. 减少线程创建造成的资源消耗,复用线程

  28. coreThread | maxThread|TimeOut | BlockQueue | ThreadFactory | RejectRefrence

  29. IO密集型:Core线程数可以开高一些CPU数*N | CPU密集型:core线程数控制在CPU核 *1

  30. 看任务性质选择,有界 OR 无界

  31. 拒绝策略是为了防止任务堆积,出现服务停止。 拒绝策略按照任务性质选择,最好自定义实现,做好日志记录

  32. 先进先出,队列为空时,弹出动作会阻塞 | 队列满时,压入队列动作会阻塞

  33. 见上一条问题回答

  34. 延迟到期才会弹出

  35. add | put | offer | remove | pull | take

  36. XXX

  37. XXX

  38. cas | reentrantLock | readWriteLock |

  39. cas 乐观锁 ,竞争少 , SYC悲观锁,竞争多

  40. CAS 竞争多的时候,CPU消耗高,ABA修改,增加版本号控制

  41. ReetrantLock

  42. 实现抽象类AQS,可行方法,tryAcquire ,tryRelease

  43. try finally

  44. 在tryacquire动作中最新进入的任务是否直接取竞争锁,区分公平与非公平

  45. 是否可重入通过state 是否可以大于1来区分,重入几次,state就等于几

  46. 读写锁,读写隔离,读锁可重入,写锁与写锁不可重入,写锁与读锁不可重入

  47. AQSXXX

  48. XX

  49. XX

  50. XX

  51. XX

  52. XX