2302 java基础面试题

本文详细介绍了Java面试中常见的知识点,包括JVM、JRE、JDK的区别,JavaBean规范,基本数据类型和引用类型,访问修饰符,switch语句的应用,Java中的值传递和引用传递,break、continue和return的用法,&和&&的区别,面向对象的三大特性,重载和重写,==和equals的区别,实例变量与静态变量的差异,抽象类与接口的对比,instanceof的作用,函数式接口与方法引用,int与Integer的区别,成员变量与局部变量的区别,静态方法和实例方法的不同,构造方法的作用,String类的常用方法,字符串常量池,线程安全的StringBuffer,以及集合、IO流、多线程、异常处理、数据库操作等多个方面的内容。
摘要由CSDN通过智能技术生成

1.JVM、JRE、JDK的区别:

JVM:java虚拟机,是java实现跨平台的最核心部分,能够运行java语言所开发的程序

JRE:java运行环境,是运行java程序所必须的环境的集合,包括JVM+java系统类库

JDK:java开发工具包,是java的核心,包括JRE+编译、运行等命令工具

2.说一下什么是 javaBean 规范:

(1)javabean 类必须是一个公共类,用 public 修饰

(2)属性都是私有的--private

(3)提供无参构造器

(4)属性应该通过一组存取方法(setXXX 和 getXXX 方法)来访问

(5)实现序列化接口(Serializable)

3.java的8种基本数据类型是什么?(简述java的8种基本数据类型),引用类型包括什么?

基本类型

byte:字节型,用于存储整数的,占用1个字节,范围-128到127

short:短整型,用于存储整数的,占用2个字节,范围-32768到32767

int:最常用的整型,用于存储整数的,占用4个字节,范围-2^31到2^31-1

long:长整型,用于存储较大的整数,占用8个字节,范围-2^63到2^63-1

float:单精度浮点数,用于存储小数的,占用4个字节,不能表示精确的值

double:双精度浮点数,最常用的存储小数的类型,占用8个字节,不能表示精确的值

boolean:布尔型,存储true或false,占用1个字节

char:字符型,采用Unicode字符编码格式,存储单个字符,占用2个字节

引用数据类型

类(class)

接口(interface)

数组([])

枚举

 

4.访问修饰符(权限修饰符都有哪些)

private 私有的 default 默认的protected 受保护的 public 公共的

5.switch可以作用于哪些数据类型上?

byte,short,int,char,String,枚举,其余类型都不允许

6. java是值传递还是引用传递?

在java中,无论是基本类型还是引用类型,都是值传递

对于基本类型而言,传递的是具体的值的副本

对于引用类型而言,传递的是具体的地址的副本

  • 值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

  • 引用传递:指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数

实例1

public class TestOne {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        swap(num1, num2);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}
 

输出:

 

为什么swap输出的值进行了交换,而main输出的却没交换?

1、首先对于基本数据类型来说,使用的是值传递。
即:t=a;a=b;b=t; 这种情况。
2、但在函数方法中,即实参传递给形参这种情况下,首先把实参复制了一份,并复制给形参。也就是得到的形参是实参的备份。
3、通过对复制出来的备份进行值的交换,并不会影响原来的数值。这也就说明了为什么swap输出的值进行了交换,而main输出的却没交换。
​

实例2

