2021备战面试必备基础篇(一)

1.JDK与JRE的区别?

        JDK Java的工具包 。jre  Java 运行时环境
        jdk 包含 jre jdk中有一个jre的文件夹 其中 有bin 与lib 俩文件夹
        bin 里面为 jvm lib里是jvm所需的类库

2.==与equals的区别?

      ==:基础类型 比较的是值  引用类型比较的是地址
      equals:不能用于基本类型的比较,如果没有重写equals相当于==
       			如果有重写equals比较的是内容

3.final在java中的作用?

Final修饰的成员变量,必须在声明的同时赋值,一旦创建不可被修改;
Fianl修饰的方法,不能被子类重写;、Final类中方法默认是fianl的
Private类型的方法默认的final的

4.java 中的 Math.round(-1.5) 等于多少?

Ceil 向上取整 floor向下取整  round 加0.5取整

5.String 属于基础的数据类型吗?

不属于 byte short char int long float double boolean

6.java 中操作字符串都有哪些类?它们之间有什么区别?

7.String str="i"与 String str=new String(“i”)一样吗?

String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。

String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。

8.如何将字符串反转?

将对象封装到stringBuilder中,调用reverse方法反转。
    	String str="sadasfvsf";
        StringBuilder strber=new StringBuilder(str);
        String s = strber.reverse().toString();
        System.out.println(s);

9.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
两个对象==相等,则其hashcode一定相等,反之不一定成立

10、String 类的常用方法都有那些?

1、常见String类的获取功能

length:获取字符串长度;
charAt(int index):获取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;
substring(int start):从指定位置开始截取字符串,默认到末尾;
substring(int start,int end):从指定位置开始到指定位置结束截取字符串;

2、常见String类的判断功能

 	equals(Object obj): 比较字符串的内容是否相同,区分大小写;
	 contains(String str): 判断字符串中是否包含传递进来的字符串;
	startsWith(String str): 判断字符串是否以传递进来的字符串开头;
	endsWith(String str): 判断字符串是否以传递进来的字符串结尾;
	isEmpty(): 判断字符串的内容是否为空串"";

3、常见String类的转换功能

byte[] getBytes(): 把字符串转换为字节数组;
char[] toCharArray(): 把字符串转换为字符数组;
String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转	为字符串;
toLowerCase(): 把字符串转成小写;
toUpperCase(): 把字符串转成大写;
concat(String str): 把字符串拼接;

4、常见String类的其他常用功能

replace(char old,char new) 将指定字符进行互换
replace(String old,String new) 将指定字符串进行互换
trim() 去除两端空格
int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的	  就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。

11、抽象类必须要有抽象方法吗?

1.如果一个类使用了abstract关键字修饰,那么这个类就是一个抽象类。

2.抽象类可以没有抽象方法

3.一个类如果包含抽象方法,那么这个类必须是抽象类,
   否则编译就会报错。

4.最关键的一点就是如果一个类是抽象类,
	那么这个类是不能被实例化的。

12、普通类和抽象类有哪些区别?

抽象类不能被实例化;
抽象类可以有抽象方法,只需申明,无须实现;
有抽象方法的类一定是抽象类;
抽象类的子类必须实现抽象类中的所有抽象方法,
   否则子类仍然是抽象类;
抽象方法不能声明为静态、不能被static、final修饰。

13、抽象类能使用 final 修饰吗?

不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

14、接口和抽象类有什么区别?

1、接口

接口使用interface修饰;
接口不能实例化;
类可以实现多个接口;
①java8之前,接口中的方法都是抽象方法,省略了public abstract。
②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;

2、抽象类

抽象类使用abstract修饰;
抽象类不能被实例化;
抽象类只能单继承;
抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;
如果一个类继承了抽象类,
①如果实现了所有的抽象方法,子类可以不是抽象类;
②如果没有实现所有的抽象方法,子类仍然是抽象类。

15、java 中 IO 流分为几种?

1、按流划分,可以分为输入流和输出流;

2、按单位划分,可以分为字节流和字符流;

字节流:inputStream、outputStream;

字符流:reader、writer;

16、BIO、NIO、AIO 有什么区别?

一、同步阻塞I/O(BIO):

同步阻塞I/O,服务器实现模式为一个连接一个线程
,即客户端有连接请求时服务器就需要启动一个线程进行处理,
如果这个连接不做任何事情会造成不必要的线程开销,
可以通过线程池机制来改善。
BIO方式适用于连接数目比较小且固定的架构,
这种方式对服务端资源要求比较高,
并发局限于应用中,在jdk1.4以前是唯一的io现在,
但程序直观简单易理解

二、同步非阻塞I/O(NIO):

同步非阻塞I/O,服务器实现模式为一个请求一个线程,
即客户端发送的连接请求都会注册到多路复用器上,
多路复用器轮询到连接有IO请求时才启动一个线程进行处理。
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,
比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持

