java的一份面试题

前言:

2017.04 月份,朋友推荐了一份面试题给我看,后面在简书上也搜索到了一样的题,发表时间是2016年,比我拿到的早,我把题目和我做的答案贴出来,答案有不完整的,和大家一起完善一下。

1.实例方法和静态方法有什么不一样?

静态方法是所有实例共享的,可以不创建实例调用,存放在 xxx区

实例方法需要创建对象,通过对象引用才能调用,存放在 xxx区

2.Java 中的异常有哪几类,分别怎么使用?

编译时异常和运行时异常

3.常用的集合类有哪些?比如 List 如何排序?

4.ArrayList 和 LinkedList 内部的实现大致是怎样的?他们之间的区别和各自的适用场景是什么?

5.内存溢出是怎么回事?

OOM Error : PermGen space 永久区的大小不够, 加载不了那么多的jar 和 class

OOM Error : Java heap space 堆空间 , 创建了太多对象,在垃圾回收之前已用满了,两个思路: 一个是查看程序是否存在重复创建对象; 二是启动时加大堆空间 Xms(初始) , Xmx(最大)

OOM Error : unable to create new native thread

创建的线程数过多,超出了系统限制 Linux 使用 ulimit -u 查看

给虚拟机分配的内存过大,

6.ClassLoader 有什么用?

类加载器 : BootstrapClassLoader -- jre ; extension classloader 扩展类 app classloader 应用类 customer classloader 自定义加载器

使用了双亲委托模型 , app -> extension -> bootstrap

7.== 和 equals 的区别?

== 对基本数据类型,进行的是值的比较 , 对于引用类型,只在引用地址一致时为true

equals 是对象进行比较 , Object中是 == ,可进行重写自定义 equals

8.hashCode 方法的作用?

在 Map 读取时,会根据hashCode值进行散列, 需要注意 hashCode 冲突,选择合适的属性进行散列

9.Object 类中有哪些方法?列举三个以上.

clone

toString

equls hashCode

getClass

10.NIO 是什么?适用于何种场景?

相对标准的IO 基于字节流和字符流进行操作的,NIO 是基于通道 Channel 和 缓冲区(Buffer) 进行操作,数据从 Channel 读取写到 Buffer , 或者从Buffer 读取,写入Channel

服务器 web java 后端 : Tomcat , Jetty ,Netty

文件读写 : FileChannel

11.HashMap 数据结构、扩展策略,Hash 冲突攻击如何防范,如何实现线程安全的 HashMap?

结构: 数组加链表 : java8 中链表长度超过8 时, 会改成平衡树实现

扩展: resize , 当超过loadfactor 因子时,默认 0.75 , 触发扩展,rehash , 将旧的元素迁移到新的

hash collision attack : 修改hash 非随机算法, 限制post 参数个数,大小 , 防火前检测异常请求

使用 ConcurrentHashMap : CHM 实现采用了 segment 锁 , 8 之后采用的 CAS 技术

哈希冲突解决方法: 链表法(java 当前实现),建立公共溢出区 , 开发定址法。

12.JVM 内存结构,GC 算法,CMS、G1 的原理

13.NIO 模型, select/epoll 的区别,多路复用的原理

14.Java 中一个字符占多少个字节,扩展问int,long,double占多少字节

一个字符占 2 个字节

int 4 个字节

long 8 个字节

double 16 个字节

15.创建一个类的实例都有哪些办法?

new 关键字

Class 类的 newInstance 方法

使用 Constructor 类的 newInstance 方法

使用 clone 方法

使用反序列化

16.final/finally/finalize 的区别?

17.LinkingBlockingQueue 与 ArrayBlockingQueue 的区别,他们的使用场景?

18.Session/Cookie 的区别?

cookie 数据保存在客户端,session 数据保存在服务器端

结合 session id 来说 , cookie 可以临时(或保存若干时间) 服务器的 session id

19.String/StringBuffer/StringBuilder 的区别,扩展再问他们的实现?

String -- 字符串常量池 ,内部使用 char[] , 是 final 类, subString replace 会创建新的String

StringBuilder -- 使用在字符串拼接场景,不用重复new String 对象,append 底层采用了 System.copyarray ,不发生内存拷贝

StringBuffer -- 相比StringBuilder 是一个线程安全的类,操作加上了锁。

20.Java 有自己的内存回收机制,但为什么还存在内存泄露问题呢?

内存回收机制,不能回收掉未被应用使用到的对象. 如创建一些 static map list , 而不注意管理集合中的对象,就容易导致内存泄露

联系回收算法: 可达性分析算法 , 经过至少两次标记不可达, f-queue 队列中 , Finalizer 线程

21.Java 里面用对象作为 Key 需要注意些什么? 如何实现 hashCode?

22.Java 关键词的发音: synchronized volite

上题中某些答案看官们可自行百度,希望对看官们有所帮助。

举报
评论 0