一名中级JAVA需要掌握的知识点

基本语法:

Static,Transient,foreach循环的原理,Switch,java反射机制,单线程安全类demo,常规算法等关键字作用,至少掌握其用法和场景

Exception和Error区别

Exception是程序错误,可控或不可控,可在程序中捕获异常

Error是系统异常,不可控,可能的话可在系统中捕获异常

java.util.Date和java.sql.Date的区别及应用

java.util.Date 就是在除了SQL语句的情况下面使用

java.sql.Date 是针对SQL语句使用的,它只包含日期而没有时间部分,它都有getTime方法返回毫秒数,自然就可以直接构建

java.util.Date 是 java.sql.Date 的父类

java.util.Date d = new java.util.Date(sqlDate.getTime());

java.util.Date d=new java.util.Date (date.getTime());

集合

 

集合的结构

其中ArrayList和HashMap用到特别多,也是被问到特别多的地方

 ArrayList原理

以数组实现。节约空间,但数组有容量限制。

超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。

按数组下标访问元素—get(i)/set(i,e) 的性能很高,这是数组的基本优势。

直接在数组末尾加入元素—add(e)的性能也高,但如果按下标插入、删除元素—add(i,e), remove(i), remove(e),则要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。

特点:

是一个相对来说比较简单的数据结构,最重要的一点就是它的自动扩容,可以认为就是我们常说的“动态数组”。

其中操作可以理解为直接将数组的内容置位,remove操作可以理解为删除index为0的节点,并将后面元素移到0处

add函数:

当我们在ArrayList中增加元素的时候,会使用add函数。他会将元素放到末尾,其实最核心的内容就是ensureCapacityInternal。这个函数其实就是自动扩容机制的核心

过程:

如果ArrayList的大小已经不满足需求时,那么就将数组变为原长度的1.5倍,之后的操作就是把老的数组拷到新的数组里面。

set和get函数:

Array的put和get函数就比较简单了,先做index检查,然后执行赋值或访问操作:

remove函数:

先做index检查,然后执行删除操作

LinkedList原理:

Hashtable原理:

HashMap原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。

当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。

当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。

碰撞:

HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对

负载因子:

默认负载因子大小0.75

当map填满75%的bucket时候,和其他集合类一样(ArrayList)将会创建原来HashMapda大小两倍的bucket数组

重新调整map大小,并将原来的对象放入新的bucket数组中,此过程称之为rehashing

 ConcurrentHashMap 原理:

HashSet原理:

ArrayList和L‌‌inkedList的大致区别:

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

HashMap和HashTable和ConcurrentHashMap区别

HashMap线程不安全,HashTable线程安全,ConcurrentHashMap线程安全

HashMap的键值可以为,HashTable不能不,ConcurrentHashMap不能为空

HashMap是HashTable的轻量级实现

HashMap相比HashTable快,因为HashTable是同步,ConcurrentHashMap锁分段技术

多线程场景HashMap可能会造成死循环,导致cpu利用率100%

HashTable容器是同步,会造成阻塞、轮训,ConcurrentHashMap的分布式锁,快、安全

集合为什么不直接实例化接口

Set set =new HashSet()而不是Set set = new Set()  

Map map = new HashMap()而不是HashMap map = new HashMap()

List list = new ArrayList()而不是ArrayList list = new ArrayList();

1.Set,List,map是接口,不能实例化,只能实例化接口实现类,HashSet,ArrayList,HashMap

2.实现类中的属性和方法set,map,list不能调用,只能调用接口本身属性和方法

3.接口有多个实现类,便于代码的重构,以后只需改实现类,其他可不变

Eg:我是老板A,有两个员工B,C。我现在有一个任务,目的是完成任务,须根据我的想法授权于B或者C,不能让B自己按自己想法完成(B b= new B()),若后面老板想换人(A a= new C())

集合转数组

List list = new ArrayList();

String[] str =  (String[]) list.toArray(new String[list.size()])

数组转集合

String [] str = {"1","1","1","1"};

List list = Arrays.asList(str);

框架:

面试必问的东西。一般来说会问你一下你们项目中使用的框架,然后给你一些场景问你用框架怎么做,比如我想要在Spring初始化bean的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做、MyBatis中$和#的区别等等,这些都比较实际了,平时积累得好、有多学习 框架的使用细节自然都不成问题。

如果上面你的问题答得好,面试官往往会深入地问一些框架的实现原理。问得最多的就是Spring AOP的实现原理,当然这个很简单啦,两句话就搞定的的事儿,即使你不会准备一下就好了。我遇到的最变态的是让我画一下Spring的Bean工厂实 现的UML图

至少,要对用过的框架原理要熟知

