Java面试个人总结200多题(一)

声明:
这是个人面试的总结,很多都是我自己百度的,答案只供大家参考。

一、Java 基础
1.JDK 和 JRE 有什么区别?
JDK 是java 开发工具包,jre是java运行环境,JDK 包含jre

2.== 和 equals 的区别是什么?
==基本数据类型比较的是值。引用数据类型比较的是地址值是否相等。
equals比较的是对象是否相等

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不一定。hashCode()相等即它的哈希值相等。哈希值相等它的键值不一定相等

4.final 在 java 中有什么作用?
A。方法上,方法不能重写
B。类上,类不能被继承
C。变量,变量不能被修改

5.java 中的 Math.round(-1.5) 等于多少?
是-1. 如果Math.round(1.5)则是2

6.String 属于基础的数据类型吗?
不属于。
基本数据类型:
byte,char ,short,int,float,double,boolean,long

7.java 中操作字符串都有哪些类?它们之间有什么区别?
String :字符串常量,不可变对象
StringBuffer:字符串变量,效率比StringBuild慢,线程安全的
StringBuild:字符串变量,效率高,线程不安全的

8.String str="i"与 String str=new String(“i”)一样吗?
不一样,第一个分配到栈中,第二个分配到堆中

9.如何将字符串反转?
reverse()

10.String 类的常用方法都有那些?
split()分割。
substring()截取
trim()去除字符串两端空格
length()字符串长度
equals()
toUpperCase()转换成大写
toLowerCase()转换成小写
replace()字符串替换

11.抽象类必须要有抽象方法吗?
不一定,但是有抽象方法的类一定是抽象类

12.普通类和抽象类有哪些区别?
A。普通类没有抽象方法,可以直接实例
B。抽象类是子类继承的模板,默认访问级别为public,不能直接实例,有抽象方法

13.抽象类能使用 final 修饰吗?
不能,final修饰后不可以被继承,抽象类是用来继承的

14.接口和抽象类有什么区别?
A。抽象类要被子类继承,接口要被类实现
B。接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现
C。抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
D。接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
15.java 中 IO 流分为几种?
字符流:Reader , Writer
字节流: InputStream ,OutputStream
16.BIO、NIO、AIO 有什么区别?
BIO:同步阻塞IO,属于传统IO,模型简单使用方便,处理并发能力低
NIO:同步非阻塞,属于BIO的升级,客户端和服务器端通过通道通讯,实现多路复用
AIO:异步非阻塞,NIO的升级,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制
17.Files的常用方法都有哪些?
Files.exists() 检测文件路径是否存在
Files.createFile()创建文件
Files.createDirectory()创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size()查看文件个数
Files.read() 读取文件
Files.write()写入文件

二、容器
18.java 容器都有哪些?
数组,String,java.util下的集合容器

19.Collection 和 Collections 有什么区别?
Collection是集合的父类。
Collections 是集合工具类,提供了一些方法操作集合,服务于Java的Collection框架。

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式

20.List、Set、Map 之间的区别是什么?
List:有序,可重复
Set:无序,不可重复
Map:无序,key/value方式存储,key唯一,value可以重复

21.HashMap 和 Hashtable 有什么区别?
HashMap:线程不安全,效率高,允许存放Null键值
HashTable:线程安全,效率低,不允许存放空键值

22.如何决定使用 HashMap 还是 TreeMap?
A。如果在Map中插入删除和定位元素,选HashMap
B。如果想要对key进行有序的遍历,使用TreeMap

23.说一下 HashMap 的实现原理?
hashMap是采用key/value进行存储,通过hashCode和equals进行添加和检索元素

HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
当传入 key 时,HashMap 会根据 key,调用 hash(Object key) 方法,计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里

HashMap 基于 Hash 算法实现,通过 put(key,value) 存储,get(key) 来获取 value
当传入 key 时,HashMap 会根据 key,调用 hash(Object key) 方法,计算出 hash 值,根据 hash 值将 value 保存在 Node 对象里,Node 对象保存在数组里
当计算出的 hash 值相同时,称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value
当 hash 冲突的个数:小于等于 8 使用链表;大于 8 时,使用红黑树解决链表查询慢的问题

24.说一下 HashSet 的实现原理?
底层是通过HashMap 实现的

25.ArrayList 和 LinkedList 的区别是什么?
ArrayList:底层是数组结构,查询快,增删慢,线程不安全,效率高
LinkedList:底层是链表结构,增删快,查询慢

26.如何实现数组和 List 之间的转换?
List转数组通过toArray();
数组转List通过 asList();

