Java基础常见面试题汇总

目录

1.JDK 和 JRE 有什么区别?

2.== 和 equals 的区别是什么?

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

4.final 在 java 中有什么作用?

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

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

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

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

9.如何将字符串反转?

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

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

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

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

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

15.java 中 IO 流分为几种?

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

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

 18.简述线程、程序、进程的基本概念。以及它们之间的关系是什么?

 19.说说线程的生命周期和状态?

 20.Java中的深拷贝和浅拷贝是什么?

 21.重载和重写的区别?

 22.内部类和静态内部类的区别?

 23.Get和Post区别从HTTP方面来阐述?      

24.Java 为什么要有包装类? 基本数据类型和对应包装类的区别?

25.拦截器是通过什么实现的?

26.过滤器和拦截器的区别?

27.HTTP与HTTPS的区别?HTTPS的实现原理?(HTTPS的加密方式是是什么?)

28.TCP与UDP区别?TCP三次握手?TCP四次挥手?

29.为什么要进行三次握手,而不是两次?

30.第三次握手失败怎么办?

31.为什么要在TIME_WAIT状态等待2MSL?

32.cookie与session区别?

33.MySQL中UNION与UNION ALL的区别?

34.Java有goto吗?

35.TCP四次挥手里面TIME_WAIT和CLOSE_WAIT区别?

36.双亲委派机制可以打破吗?

37.元空间和永久代有什么区别?元空间是在堆里嘛?在jvm里面嘛?它属于哪儿块儿内存?

38.volatile怎么禁止指令重排?

39.ThreadLocal有了解吗?

1.JDK 和 JRE 有什么区别?

  答:JDK提供了java的开发环境和运行环境,而JRE提供了java的运行环境。具体来说就是JDK包含了JRE,还包含了编译java源码的编译器javac,如果你要运行java程序就安装JRE就行了,如果你要编写java程序就需要安装jdk

2.== 和 equals 的区别是什么?

  答: ==在基本类型和引用类型中的效果是不同的,在基本类型中比较的是值是否相同,而在引用类型中比较的是引用是否相同。equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等、把它从引用比较变成了值比较,所以一般情况下 equals 比较的是值是否相等。

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

  答: 不对,两个对象的 hashCode()相同,equals()不一定 true。

4.final 在 java 中有什么作用?

  答: final修饰的类叫最终类,该类不能被继承,final修饰的方法不能被重写,final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改

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

  答:等于-1

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

  答: String不属于基本数据类型,基本数据类型有8种,分别是byte short int long float double boolean char,String属于引用数据类型

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

  答: 有String、StringBuffer、StringBuilder  String和StringBuffer、StringBuilder的区别在于String声明的是不可变的字符序列,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有的对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String       StringBuffer和StringBuilder的最大区别在于,StringBuffer是线程安全的,StringBuilder是线程不安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下使用StringBuffer

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

  答: 不一样,内存分配方式不一样,Stirng str="i"的方式,java虚拟机会将其分配到字符串常量池中,而String str = new String("i")则会分配到堆内存中

9.如何将字符串反转?

  答:使用StringBuilder 或者 StringBuffer的reverse() 方法

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

  答:indexOf(): 返回指定字符的索引

         charAt(): 返回指定索引处的字符

         trim(): 去除字符串两端空白

         split(): 分割字符串,返回一个分割后的字符串数组 

         substring(): 截取字符串 

         toLowerCase() : 将字符串转成小写字母

         toUpperCase() : 将字符串转成大写字母

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

  答:不需要,抽象类不一定非要有抽象方法。

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

  答:  普通类不能包含抽象方法,抽象类可以包含抽象方法。抽象类不能直接实例化,普通类可以直接实例化。

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

  答: 不能,定义抽象类就是让其他类继承的,如果定义为final就不能被继承

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

  答:  修饰符不同,一个是abstract,一个是interface。抽象类中可以有不是抽象的方法,接口当中必须全是抽象方法(jdk1.8之前成立),jdk1.8还可以定义静态方法和默认方法。接口中变量全部默认是用public static final修饰的常量,抽象类中不限制 。抽象类只能够被单继承,接口可以有多实现。抽象类可以有构造函数;接口不能有。接口中的方法默认使用 public 修饰,抽象类中的方法可以是任意访问修饰符。

