1.Java基础面试题

1.JDK,JRE,JVM分别是什么
2.Java 中的几种基本数据是什么
3.自动装箱与拆箱的原理是什么
4.面向对象和面向过程的区别
5.面向对象的特点及特征
6.说一下对深拷贝,浅拷贝,引用拷贝的理解
7.为什么重写 equals() 时必须重写 hashCode() 方法
8.String、StringBuffer、StringBuilder 的区别 及 适用场景
9.String s1 = new String(“abc”);这句话创建了几个字符串对象?
10.finally 中的代码一定会执行吗

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

1.JDK,JRE,JVM分别是什么
JDK: Java 软件开发工具包,包含了JRE和一些Java开发工具
JRE: Java 运行环境: 包括JVM和Java程序所需的核心类库。
JVM: Java 虚拟机,将.class文件翻译成对应平台的机器码交给操作系统执行

2.Java 中的几种基本数据是什么
4种整数型:byte、short、int、long
2种浮点型:float、double
1种字符类型:char
1种布尔型:boolean。

3.自动装箱与拆箱的原理是什么
装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型;
装箱就是调用了 包装类的valueOf()方法,拆箱就是调用了 xxxValue()方法。

4.面向对象和面向过程的区别
面向过程: 过程拆分为方法,通过执行方法解决问题
面向对象: 先抽象出对象,由对象调用方法的方式解决问题。
面向对象开发的程序一般更易维护、易复用、易扩展。

5.面向对象的特点及特征
封装: 将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用

继承: 子类拥有父类所有属性和方法但是私有属性和私有方法不能访问,子类可以有自己属性和方法且可以重写父类的方法。
多态: 父类的引用指向子类的实例,子类重写了父类的方法,真正执行的是子类覆盖的方法,多态不能调用子类存在但父类不存在的方法;

5.1:反射是否破坏了封装
反射虽然可以获取私有方法并使用方法,只能说是其功能强大,可以在保证在调用私有方法不会出现错误,但是并没有反射调用方法后,该方法就不是私有的了。他仍然是私有的,仍然在子类中不可见。

6.说一下对深拷贝,浅拷贝,引用拷贝的理解
浅拷贝: 在堆上创建一个新的对象,但原对象内部的属性有引用类型,会只复制该对象的地址.
深拷贝: 深拷贝会完全复制整个对象,包括这个对象所包含的内部对象.
引用拷贝: 两个不同的引用指向同一个对象。

浅拷贝
实现Cloneable接口,重写clone方法,直接调用super.clone(),返回一个在堆上的新地址
public class Demo implements Cloneable{
    
    
	public Student student;
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        return super.clone();//只拷贝了当前类的对象,没有拷贝类中的对象student.原类和新类公用一个student对象
    }
}
class Student {
    
    
    public String name;
    public int age;
}
深拷贝
public class Demo implements Cloneable{
    
    
    Student student;
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        Demo clone = (Demo) super.clone();
        clone.setStudent((Student) clone.getStudent().clone());
        return clone;
    }
    public Student getStudent() {
    
    
        return student;
    }
    public void setStudent(Student student) {
    
    
        this.student = student;
    }
}

class Student implements Cloneable{
    
    
    public String name;
    public int age;

    @Override
    protected Object clone() throws CloneNotSupportedException {
    
    
        return super.clone();
    }
}
引用拷贝
Student s1 = new Student;
Student s2 = s1;

7.为什么重写 equals() 时必须重写 hashCode() 方法
1.hashCode() 的作用是获取哈希码,提高比较和集合(HashSet,HashMap)中的使用效率
如果两个对象的hashCode 值不相等,这两个对象一定不相等。
两个对象的hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。
如果两个对象的hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
2.重写 equals() 时没有重写 hashCode() 方法的话,使用 HashMap 可能会出现问题。

8.String、StringBuffer、StringBuilder 的区别 及 适用场景
1.内部数组修饰关键字不一样: String 是不可变的,内部维护一个由final修饰的char数组private final char value[];StringBuilder与StringBuffer 都继承自AbstractStringBuilder 类,在这个类中也使用char数组保存字符串,但没有使用 final 和 private 修饰
2.线程安全: String 中的对象为常量,线程安全,StringBuilder是线程不安全的,StringBuffer 是线程安全的。
3.效率: StringBuilder在单线程下效率比StringBuffer 高
适用场景:
String: 操作少量的数据
StringBuilder: 单线程操作字符串缓冲区下操作大量数据
StringBuffer: 多线程操作字符串缓冲区下操作大量数据

9.String s1 = new String(“abc”);这句话创建了几个字符串对象?
堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。

对于 String str3 = "aa" + "bb"; 编译器会给你优化成 String str3 = "aabb"; 
引用的值在程序编译期是无法确定的,编译器无法对其进行优化。
        String s1 = "aa";
        String s2 = "bb";
        String s3 = "aabb";
        String s4 = "aa" + "bb";
        String s5 = s1 + s2;
        System.out.println(s3 == s4);//false
        System.out.println(s3 == s5);//true

10.finally 中的代码一定会执行吗
不一定:
程序所在的线程死亡。
关闭 CPU。

猜你喜欢

转载自blog.csdn.net/m0_56182317/article/details/130111692
今日推荐