三、异步非阻塞I/O(AIO):

异步非阻塞I/O,服务器实现模式为一个有效请求一个线程,
客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线
程进行处理。    			    
 AIO方式适用于连接数目多且连接比较长(重操作)的架构,
比如相册服务器,充分调用OS参与并发操作,编程比较复杂,
jdk1.7开始支持。

四、IO与NIO区别:

IO面向流,NIO面向缓冲区

IO的各种流是阻塞的,NIO是非阻塞模式

Java NIO的选择允许一个单独的线程来监视多个输入通道,
可以注册多个通道使用一个选择器,
然后使用一个单独的线程来“选择”通道:
这些通道里已经有可以处理的输入或选择已准备写入的通道。
这种选择机制,使得一个单独的线程很容易来管理多个通道

17、Files的常用方法都有哪些?

	exist
	createFile
	createDirectory
	write
	read
	copy
	size
	delete
	move

18、什么是反射?

所谓反射,是java在运行时进行自我观察的能力,
通过class、constructor,field、method四个方法获取一个类的各个组成部分。
在Java运行时环境中,对任意一个类,
可以知道类有哪些属性和方法。
这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。

19、什么是 java 序列化?什么情况下需要序列化?

序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。

序列化是通过实现serializable接口,该接口没有需要实现的方法,
implement 	Serializable只是为了标注该对象是可被序列化的,
使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。

序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。

一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。

对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。

譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。

20、动态代理是什么?有哪些应用?

动态代理是运行时动态生成代理类。 
动态代理的应用有 spring aop、hibernate 数据查询、
测试框架的后端 mock、 rpc,Java注解对象获取等

21、怎么实现动态代理?

在java的java.lang.reflect包下提供了一个Proxy类
和一个InvocationHandler接口,
通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。

22、为什么要使用克隆?

想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了。

克隆分浅克隆和深克隆,浅克隆后的对象中非基本对象和原对象指向同一块内存,因此对这些非基本对象的修改会同时更改克隆前后的对象。深克隆可以实现完全的克隆,可以用反射的方式或序列化的方式实现

23、如何实现对象克隆?

  1). 实现Cloneable接口并重写Object类中的clone()方法;
  2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,
          可以实现真正的深度克隆

24、深拷贝和浅拷贝区别是什么?

浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;
深克隆:既克隆基本类型变量,又克隆引用类型变量;

25、throw 和 throws 的区别?

1、throw

作用在方法内,表示抛出具体异常,由方法体内的语句处理;
一定抛出了异常;

2、throws

作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
可能出现异常,不一定会发生异常;

26、final、finally、finalize 有什么区别?

final可以修饰类,变量,方法,修饰的类不能被继承,
修饰的变量不能重新赋值,修饰的方法不能被重写

finally用于抛异常,finally代码块内语句无论是否发生异常,
都会在执行finally,常用于一些流的关闭。

finalize方法用于垃圾回收。

一般情况下不需要我们实现finalize
,当对象被回收的时候需要释放一些资源,比如socket链接,
在对象初始化时创建,整个生命周期内有效,
那么需要实现finalize方法,关闭这个链接。

但是当调用finalize方法后,
并不意味着gc会立即回收该对象,
所以有可能真正调用的时候,对象又不需要回收了,
然后到了真正要回收的时候,因为之前调用过一次,
这次又不会调用了,产生问题。所以,不推荐使用finalize方法。

27、try-catch-finally 中哪个部分可以省略?

Finally

28、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

执行顺序为 Catch -> finally ->catch return

29、常见的异常类有哪些?

NullPointerException:空指针异常;
SQLException:数据库相关的异常;
IndexOutOfBoundsException:数组下角标越界异常;
FileNotFoundException:打开文件失败时抛出;
IOException:当发生某种IO异常时抛出;
ClassCastException:当试图将对象强制转换为不是实例的子类时,
								抛出此异常;
NoSuchMethodException:无法找到某一方法时,抛出;
ArrayStoreException:试图将错误类型的对象存储到一个对象数组时
											抛出的异常;
NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
IllegalArgumentException 抛出的异常表明向方法传递了一个不合法
						或不正确的参数。
ArithmeticException当出现异常的运算条件时,抛出此异常。
			例如,一个整数“除以零”时,抛出此类的一个实例。 

30、new String(“a”) + new String(“b”) 会创建几个对象?

 对象1:new StringBuilder()

对象2:new String("a")

对象3:常量池中的"a"

对象4:new String("b")

对象5:常量池中的"b"

深入剖析:StringBuilder中的toString():

对象6:new String("ab")

强调一下,toString()的调用,在字符串常量池中,没有生成"ab"
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Da.ge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值