15.java 中 IO 流分为几种?

  答:按功能来分: 输入流、输出流 按类型来分: 字节流和字符流

         字节流和字符流的区别是: 字节流按8位传输以字节为单位输入输出数据, 字符流按16位传输以字符为单位输入输出数据

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

   答:  BIO: 同步阻塞式IO,就是我们平常使用的传统IO,它的特点是模式简单使用方便,并发处理能力低

          NIO:   同步非阻塞IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。

          AIO:AIO 是 NIO的升级,也叫NIO2,实现了异步非阻塞IO , 异步IO的操作基于事件和回调机制。

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

   答:  Files.exists():  检测文件路径是否存在

         Files.createFile(): 创建文件

         Files.createDirectory(): 创建文件夹

         Files.delete() : 删除一个文件或目录

         Files.read(): 读取文件

         Files.write(): 写入文件

 18.简述线程、程序、进程的基本概念。以及它们之间的关系是什么?

    答: 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位,通常在一个进程中可以包含若干个线程,一个进程中至少有一个线程,不然没有存在的意义。线程是 CPU调度和执行的单位。在程序运行时,即使没有自己创建线程,后台也会有多个线程,如java中的主线程和gc线程;    

 19.说说线程的生命周期和状态?

    答: NEW RUNNABLE BLOCKED WAITING TIME_WAITING TERMINATED,线程创建之后就进入NEW状态,调用Start()方法后开始运行,并没有立即启动线程,而是由CPU调度执行。获得CPU时间片后就处于RUNNING状态,当线程执行wait()方法之后,线程进入WAITING状态,进入等待状态的线程需要其它线程的通知才能返回到运行状态,而TIME_WAITING相当于在等待的基础上增加了超时限制,比如通过sleep(long millis)方法或wait(long millis)方法可以将线程置于TIME_WAITING状态,当超时时间到达后会返回到RUNNABLE状态。当线程调用同步方法时,没有获取到锁的情况下,线程进入到BLOCKED状态。线程在执行完Runnable的run()方法之后将会进入到TERMINATED状态。

 20.Java中的深拷贝和浅拷贝是什么?

   答:对基本数据类型进行值传递,对引用数据类型进行引用传递,是浅拷贝,对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,是深拷贝。

 21.重载和重写的区别?

   答:重载是发生在同一个类中,方法名相同,参数的类型、个数不同。重写发生在子类中,方法的名称、类型、返回值全部相同

 22.内部类和静态内部类的区别?

   答:静态内部类可以有静态成员(方法、属性),内部类不可以有。静态内部类只能访问外部类的静态成员,而非静态内部类则可以访问所有成员。创建内部类实例时,非静态内部类依赖于外部类实例而静态内部类不依赖于外部类实例。  

 23.Get和Post区别从HTTP方面来阐述?      

   答:get和post传递的参数本身是没有限制的,只是get请求是基于浏览器URL传参,浏览器会对url长度做限制。

          post比get请求安全,因为数据在地址栏不可见。

          get产生一个TCP数据包,post产生两个TCP数据包。

          从传输的角度来说,get和post请求都是不安全的,因为HTTP是明文传输,要想安全的传输就用HTTPS。

          POST和GET请求最本质的区别是:get具有幂等性 幂等性是指一次或多次请求一个资源应该产生相同的副作用。

24.Java 为什么要有包装类? 基本数据类型和对应包装类的区别?

   答:因为当向ArrayList、HashMap中放东西时,int、double这种基本类型是放不进去的,因为容器都是装object的,这就需要有包装类了。基本数据类型不使用new关键字,而包装类需要使用new关键字在堆中分配存储空间;基本类型是将值存储在栈中,包装类型是将值放在堆中;

25.拦截器是通过什么实现的?

   答:可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。拦截器只能在访问controller的方法时进行拦截。拦截器可以在访问controller的方法前preHandle(),访问controller方法之后postHandle()和视图渲染完成之后afterCompletion()三个时机进行功能的增强。

26.过滤器和拦截器的区别?

   答:过滤器只能用于web程序,而拦截器除了能用于web程序还可以用于Application、Swing程序中。过滤器是Servlet容器支持的,拦截器是spring框架支持的。过滤器是被tomcat调用,而拦截器是被spring调用。过滤器只在servlet前后起作用,而拦截器可以深入到方法前后和异常抛出前后等。

27.HTTP与HTTPS的区别?HTTPS的实现原理?(HTTPS的加密方式是是什么?)

   答:HTTP协议运行在TCP之上,HTTPS协议运行在SSL/TLS之上。SSL/TLS又运行在TCP之上,所以传输内容都是经过加密的。HTTP端口是80,HTTPS端口是443。HTTPS可以有效防止运行商劫持,解决了防劫持。

          HTTPS采用对称加密和非对称加密的方式进行加密,首先客户端请求服务端,服务端返回公钥证书给客户端,客户端验证证书是否有效,无效则显示警告信息,有效的话则利用伪随机数生成会话密钥,利用服务端发过来的公钥证书给会话密钥进行加密后发送给服务端,服务端用私钥进行解密,解密后拿到会话密钥后给明文内容A进行加密,把加密后的密文返回给客户端,客户端用会话密钥进行解密可以得到明文内容A,客户端再用会话密钥加密明文内容B后发给服务端,服务端用会话密钥解密后可以得到明文内容B。