Spring IOC和AOP原理,如何自己实现IOC,AOP

SpringMVC原理

Springboot原理

Spring cloud原理

Dubbo原理

MyBatis原理

Redis原理

数据库

数据库十有八九也都会问到。一些基本的像right join、full  join、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,如果对于数据库的性能优化一窍不通,那么有时间,还是建议你在面试前花一两天专门 把SQL基础和SQL优化的内容准备一下。
不过数据库倒是不用担心,一家公司往往有很多部门,如果你对数据库不熟悉而基本技术又非常好,九成都是会要你的,估计会先把你放到对数据库使用不是要求非常高的部门锻炼一下。

Java虚拟机
《深入理解Java虚拟机:JVM高级特性与最佳实践》
Java虚拟机中比较重要的内容:
(1)Java虚拟机的内存布局
(2)GC算法及几种垃圾收集器
(3)类加载机制,也就是双亲委派模型
(4)Java内存模型
(5)happens-before规则
(6)volatile关键字使用规则

设计模式
设计模式在工作中还是非常重要、非常有用的,23种设计模式中重点研究常用的十来种就可以了,面试中关于设计模式的问答主要是三个方向:
(1)你的项目中用到了哪些设计模式,如何使用。
(2)知道常用设计模式的优缺点。
(3)能画出常用设计模式的UML图。

多线程
因为三年工作经验,所以基本上不会再问你怎么实现多线程了,会问得深入一些比如说Thread和Runnable的区别和联 系、多次start一个线程会怎么样、线程有哪些状态。


假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
聪明的网友们对这个问题是否有答案呢?不难,java.util.concurrent下就有现成的类可以使用。
另外,线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。
最后,虽然这次面试问得不多,但是多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、 synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等。


JDK源码
要想拿高工资,JDK源码不可不读。上面的内容可能还和具体场景联系起来,JDK源码就是实打实地看你平时是不是爱钻研了。我面试过程中被问了不 少JDK源码的问题,其中最刁钻的一个问了我,String的hashCode()方法是怎么实现的,幸好我平时String源代码看得多,答了个大 概。
JDK源码其实没什么好总结的,纯粹看个人,总结一下比较重要的源码:
(1)List、Map、Set实现类的源代码
(2)ReentrantLock、AQS的源代码
(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的
(4)线程池的实现原理
(5)Object类中的方法以及每个方法的作用
这些其实要求蛮高的,是值得的--不仅仅是为了应付面试。

下面推荐是技术名称:

java 
  spring(工作原理) 
  springboot 
  mybatis 
  设计模式(集合jdk或者spring中涉及模式的应用深入理解) 
  Log4j 
  数据库 
  目前使用最多还是mysql,虽然单机性能比不上oracle,但免费开源,单机成本低且借助于分布式集群,可以有强大的输出能力。 
  连接池 
  事务 
  乐观锁&悲观锁 
  分库分表 
  id生成器 
  DAO层接口性能监控 
  读写分离 
  sql技巧 
  其它 
  web容器/协议/网络 
  负载均衡之LVS 
  Nginx 
  tomcat 
  http协议 
  CDN 
  常用三方工具包 
  GoogleGuava 
  fastJson 
  log4J 
  commons-codec 
  commons-lang3 
  commons-io 
  Quartz 
  HttpClient 
  Javassist 
  系统架构 
  架构经验 
  经典案例 
  编码前3000问 
  性能优化之Qps 
  cache相关 
  分布式锁 
  中间件 
  RPC框架 
  dubbo 
  dubbox 
  Thrift 
  RPC框架性能比较 
  MQ消息 
  ActiveMQ 
  kafka 
  RocketMQ 
  缓存 
  redis 
  memcache 
  搜索 
  Elasticsearch 
  分布式数据框架 
  cobar 
  tsharding 
  tddl 
  大数据 
  Hbase 
  MogonDB 
  Storm 
  Spark 
  Hadoop 
  Hive 
  配置管理 
  super-diamond 
  disconf 
  其它 
  zookeeper 
  FastDFS(分布式文件系统) 
  mysql数据库binlog的增量订阅&消费组件 
  分布式数据库同步系统 
  项目管理 
  论需求调研的重要性 
  项目生命周期 
  代码规范 
  git常用命令 
  项目管理案例 
  运维 
  快速排查线上问题 
  linux常用命令 
  本地代码调试 
  个人成长 
  个人成长与职业规划 
  学习网站 
  infoQ(可以在网站发稿挣钱) 
  云栖社区 
  并发编程网 
  开源中国 
  stackoverflow 
  网易云课堂 
  程序员素养 
  Tom的读书单

猜你喜欢

转载自blog.csdn.net/qq_39827935/article/details/86672396