java面试题

本文详细列举了Java面试中常见的问题,涵盖String、接口与抽象类的区别、Java的形参与实参、线程安全问题、IO流分类、数据库操作、Spring相关知识、微服务概念、前端和Linux基础知识等多个方面,全面解析了Java程序员面试必备的知识点。
摘要由CSDN通过智能技术生成

这里写目录标题

1、string、StringBuffer 和StringBuilder的区别

首先都存储字符串的类,String是不可变的字符串,而stringbuffer,stringbuilder操作的字符串内容可变。
不同的是Stringbuffer是线程安全的,而Stringbuilder是线程不安全的。
但是StringBuilder的效率相较于Stringbuffer要更高一些(因为没有加锁),所以在不考虑线程安全的情况下,建议是使用Stringbuilder。
https://www.zhihu.com/question/20101840

2、接口和抽象类的区别?

接口其实就是在抽象类基础上添加了更加苛刻的条件。
1、抽象类中可以有普通方法,但是接口中只能有抽象方法
2、抽象类中可以有常量,可以有变量,但是接口中只能有静态常量
3、抽象类中有构造方法,接口中没有构造方法
4、接口可以多继承,但是类的继承只能是单继承

3、java的形参和实参?

形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元。形参只在方法内部有效,所以针对引用对象的改动也无法影响到方法外。
实参 :就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先赋值的。
请添加图片描述

4、java值传递和引用传递的区别?

5、io流分类?

字符流和字节流。
字节流:可以处理文本、图片、音视频等。
InputStream:字节输入流父类
OutputStream:字节输出流父类
字符流:只可以处理文本
Writer
Reader

6、公司代码开发规范是什么?

命名规范:包名用公司名称缩写,类名首字母大写,方法名用驼峰命名法,参数名要见名知意,逗号、分号只在后面加空格,运算符号要在前后加空格等。
数据库命名时使用下划线

7、为什么要重写equals()方法?

因为object中的equals()方法比较的是对象的引用地址是否相等,如何你需要判断对象里的内容是否相等,则需要重写equals()方法。

8、为什么重写equal必须要重写hashcode?

equals相等的对象hashcode一定相等。如果重写了equals而没有重写hashcode,会出现一种情况,两个对象equals重写了之后判断是相等的,但是hashcode值不等,这就违背了java定义里的规则。
在一种情况下可以不考虑重写hashcode,即在对象不涉及到HashMap、HashSet和Hashtable集合时,因为这些集合是不可重复集,在添加数据时,会先根据hashcode值判断是否相等,如果相等再调用equals对比,所以如果hashcode值不相等,那程序就默认两个对象不相等,即便我们重写了equals方法,也无法判定为相同的对象。

9、final、finally、finalize的区别

final 用于声明属性,方法和类的修饰符,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成 final 类型。
finally 是异常处理语句结构的一部分,表示无论是否出现异常总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用。

10、在什么情况下需要考虑线程安全问题

多线程的时候。
多线程处理业务逻辑的时候,有可能因为共享了参数、对象等,由于运行是的先后顺序之类的问题,导致类似于数据不一致、数据污染这样的问题。

11、如何解决线程安全问题

加锁synchronized,同步方法、同步代码块,这样一个线程在进入锁的时候,其他的线程只能等待,等这个线程执行完之后,其他线程才能进入。但是也有一个弊端,加了锁的方法或代码块,性能会比不用时要低一些,所以一般考虑的就是尽量减少锁的作用域。

12、线程的实现方式

实现Runnable接口,继承Thread类,创建线程池

13、什么是线程池?

顾名思义,就是实现创建若干个可执行的线程放在一个池子中,需要的时候从池子中获取线程,不用自己重新创建,使用完之后,不需要销毁线程而是重新放入池子中。

14、创建线程池的优势、为什么要使用线程池?

减少资源的消耗,不用重复的创建和销毁线程;
提高效率,有任务来了可以直接执行,不需要再重新创建再执行;
提高可管理型,可以进行统一分配调优监控。

