一、Java 基础面试题

1.JDK 和 JRE 有什么区别?
JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。
JDK:Java Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。
JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。
2.== 和 equals 的区别是什么?
==对于基本类型来说是值比较,对于引用类型来说是比较的引用;
equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它改成了值比较,所以一般情况下equals比较的是值是否相等。
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对
4. java中final finally finalized 的区别是什么?
final 是修饰符,可以用于修饰变量、方法和类。修饰变量时,代表变量不可以修改,也就是常量了,常量需要在定义时赋值或通过构造函数赋值,两者只能选其一;修饰方法时,代表方法只能调用,不能被 override ;修饰类时,代表类不能够派生出子类,所以一个类不能既是 final 又是 abstract;
finally 是异常处理机制中的 try 的从句,用于处理必要的清理工作,那怕执行的 catch 中有 return 语句 finally 也会在 return 之前执行;
finalized 是 Object 中定义的一个方法,子类一般都重写该方法,用于在该对象被GC收走前做必要的清理工作,该方法一般供GC调用,但重载 finalized 时,GC只会调用最初始版本的 finalized ,显式地调用初始版本的 finalized 方法具有很大的不确定性。
5.java 中的 Math.round(-1.5) 等于多少?
-1
6.String 属于基础的数据类型吗?
String不是基本的数据类型,是final修饰的java类,java中的基本类型一共有8个,它们分别为:
字符类型:byte,char
基本整型:short,int,long
浮点型:float,double
布尔类型:boolean
7.java 中操作字符串都有哪些类?它们之间有什么区别?
java中操作字符串的类,我知道的有三个类,分别是String,StringBuffer和StringBuilder.这三个类都是以char[]的形式保存的字符串,但是String类型的字符串是不可变的,对String类型的字符床做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象做操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.如果生命的这个字符串几乎不做修改操作,那么我就直接使用String,因为不调用new关键字声明String类型的变量的话它不会在堆内存中创建对象,直接指向String的常量池,并且可以复用.效率更高
8.String str="i"与 String str=new String(“i”)一样吗?
不一样,String str=“i”; 因为String 是final类型的,所以“i”应该是在常量池。
而new String(“i”);则是新建对象放到堆内存中。
9.如何将字符串反转?
(1)利用 StringBuffer 或 StringBuilder 的 reverse 成员方法:
public static String reverse1(String str) {
return new StringBuilder(str).reverse().toString();
}
(2)利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接:
public static String reverse2(String str) {
char[] chars = str.toCharArray();
String reverse = “”;
for (int i = chars.length - 1; i >= 0; i–) {
reverse += chars[i];
}
return reverse;
}
(3)利用 String 的 CharAt 方法取出字符串中的各个字符:
// charAt
public static String reverse3(String str) {
String reverse = “”;
int length = str.length();
for (int i = 0; i < length; i++) {
reverse = str.charAt(i) + reverse;
}
return reverse;
}
10.String 类的常用方法都有那些?
删:trim subString
改:valueOf toUpperCase toLowerCase
查:length indexOf charAt startsWith endsWith
11.抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法;但是包含一个抽象方法的类一定是抽象类。 示例代码:
abstract class Cat {
public static void sayHi() {
System. out. println(“hi~”);
}
}
12.普通类和抽象类有哪些区别?
① 抽象类和接口都是用来抽象具体的对象的,但是接口的抽象级别更高。
② 抽象类可以有具体的方法和属性,接口只能有抽象方法和静态常量。
③ 抽象类主要用来抽象级别,接口主要用来抽象功能。
④ 抽象类中,且不包含任何的实现,派生类必须覆盖它们。接口中所有方法都必须是未实现的。
⑤ 接口方法,访问权限必须是公共的 public。
⑥ 接口内只能有公共方法,不能存在成员变量。
⑦ 接口内只能包含未被实现的方法,也叫抽象方法,但是不能用 abstract 关键字。
⑧ 抽象类的访问速度比接口要快,接口是稍微有点慢,因为它需要时间去寻找在类中实现的方法。
⑨ 抽象类,除了不能被实例化外,与普通 java 类没有任何区别。
⑩ 抽象类可以有 main 方法,接口没有 main 方法。
⑪ 抽象类可以用构造器,接口没有。
⑫ 抽象方法可以有 public、protected 和 default 这些修饰符,接口只能使用默认 public。
⑬ 抽象类,添加新方法可以提供默认的实现,不需要改变原有代码。接口添加新方法,子类必须实现。
⑭ 抽象类的子类用 extends 关键字继承,接口用 implements 来实现。
13.抽象类能使用 final 修饰吗?
不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

14.java 中 IO 流分为几种?

  • • 按照流的流向分,可以分为输入流和输出流;
  • • 按照操作单元划分,可以划分为字节流和字符流;
  • • 按照流的角色划分为节点流和处理流
    15.BIO、NIO、AIO 有什么区别?
    BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
    NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
    AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。
    16.Files的常用方法都有哪些?
    Files.exists():检测文件路径是否存在。
    Files.createFile():创建文件。
    Files.createDirectory():创建文件夹。
    Files.delete():删除一个文件或目录。
    Files.copy():复制文件。
    Files.move():移动文件。
    Files.size():查看文件个数。
    Files.read():读取文件。
    Files.write():写入文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值