Java后台面试知识点个人总结

对于计算机的应届研究生来说,面试时考察的东西无非是一些基本的知识点。一个真正成熟的企业的面试官不会对你的项目经验抱有太高的期望,也不会抓着面试学生的项目问个不停甚至过深。他们认为基础是更加重要的,毕竟进入公司后还要从头学起。
这里,我也在一边面试,一边总结经历过的问题,希望对读者有用。
内容不断更新中……

JVM

1.GC

垃圾回收是java对内存的管理的一部分,而且不同的虚拟机对垃圾回收有着不同的算法。垃圾回收答题分三个部分:
1)  识别废弃对象(如何判定垃圾)
引用计数法:
引用链法:
    GC Root:
    什么适合成为GCRoot?
2) 垃圾收集算法
标记清除(mark-sweep)
复制(copy)
标记整理
分代回收

3) 垃圾收集器

2.jvm内存自动管理机制

jvm管理的内存区有较强的区域性,主要有:程序计数器,虚拟机栈,本地方法栈,堆,方法区,运行时常量池等几块区域。
重点需要掌握的是:虚拟机栈、堆和方法区以及它们之间的功能协调。很多人认为方法区是堆的一部分,但从职能角度来讲并不准确,
根据《深入理解java虚拟机》,方法区还是应独立出来,同时其也有个名字,叫做“非堆”。
虚拟机栈的空间分配与消失、堆的作用与分配等等,都有必要了解清楚。

3.类加载及对象实例化过程

从类加载到对象被实例化成功的过程主要有三步:加载、链接、初始化。
当程序运行到new字段的时候(不仅限于new字段,目前知道new即可),会检查对应的类是否被加载过(在方法区中的类文件区域),
如果没有,则首先将对应类的文件加载,然后进行连接与初始化。

详见Java类加载相关知识

4.类加载的规则

双亲委派机制。

详见Java类加载相关知识

5.反射

在运行状态下,任何一个类,都能通过反射获得它的所有属性和方法(包括private),因此,反射具有动态获取类信息,构造类对象的功能。
每一个类都有一个Class类与之对应,该Class类可以得到类的“成员变量对象”(Field),
“构造方法对象”(Constructor)和“成员方法对象”(Method)。并通过这三个对象操作实例。
获取class文件对象的方法:
1. Object.getClass()//对于同一个类,getClass()得到的是同一个。
2. 类名.class;  //数据类型的静态属性,所有的类都有.class。
3. Class类中的静态方法:public static Class forName(String className); //参数中className一定要是全限定名。
一般使用哪一种?为什么?
在开发情况下,推荐使用第三种:Class.forName(String className);
因为参数是String类型,可以配置。
通过反射获取无参构造方法并使用:
Class class = Class.forName("ClassName");
Constructor[] cons = class.getConstructors();//得到所有public构造方法对象
Constructor[] allCons = class.getDeclaredConstructors();//得到所有构造方法对象
//得到默认无参构造方法对象并构建实例:
Constructor defaultCons = class.getConstructor();
ClassName classNameInstance = (ClassName)defaultCons.newInstance();//得到实例是Object类型,需要强制转换。

//得到带参构造对象并构建实例:
Constructor co = class.getConstructor(String.class, int.class);
Object o = co.newInstance("str",22);//得到实例是Object类型,需要强制转换。

//得到private构造对象:不能使用上述方法,而要如下设置:
class.getDeclaredConstructor(String.class);
class.setAccessable(true);//用于取消访问控制

Java语言

0.基础知识

哈希表解决冲突的方式
TCP:三次握手四次挥手
接口和抽象类的区别
重写和重载
构造器可否被重写?可否被重载?
StringBuilder和StringBuffer
equals与hashcode(为什么说最好要改一块改?)

1.容器

ArrayList扩容原理
LinkedList结构和原理
HashMap的底层实现原理
HashSet的底层实现原理
LinkedHashMap的实现原理与用途(LRU)
ConcurrentHashMap原理和使用

2.线程

###多线程有几种声明方式
    三种,其中常用的两种,分别为Thread,Runnable和Callable。
    Thread是类,其余两个都是接口。使用Runnable和Callable的好处就在于,
    一个类是可以实现多个接口的,而它只能继承一个类,Java语言限定一个类只能单继承。
    Runnable是没有返回值的,但是它可以作为new Thread()的构造参数;
    而new Thread()并不支持把Callable作为构造参数。
    Callable是拥有返回值的,返回的类型是Future<T>,当Callable类对象在执行完call()方法之前,
    对Future<T>调用get()方法是会阻塞的。这样即可形成对线程的运行结果加以控制。

###为何wait(),notify()和notifyAll()方法都在Object上而不是Thread
    因为它们的调用都是基于锁住的资源对象的。锁住的其实是竞争的资源对象,
    如果这些方法放在Thread中,将会很难通过对竞争资源进行线程管理。
###线程间通信(wait、notify、notifyAll、await、signal、signalAll)
###同步与锁(synchronized与lock)
###内置锁(synchronized)有几种修饰
###lock的细化(ReentrantLock )
###使用lock的注意事项
###sleep和wait的区别
    sleep:Thread方法;必须指定时间;不释放锁
    wait:Object方法;可以有时间参数也可没有;释放锁
###CountDownLatch
###Barrier
###Semaphore
###死锁(同步嵌套)
###线程的极大状态和转化图例
###

4.java异常体系
5.设计模式

单例模式:4种,懒汉、饿汉、内部类和枚举实现。
抽象工厂:
装饰模式:
模板模式:

6.框架
7.其他

短连接
内存溢出如何排查?
mvc模式什么时候不适用?
spring的好处;为何使用容器管理bean比程序自身new一个bean要好?
如何统计一篇文章数量最多的几个单词的数量?

算法题目总结

sort

冒泡排序
选择排序
插入排序
快速排序
堆排序
*外部排序

链表逆序

求一个矩阵中最大的二维矩阵(元素和最大),如:
|1|2|3|4|5|
|2|3|4|5|1|
|1|1|5|3|0|
中最大是:
|4|5|
|5|3|

求数组中出现次数超过一半的数字(可能存在,一定存在两种变种)。

在一棵二叉树中,有且仅有一个叶子节点错连到了其他节点上,请找出这个叶子节点。

将String转换成int。

实现LRU算法(使用数据结构或自己实现)

给定一棵二叉树,求出每一层节点的最大值。

一个数组里只有1,0,-1三种数字。请用最快的时间复杂度让这三个数实现从左到右依次为-1连续区域,0连续区域和1连续区域。

判断x是否是2的N次方

a,b两数字交换

求a,b两个数的较大值(较小值)

求x与y的平均值(x&y+[(x^y)>>1])

使用两个栈实现队列

使用两个队列实现栈

一个向右、向下递增的矩阵,查找某个数是否在其中

数据库

数据库事务的隔离级别
索引相关

项目经验相关

Java内存泄露
redis和memcache区别
redis持久化
一致性哈希

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值