public class TestTwo {
    public static void main(String[] args) {
        Student t1 = new Student("张三", 18);
        Student t2 = new Student("李四", 19);
        swap(t1, t2);
        System.out.println(t1);
        System.out.println(t2);
    }
​
    private static void swap(Student t1, Student t2) {
        Student t = t1;
        t1=t2;
        t2=t;
        System.out.println("t1:"+t1);
        System.out.println("t2:"+t2);
    }
}
class Student {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Test{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

输出:

原因同实例1,只不过本实例是将实参的地址复制了一份,并赋值给形参,然后进行交换,使其改变指向。
但是,注意: 这并不是引用传递,在Java里只能叫传递了对象的引用,本质上是传递了对象的引用(地址)的副本,这也算值传递。

7.break ,continue ,return 的区别及作用

break 结束当前的循环体

continue 跳出本次循环,继续执行下次循环-

return 结束当前的方法,直接返回

8.&和&&的区别

&是逻辑与,&&是短路与。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。

9.面向对象三大特性

封装: 类:封装的是对象的属性和行为 方法:封装的是具体的业务逻辑功能实现 访问控制修饰符:封装的是具体的访问权限,以保护数据的安全 继承: 作用:代码复用 超类:所有派生类所共有的属性和行为 接口:部分派生类所共有的属性和行为 派生类:派生类所特有的属性和行为 单一继承、多接口实现,具有传递性 多态: 行为多态:所有抽象方法都是多态的(通过方法的重写实现的 对象多态:所有对象都是多态的(通过向上造型来实现 向上造型、强制类型转换、instanceof判断

10.重载(Overload)和重写(Override)的区别

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类

11. ==和 equals 的区别是什么

==: 它的作用是判断两个对象的内存地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)

equals() : 它的作用也是判断两个对象是否相等。有两种使用情况:

情况1:类没有覆盖 equals() 方法,等价于通过“==”比较这两个对象。

情况2:类覆盖了 equals() 方法。一般我们都覆盖 equals() 方法来判断两个对象的内容相等;若它们的内容相等,则返回 true

12. 实例变量与静态变量的区别:

实例变量和静态变量都属于成员变量

实例变量:是属于对象的,在创建对象时存储在内存堆中,创建多少个对象,则实例变量就会

在内存堆中存在多少份,需要通过引用变量来访问

静态变量:是属于类的,在类被加载时存储在内存方法区中,无论创建多少个对象,静态变量

在内存中都只有一份,常常通过类名点来访问

13. 抽象类与接口的区别:

联系:

(1)接口和抽象类都不能被实例化,用于被其他类实现和继承。

(2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现

这些抽象方法。

区别:

(1)接口只能定义静态常量,不能定义普通成员变量;抽象类则可以定义普通成员变量,

也可以定义静态常量。

(2)接口不能包含构造器,抽象类可以包含构造器。(抽象类里的构造器并不是用于创建

对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。)

(3)一个类最多只有一个直接父类,包括抽象类,但一个类可以实现多个接口,通过实

现多个接口可以弥补 java 单继承的不足。

(4)抽象类可以有不是抽象的方法。接口中所有的方法都是抽象的(JDK1.8 以后,

接口中可以有 static 修饰的实例方法)。

当用于关系比较密切的对象时用抽象类,当为不相关的类提供通用功能时用接口。

14.Instanceof 有什么作用?

Instanceof 的作用是判断一个引用类型的变量所指向的对象是否是一个类的实例。

15.接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类?

接口可以继承接口,并且可以继承多个其它接口;

抽象类可以实现接口中的方法;

抽象类可以继承实体类。

16.函数式接口是什么?方法引用?

所谓"函数式接口",是指仅仅只包含一个抽象方法,但是可以有多个非抽象方法(默认方法)的 接口。

Java9允许通过::关键字来传递方法或构造函数的引用。

17.int 和 Integer 有什么区别

Java 是面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型,int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

Java 为每个原始类型提供了包装类型:

原始类型: boolean,char,byte,short,int,long,float,double

包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

18.成员变量与局部变量的区别有哪些

成员变量:方法外部,类内部定义的变量

局部变量:类的方法中的变量。

作用域

成员变量:针对整个类有效。

局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)

存储位置

成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。

局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自动释放。

生命周期

成员变量:随着对象的创建而存在,随着对象的消失而消失

局部变量:当方法调用完,或者语句结束后,就自动释放。

初始值

成员变量:有默认初始值。

局部变量:没有默认初始值,使用前必须赋值。

使用原则

在使用变量时需要遵循的原则为:就近原则

首先在局部范围找,有就使用;接着在成员位置找。

19.静态方法和实例方法有何不同?

静态方法实例方法的区别主要体现在两个方面:

在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

20.构造方法有哪些特性

名字与类名相同;

没有返回值,但不能用void声明构造函数;

生成类的对象时自动执行,无需调用。

21.一个类的构造方法的作用是什么?

主要作用是创建对象时被调用,完成对类对象的初始化工作

22.String s = new String(“abc”);创建了几个字符串对象

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

当然,如果检索常量池时发现已经存在了对应的字符串,那么只会在堆内创建一个新的String对象,此过程只创建了1个对象

23.说出String类中常用的方法有哪些

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

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

replace():字符串替换。

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

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

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

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

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

substring():截取字符串。

equals():字符串比较

24.什么是字符串常量池?

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

25.String为什么是不可变的吗&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值