Java面试题1 基础
自己尝试通过打字来回答一些网上常见的面试题,答案仅代表我自己的观点
1. JDK 和 JRE 有什么区别?#
JDK是Java Development Tools,也就是开发者工具包,里面提供了使用Java进行开发的基本工具。
JRE是Java Runtime Environment,也就是Java运行时环境。Java是平台无关的,我们的Java程序会被编译成格式为.class
的中间文件,它不是任何操作系统中的可执行文件,需要JRE加载执行。
JDK中也包含JRE,同时JRE也能被独立安装,如果你玩以Java语言开发的游戏“我的世界”,就需要安装JRE才能运行。
2. == 和 equals 的区别是什么?#
==
是Java提供的一个逻辑运算符,对于基本类型,用于判断值是否相等,而对于引用类型包括数组,用于判断是否是同一个引用。
equals
是Object
类的一个普通公有方法,也就是说,所有的Java对象都有equals
方法。由于==
的局限性,Java语言约定这个方法具有判断两个对象是否相等的语义,默认情况下,它和==
的语义一致,也就是比较是否是同一个引用。类可以自己决定equals
根据什么进行比较,比如String类的equals
比较两个字符串是否一摸一样。
equals
的语义由重写它的类决定。
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?#
并不是,hashCode()
和equals()
在一些基于散列的数据结构实现中通常协同工作,但实际上它们并没有什么关系。
hashCode()
用于生成一个int
类型的散列码,该方法生成的散列码应该尽量均匀;而equals()
就是用来比较两个对象是否相等的。如果你乐意,hashCode()
也可以作为实现equals()
时所参考的东西。
4. final 在 java 中有什么作用?#
语义上来说,final
代表最终的、不可再改变的。
- 修饰属性时,该属性只能赋值一次。
- 修饰方法时,该方法不能被子类重写,语义上来说就是该方法的行为是“最终的”
- 修饰类时,该类不能被继承,语义上来说就是该类的行为是“最终的”
同时,被final
修饰的属性会保证被正确的发布,即将该对象发布出去时,final
域的值一定是可见的。
5. java 中的 Math.round(-1.5) 等于多少?#
Math.round
向上取整,等于-1
6. String 属于基础的数据类型吗?#
String不属于基本数据类型,它是对象类型。
7. java 中操作字符串都有哪些类?它们之间有什么区别?#
String、StringBuilder、StringBuffer。
- String是最基本的字符串对象,它是不可变的,如果使用它参与运算或者调用其中的方法都会创建并返回新的字符串,如果在循环中频繁使用会创建很多临时字符串,非常耗费内存。
- StringBuffer和StringBuilder使用了Builder设计模式,在内部维护了一个字符数组,在
toString
时创建并返回字符串,所以它们非常适合拼接字符串这种工作。 - StringBuilder没有内部的同步机制,所以它在多线程的环境下没法安全的使用。StringBuffer简单粗暴的使用锁来进行同步,所以它虽保证了线程安全,却也降低了性能。现代JVM大多都能识别并消除无竞争情况下的锁,所以不用太过于考虑在单线程环境下使用哪个。但StringBuffer这种加锁方式,如果被很多个线程竞争,它的并发性是不算高的。
8. String str="i"与 String str=new String("i")一样吗?#
不一样,通过字符串字面量创建字符串时会先去常量池中搜索是否有要创建的字符串常量,如果有直接将这个引用返回,否则在字符串常量池中创建一个,并返回这个引用,这个过程称为intern
。而通过new
创建字符串,则会在堆内存中创建字符串并返回堆内存中的引用。
可以通过String.intern
方法手动将一个字符串intern
到常量池中。
10. String 类的常用方法都有那些?#
- indexOf,返回指定字串在字符串中首次出现的位置,没出现过返回-1
- charAt,返回字符串某个位置的char
- subString,返回字串
- split,按照指定模式切割字符串
- length,返回字符串长度
- equals,比较字符串
- replace,替换
11. 抽象类必须要有抽象方法吗?#
不需要,但是没有抽象方法的抽象类没有意义。
当一个类有一些行为的具体实现方式并未指定时,该类才是抽象的,才应该被abstract
来描述,同时这个行为的方法也应该被描述成abstract
。
12. 普通类和抽象类有哪些区别?#
???参见上一个答案。
所谓的标准答案:
- 普通类不能包含抽象方法,抽象类可以包含抽象方法。
- 抽象类不能直接实例化,普通类可以直接实例化。
第一点,真是傻逼中的傻逼,只有一个类的部分行为的具体实现方式无法给定时才要抽象类,要不你就用普通类,所以你为啥在普通类里用抽象方法?
第二点,什么叫直接实例化?如果是语法上来说,直接创建匿名内部类是可以的,如果你的“直接实例化”指的是不管你咋实例化,出来的都是抽象类的一个子类,那这句话没毛病。
13. 抽象类能使用 final 修饰吗?#
不能,这两个概念相冲突。
抽象类是希望类中某些没有指定具体实现方式的方法被子类来实现,而final
类是希望该类的所有行为(也就是说方法)是最终的,不能被子类覆盖(或者说重写)。
14. 接口和抽象类有什么区别?#
从语义上说,接口用于描述一个类像什么一样,也就是like-a
关系,抽象类用于描述一个类就是什么,也就是is-a
关系。
从语法上说,接口和类是实现关系,使用implements
关键字,一个类可以实现多个接口,而抽象类和类是继承关系,使用extends
关键字,一个类只可以继承一个类。同时,接口的功能受限,虽然Java8及以后可以使用default
来定义方法了,但是还是有很多功能是受限的,因为接口本来就不需要那么多功能,否则还区分什么接口和抽象类。而抽象类具有普通类的全部功能。
标准答案:
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
15. java 中 IO 流分为几种?#
首先从流方向上来说,分为输入流和输出流。
其次,从功能上来说,IO包使用装饰器模式提供了很多固定场景下很有用的IO流。比如提供缓冲区的BufferedInputStream
,比如用于文件读取的FileInputStream
。
这些是流,Java中还有另一类IO工具,就是Writer/Reader
,它们通常被称作字符流,而XXXStream
通常被称为字节流。
字符流按照字符来读写,具体的读写规则与使用的字符表有关,一般读取文本文件时使用;字节流按照字节来读写。
16. BIO、NIO、AIO 有什么区别?#
BIO是同步阻塞IO,当一个线程使用BIO进行IO操作时,该线程会挂起,等待IO处理完毕后中断CPU,然后该线程才能拿到IO处理的结果,才有机会继续执行。在高并发场景下,BIO不太适用,因为它要求很多的线程数量,而且线程总处于空闲状态。
NIO是Java New IO
,也就是Java的新IO框架,它是同步非阻塞的。它的思路是在一个线程中运行多个IO密集型任务来提高线程利用率,以免出现线程一直在等待IO的情况。一个Selector
用于与系统通信,如果当前线程中的某个任务所请求的IO事件有了结果,就会让这个任务去执行。这种方式也叫IO多路复用
AIO是真正的异步IO。同步IO和异步IO的区别是,IO请求的发起者通过同步IO发起IO操作后,发起者需要挂起,等待IO操作完成;异步IO则是IO请求的发起者发起IO操作后就可以该干啥干啥去了,操作系统稍后会通知发起者IO操作的结果。
17. Files的常用方法都有哪些?#
exists
:判断文件是否存在isFile
:判断是否是文件createFile
:创建文件delete
:删除文件- ...
总结#
- NIO部分已经忘了差不多了
- 对一些API不熟练,因为平时也没人记这些东西都有文档,不过该低头还是低头吧,该背就背吧...
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/16399672.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)