在我们平时java的编程中,创建和销毁对象很消耗资源,因为每次创建一个对象之后,虚拟机就需要对其进行跟踪,在对象销毁之后进行回收,所以应该尽量减少创建和销毁对象的次数,特别是一些很耗资源的对象的创建和销毁,这就是“池化资源”产生的原因。

15、线程池有哪些?

newSingleThreadExecutor:单线程的线程池。线程池中只有一个线程,执行任务是按照单线程串行执行的方式,保证了任务是按照顺序来执行的,如果这个唯一的线程因为异常结束了,那么会有一个新的线程来替代它。

newFiexedThreadPool:指定大小的线程池。每次提交一个任务就会创建一个线程出来执行任务,一直到能够达到线程池的最大数量(即我们指定的数量),如果线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

newCachedThreadPool:可缓存的线程池。如果线程池的大小大于需要处理的任务数,此时就会对部分空闲线程池进行部分回收(60s内未执行任务);当任务量增加时,线程池又会新建线程来处理任务。 此线程池不会对线程池的大小做限制,线程池的大小完全依赖于系统(或jvm)能够创建的最大线程数量。

newScheduleThreadPool:大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

16、线程池满载了怎么处理?

如果内存够用,就是线程池满了,就在创建线程池时增大池的容量上限;
如果内存不够,就加物理内存;
如果物理内存还是不够,考虑分布式系统,用云计算那一套东西。

17、线程和进程有什么区别?

线程是多个进程的集合。

18、线程生命周期

1.新建: 线程被new出来
2.就绪:线程具有执行的资格,即线程调用了start(),没有执行的权利
3.运行:具备执行的资格和具备执行的权利
4.阻塞:没有执行的资格和执行权利
5.销毁: 线程的对象变成垃圾,释放资源。
请添加图片描述

19、启动一个线程用start()还是run()

启动一个线程用start(),run()是要运行线程中的代码

20、什么是死锁

多个线程,因为竞争资源,最终陷入的一种僵局。

两个进程都在等待对方执行完毕,才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。
例子:给一个类加锁,创建了两个对象之后,两个对象都是带锁的,此时线程1正在执行对象1,线程2正在执行对象2,所以线程1持有对象1的锁,线程2持有对象2的锁,然后双方都在等待对方释放锁,就陷入了死锁。

21、死锁的原因?

系统资源的竞争;进程推进顺序非法;互斥;请求与保持;不可剥夺;循环等待。

22、线程死锁的条件?

1、 互斥:一个资源每次只能被一个线程使用
2、 请求与保持:一个进程因为请求资源而阻塞,对已获得的资源保持不放
3、 不可剥夺:进程已经获取的资源,在未使用完之前,不可强行剥夺
4、 循环等待:两个进程之间形成的循环等待对方释放资源

23、如何避免死锁?

加锁,1、顺序加锁:线程按照一定的顺序依次加锁
2、加锁限时:线程在每次获取资源的时候加上时间限制,超出时间限制,放弃自己占用的资源。。。

24、java常见的容器,与其继承关系。

java容器类类库的用途是"保存对象"。
Java集合类是一种特别有用的工具类,可以用于存储数量不等的对象,并可以实现常用的数据结构,如栈,队列等.
Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象) “丢进” 该容器中
java中的容器也叫集合,是专门用来管理对象的对象
请添加图片描述

25、vector、ArrayList、LinkedList

26、ThreadLocal

ThreadLocal
用在多线程处理业务时。

27、线程安全的容器?

hashTable。

28、hashMap和hashTable的区别?

1) 继承不同
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
2) 线程安全不同。
hashTable是线程安全的,因为底层的方法做了线程同步,给get、put、remove方法方法加了同步锁,所有每次只能有一个线程来操作hashtable,效率比较低。
hashMap中的方法默认都是非同步的,所以是线程不安全的。
3) null值。
hashtable中的键值都不允许为null,否则会抛出空指针异常
hsahmap里的键值都允许为null,key只允许存在一个为null的数据,但是value允许存在多个null值,调用get(key)方法来获取到的结果为null时,既可以表示key不存在,也可以表示key对应的value值为null。 所以在hashMap里,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值