27.ArrayList 和 Vector 的区别是什么?
ArrayList: 线程不安全,效率高,扩容是1.5倍
Vector:线程安全,效率低,扩容是2倍

28.Array 和 ArrayList 有何区别?
Array:指定长度,大小不可以变,存基础数据类型和对象
ArrayList:大小可以改变,只存对象,提供add()等方法操作

29.在 Queue 中 poll()和 remove()有什么区别?
poll取元素失败返回 null;
remove取元素失败报错;

30.哪些集合类是线程安全的?
vector,hashtable,stack,concurrent类下的所有集合

31.迭代器 Iterator 是什么?
Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦

32.Iterator 怎么使用?有什么特点?
33.Iterator 和 ListIterator 有什么区别?
34.怎么确保一个集合不能被修改?
可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

解决Hash冲突的方法?
开放定址法,再哈希法,链地址法,建立公共溢出区

jdk1.7和1.8的hashMap 有什么区别?

1.数组+链表改成了数组+链表或红黑树;
  2.表的插入方式从头插法改成了尾插法,简单说就是插入时,如果数组位置上已经有元素,1.7将新元素放到数组中,原始节点作为新节点的后继节点,1.8遍历链表,将元素放置到链表的最后;
  3.在插入时,1.7先判断是否需要扩容,再插入,1.8先进行插入,插入完成再判断是否需要扩容
  4.扩容的时候1.7需要对原数组中的元素进行重新hash定位在新数组的位置,1.8采用更简单的判断逻辑,位置不变或索引+旧容量大小;

区别
JDK1.7:
底层数据结构是数组+链表;
在JDK1.7中HashMap是以Entry数组来存储数据;
用key的hashcode取模来决定Key会被放在数组里的位置;
如果hashcode相同,或者hashcode取模结果相同,那么这些Key会被定义到Entry数组的同一个格子里,这些Key会形成一个链表;
新增节点采用头插法;
插入数据之前扩容。
JDK1.8:
底层数据结构是数组+链表+红黑树结构(当链表长度大于8,转为红黑树);
在JDK1.8中HashMap是以Node数组来存储数据;
Node可能是链表结构,也可能是红黑树结构,如果同一个格子里的Key不超过8个,会用链表结构储存
如果超过了8个,将链表转换为红黑树;
如果插入的key和hashcode相同,会被定义到node数组的格子里
即使hashcode相同,由于红黑树的特点查找某个特定元素,只需要O(log n)的开销,也就是说get/put的操作时间复杂度最差就只有o(log n);
新增节点采用尾插法,这也是为什么1.8不容易出现环型链表的原因;
插入数据成功之后扩容。

三、多线程
35.并行和并发有什么区别?
并行是指两个或多个事件,同一时刻发生。
并发是指两个或多个事件,间隔发生;
并行是在多个实体上的多个事件,并发是在同一个实体上的多个事件;

1123.多线程的优缺点?
(1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
(2)占用大量处理时间的任务使用多线程可以提高CPU利用率,即占用大量处理时间的任务可以定期将处理器时间让给其它任务;
(3)多线程可以分别设置优先级以优化性能。

多线程的主要缺点包括:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销,线程的使用会给系统带来上下文切换的额外负担。
(3)线程的死锁。即对共享资源加锁实现同步的过程中可能会死锁。
(4)对公有变量的同时读或写,可能对造成脏读等;

36.线程和进程的区别?
线程:任务调度和执行的基本单位
进程:操作系统分配资源的最小单位
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销

37.守护线程是什么?
是个服务线程

38.创建线程有哪几种方式?
A。继承Thread
B.实现runnable接口
C。实现callable

39.说一下 runnable 和 callable 有什么区别?
1、callable的核心是call方法,允许返回值,runnable的核心是run方法,没有返回值
2、call方法可以抛出异常,但是run方法不行
3、因为runnable是java1.1就有了,所以他不存在返回值,后期在java1.5进行了优化,就出现了callable,就有了返回值和抛异常
4、callable和runnable都可以应用于executors。而thread类只支持runnable

40.线程有哪些状态?
创建,准备就绪,运行,阻塞,死亡

41.sleep() 和 wait() 有什么区别?
sleep()不会释放锁,wait()会释放锁

42.notify()和 notifyAll()有什么区别?
notify()随机唤醒一个线程,将一个线程放入锁池。
notifyAll()唤醒所有线程,将所有线程放入锁池

43.线程的 run()和 start()有什么区别?
run()方法不会创建一个新线程,若直接调用,相当一个普通方法。
start()方法会创建一个新的线程,然后调用run方法

44.创建线程池有哪几种方式?
A。newFixedThreadPool
B.newSingleThreadPool
B.newCacheThreadPoll
newScheduledThreadPool

45.线程池都有哪些状态?
1.Running: 接受新task, 处理等待的task;
2.ShutDown: 不接受新task,但处理等待的task;
3.Stop: 不接受新task, 不处理等待的task, 尝试打断正在执行的task;
4.Tidying:但所有task都被终止, worCount == 0的时候(workCount是指有效的线程数);
5.Terminated: 执行完terminated()方法;

46.线程池中 submit()和 execute()方法有什么区别?
execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)
execute() 没有返回值;而 submit() 有返回值
submit() 的返回值 Future 调用get方法时,可以捕获处理异常

