【面试题】JavaSE基础常见面试题


1、简述什么是 JDK、JRE 和 JVM?

JDK : 开发工具包
JRE : 运行时环境
JVM : java虚拟机

2、int 和 Integer 有什么区别?

int是java的原始数据类型,Integer是java为int提供的封装类。
Integer实例变量的缺省值为 null,而int实例变量的缺省值与它们的类型有关。
int与Integer之间可以进行自动拆装箱的转换,但Integer在[-128,127]范围内会从IntegerCache.cache缓存中取值以复用,若超过这个范围,就new一个新的对象返回(Valueof方法),所以比较Integer类型应该使用equals()方法。127是默认值,使用-XX:AutoBoxCacheMax 参数可以调整

3、String类可以被继承吗?

String类在声明时使用final关键字修饰,被final关键字修饰的类无法被继承。

4、为什么需要用stringbuffer或者StringBuilder去拼接字符串而不用string

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
StringBuilder是线程不安全的,而StringBuffer是线程安全的

5、字符串有长度限制吗?是多少?

首先字符串的内容是由一个字符数组 char[] 来存储的,由于数组的长度及索引是整数,String类中返回字符串长度的方法length() 的返回值也是int ,所以通过查看java源码中的类Integer我们可以看到Integer的最大范围是2^31 -1,由于数组是从0开始的,所以数组的最大长度可以使【0~2^31-1】通过计算是大概4GB。
但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。其实是65535,但是由于JVM需要1个字节表示结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。

6.String abc = new String(“abc”)有几个对象

String str1 = "abc";  // 在常量池中

String str2 = new String("abc"); // 在堆上
  • 直接赋值时,字符串“abc”会被存储在常量池中,只有1份,此时的赋值操作等于是创建0个或1个对象。
  • 如果常量池中已经存在了“abc”,那么不会再创建对象,直接将引用赋值给str1;如果常量池中没有“abc”,那么创建一个对象,并将引用赋值给str1。

那么,通过new String(“abc”);的形式又是如何呢?答案是1个或2个。

  • 当JVM遇到上述代码时,会先检索常量池中是否存在“abc”,如果不存在“abc”这个字符串,则会先在常量池中创建这个一个字符串。
  • 然后再执行new操作,会在堆内存中创建一个存储“abc”的String对象,对象的引用赋值给str2。此过程创建了2个对象。

7、JDK8的新特性

  • 新增接口default关键字
    在jdk1.8之前接口里面是只能有抽象方法,不能有任何方法的实现,在jdk1.8里面使用default修饰方法,可以在接口里面定义具体的方法实现,即接口的默认方法,这个接口的实现类实现了接口之后,不用管这个default修饰的方法就可以直接调用,即接口方法的默认实现
  • 新增时间日期处理类
    LocalDate : 不包含具体时间的日期
    LocalTime : 不含日期的时间
    LocalDateTime :包含了日期及时间
  • Lambda表达式
    所谓的函数式编程,即可理解是将一个函数(也称为“行为”)作为一个参数进行传递,面向对象编程是对数据的抽象(各种各类的POJO),而函数式编程则是对行为的抽象(将行为作为一个参数进行传递)
  • Stream流的使用
    通过将集合转换为这么一种叫做流的元素队列,通过声明性方式,能够对集合中的每个元素进行一系列并行或串行的流水线操作。
    Hashmap
    hashmap7是数组+链表,hashmap8是数组+链表+红黑树(链表大于8时)

8、==和equals方法的区别?

  • = =用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,即= =是比较两个基本类型的数据或两个引用变量是否相等
  • equals方法是用于比较两个独立对象的内容是否相同,字符串的比较常用equals方法。
    如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法。
  • String、Date、File、包装类等都重写了Object类中的equals()方法。
    重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"实体内容"是否相同

9、重载(overload)和重写(override)的区别?重载的方法能否根据返回类型进行区分?

重载发生在一个类中,同名的方法如果有不同的参数列表(类型不同、个数不同、顺序不同)则视为重载
重写发生在子类与父类之间,重写要求子类重写之后的方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
方法重载的规则:方法名一致,参数列表中参数的顺序,类型,个数不同。重载与方法的返回值无关

10、抽象类(abstract class)和接口(interface)有什么异同?

不同点:
● 抽象类中可以定义构造器,接口不能;
● 抽象类可以有抽象方法(抽象类不一定有抽象方法)和具体方法,接口也可以有抽象方法不能有具体方法;
● 接口中的成员全都是 public 的,抽象类中的成员可以使用private、public、protected、默认等修饰;
● 抽象类中可以定义成员变量,接口中只能是常量;
● 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法;
● 抽象类中可以包含静态方法,接口中不能有静态方法;
● 一个类只能继承一个抽象类,一个类可以实现多个接口;
相同点:
● 不能实例化(不能直接new对象);
● 可以将抽象类和接口类型作为引用类型;
● 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类;

11、抽象方法的定义

使用使用abstract关键字修饰的方法叫抽象方法,抽象方法只有声明没有方法体。
子类没有全部实现父类的抽象方法,子类还是必须定义为抽象类。
子类全部实现父类的抽象方法,这个子类就是一个普通类了

public abstract class Animal {
    public abstract void eat();//抽象方法,内容不确定,没有发括号
    public void normalMethod(){}
}

12、基本类型与引用类型

八大基本类型:byte、short、int、long、float、double、char、boolean
引用类型:类、字符串、接口、数组
引用类型主要分为强引用、软引用、弱引用、虚引用
基本类型与引用类型的区别:
1.基本数据类型传值,对形参的修改不会影响实参;
2.引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
3.String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

13、元注解

@Target 指定新注解标注的位置,比如类、字段、方法等,取值有ElementType.Method等
@Retention 指定新注解的信息保留到什么时候,取值有RetentionPolicy.RUNTIME等
@Inherited 指定新注解标注在父类上时可被子类继承
如果@Retention没有RetentionPolicy.RUNTIME,反射会在jvm中无法拿到自定义注解

14、常见异常

  • java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误
  • java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误。
  • java.lang.ClassCastException:强制类型转换异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。
  • java.lang.ClassNotFoundException:找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
  • java.lang.NullPointerException:空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。
  • java.lang.ArrayIndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

15、反射机制的核心思想

Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。

16、IO流

在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)

17、设计模式

  • 单例模式(controller默认是单例的)
  • 代理模式(远程调用只用知道接口)
  • 工厂模式(遵循某个接口生成的对象是典型的工厂设计模式)
  • 桥接模式(jdbc)
  • 动态代理(jdk需要实现接口和cglib不能有final)实现springAOP
  • 观察者模式(mq生产者使用该模式保证消息不丢失)

18、单例模式

1.什么是单例模式?

2.单例模式的应用场景

3.单例优缺点

4.单例的七种写法

详情链接:https://blog.csdn.net/weixin_46425661/article/details/136383534


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值