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

    xiaoxiao2022-06-30  149

    时光飞逝,转眼已入行三年之久,此时的心情说实话五味杂陈。

    当你经历过一次工作变动,你才知道你到底是一个怎样的人,你在行业处于一个什么样地位,你有什么是让企业给你行业标准薪资又或者说高于标准薪资的能力?当你经历过这些,你才知道自己到底有几斤几两。本篇微博算是一次总结,希望在今后能够在工作中,年限在增长,经验与能力也要与之匹配。

     

    基本语法:

    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的键值可以为null,HashTable不能不null,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类中的方法以及每个方法的作用 这些其实要求蛮高的,是值得的--不仅仅是为了应付面试。 ---------------------  作者:小提提la  来源:  原文:https://blog.csdn.net/weixin_40986207/article/details/79703296  版权声明:本文为博主原创文章,转载请附上博文链接!


    最新回复(0)