47.在 java 程序中怎么保证多线程的运行安全?
JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题

48.多线程锁的升级原理是什么?
JVM优化synchronized的运行机制,当JVM检测到不同的竞争状态时,就会根据需要自动切换到合适的锁,这种切换就是锁的升级。升级是不可逆的,也就是说只能从低到高,也就是偏向–>轻量级–>重量级,不能够降级

49.什么是死锁?
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去

50.怎么防止死锁?
A.死锁检测
B.加锁顺序
C。设置优先级
D。尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

51.ThreadLocal 是什么?有哪些使用场景?
52.说一下 synchronized 底层实现原理?
同步代码块是通过 monitorenter 和 monitorexit 指令获取线程的执行权
同步方法通过加 ACC_SYNCHRONIZED 标识实现线程的执行权的控制

53.synchronized 和 volatile 的区别是什么?
synchronized 可以作用于变量、方法、对象;volatile 只能作用于变量。
synchronized 可以保证线程间的有序性(猜测是无法保证线程内的有序性,即线程内的代码可能被 CPU 指令重排序)、原子性和可见性;volatile 只保证了可见性和有序性,无法保证原子性。
synchronized 线程阻塞,volatile 线程不阻塞。

54.synchronized 和 Lock 有什么区别?
A.性能不一样:资源竞争激励的情况下,lock性能会比synchronize好,竞争不激励的情况下,synchronize比lock性能好,synchronize会根据锁的竞争情况,从偏向锁–>轻量级锁–>重量级锁升级,而且编程更简单。
B.锁机制不一样:synchronize是在JVM层面实现的,系统会监控锁的释放与否。lock是JDK代码实现的,需要手动释放,在finally块中释放。可以采用非阻塞的方式获取锁。
C.Synchronized的编程更简洁,lock的功能更多更灵活,缺点是一定要在finally里面 unlock()资源才行。
D.用法不一样:synchronize可以用在代码块上,方法上。lock只能写在代码里,不能直接修改方法。

55.synchronized 和 ReentrantLock 区别是什么?
A。synchronized 竞争锁时会一直等待;ReentrantLock 可以尝试获取锁,并得到获取结果
B。synchronized 获取锁无法设置超时;ReentrantLock 可以设置获取锁的超时时间
C。synchronized 无法实现公平锁;ReentrantLock 可以满足公平锁,即先等待先获取到锁
D。synchronized 控制等待和唤醒需要结合加锁对象的 wait() 和 notify()、notifyAll();ReentrantLock 控制等待和唤醒需要结合 Condition 的 await() 和 signal()、signalAll() 方法
E。synchronized 是 JVM 层面实现的;ReentrantLock 是 JDK 代码层面实现
F。synchronized 在加锁代码块执行完或者出现异常,自动释放锁;ReentrantLock 不会自动释放锁,需要在 finally{} 代码块显示释放

56.说一下 atomic 的原理?
57.什么是悲观锁和乐观锁?
悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。
乐观锁:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。

四、反射
57.什么是反射?
程序在运行状态中对任意一个类,都可以知道这个类的属性和方法。对任意一个对象,都能调用它的方法和属性。

58.什么是 java 序列化?什么情况下需要序列化?
序列化:将 Java 对象转换成字节流的过程。
反序列化:将字节流转换成 Java 对象的过程。
当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。
序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

59.动态代理是什么?有哪些应用?
动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。
应用场景如:
统计每个 api 的请求耗时
统一的日志输出
校验被调用的 api 是否已经登录和权限鉴定
Spring的 AOP 功能模块就是采用动态代理的机制来实现切面编程

60.怎么实现动态代理?
Java 中实现动态的方式:JDK 中的动态代理 和 Java类库 CGLib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值