28.TCP与UDP区别?TCP三次握手?TCP四次挥手?

   答:TCP是面向连接的、UDP是无连接的。TCP是可靠传输,UDP是尽最大努力交付,不可靠交付。UDP没有拥塞控制、TCP有拥塞控制(拥塞控制是对降低网络传输性能的因素进行控制)。TCP是面向字节流的服务,UDP是面向报文的服务。TCP首部20字节、UDP只有8个字节。TCP是全双工可靠信道,UDP是不可靠信道。

          TCP三次握手:第一次由客户端发起,客户端向服务端发送一个报文,报文中SYN为1,表示要和服务端建立连接。服务端接收到报文之后,向客户端发送一个确认消息包,其中ACK为1,SYN为1,表示服务端收到了客户端发送的消息,表示服务端要和客户端建立连接。两次握手后,客户端已经知道服务端可以收到我发送的消息,我也可以收到服务端发送来的消息,但是服务端还不知道客户端能否收到消息,所以客户端再向服务端发送一个ACK为1的消息包,表示收到了服务端发送的消息,三次握手后,就建立了一个安全的连接了。

           TCP四次挥手:客户端向服务端发送一个FIN为1的报文,表示客户端要和服务端断开连接,此时服务器可能还不能断开连接,因为服务端可能还有数据没有发送完,所以只能发送ACK为1的报文,表示收到了消息。此时进入半连接状态,当服务端的数据全部发送完之后,会向客户端发送FIN为1的报文,表示要和客户端断开连接,当客户端收到消息后,会发送一个ACK为1的确认消息包,此时客户端会进入TIME_WAIT状态,经过2MSL之后,才会断开连接。         

29.为什么要进行三次握手,而不是两次?

  答:两次握手服务端不能确认到客户端是否收到了自己的消息。

30.第三次握手失败怎么办?

  答:当第三次握手失败时,服务器并不会重传ack报文,而是直接发送RST报文段,进入CLOSED状态。这样做的目的是为了防止SYN洪泛攻击。

31.为什么要在TIME_WAIT状态等待2MSL?

  答:为了保证客户端最后发送的一个ACK报文能够到达服务端,可以使本连接持续时间内产生的所有报文段都从网络中消失。

32.cookie与session区别?

 答:cookie数据保存在客户端、session数据保存在服务端。cookie和session都是用来验证浏览器用户身份的会话方式。session会在一定时间内保存在服务器上,当访问增多会比较占用你的服务器性能,考虑减轻服务器性能方面,应当使用cookie。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储在服务端,浏览器对其没有限制。

33.MySQL中UNION与UNION ALL的区别?

答:union合并两个子查询,相同的列只会出现一次,union all的话包括了重复的值。

34.Java有goto吗?

答:有的,goto是java保留关键字,但是不能使用。保留字的意思就是不排除以后会启用变成关键字。

35.TCP四次挥手里面TIME_WAIT和CLOSE_WAIT区别?

答:TIME_WAIT是客户端保持的状态、CLOSE_WAIT是服务端保持的状态。TIME_WAIT是第四次挥手向服务端发送ack为1的确认消息包后客户端会等待2MSL之后再彻底关闭连接,因为为了保证最后一个ack报文可以顺利抵达服务端。

36.双亲委派机制可以打破吗?

答:可以打破。第一种是自定义类加载器去继承ClassLoader类重写loadClass()方法,第二种是线程上下文类加载器破坏双亲委派模型。

37.元空间和永久代有什么区别?元空间是在堆里嘛?在jvm里面嘛?它属于哪儿块儿内存?

答:元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。

38.volatile怎么禁止指令重排?

答:了解过一点,就内存屏障。loadload、loadstore、storeload、storestore四个汇编指令。

39.ThreadLocal有了解吗?

答:ThreadLocal的作用主要是做数据隔离,每个线程创建ThreadLocal对象的时候,数据是存在当前线程的threadLocals变量里面的,从而实现了隔离。它是线程刚进来初始化一个threadlocal对象,然后threadlocal对象里有一个ThreadLocalMap,ThreadLocalMap里面有一个entry是继承了弱引用。key是threadlocal对象,value是当前副本的值。threadlocal还有个内存泄漏的问题,就是因为threadlocalmap的key是threadlocal对象的弱引用,value是一个object的强引用,所以当key都被GC回收完以后,会变成key为null的entry,value一直不会被回收,容易发生内存泄漏。所以使用完最好手动调用一下remove()方法,它会清除为key为null的entry。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值