Java面试题(二)

JDK和JRE有什么区别?

JDK:Java Development Kit 的简称,java开发工具包,提供了java的开发环境和运行环境。

JRE:Java Runtime Environment的简称,java运行环境,为java的运行提供了所需环境。具体来说JDK其实包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具。简单来说:如果你需要运行java程序,只需安装JRE就可以了,如果你需要编写java程序,需要安装JDK。

 

== 和  equals 的区别是什么?

== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下图所示:

基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;

代码示例:

String x = “string”;

String y = “string”;

String x = new String(“string”);

System.out.println(x==y);//true

System.out.println(x==z);//false

System.out.println(x.equals(y));//true

System.out.println(x.equals(z));//true

代码解读:因为x和y指向的是同一个引用,所以 == 也是 true,而new String()方法则是重写开辟了内存空间,所以 == 结果为 false ,而 equals 比较的一直是值,所以结果都为 true。

equals解读:equals 本质上就是 ==, 只不过String 和Integer 等重写了 equals 方法,

把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下equals比较一个有相同值的对象,代码如下:

class Cat{

    public Cat(String name){

        this.name = name;

    }

    private String name;

    public String getName() {

        return name;

    }

    public String setName(String name) {

        this.name = name;

    }

}

Cat c1 = new Cat(“猫”);

Cat c2 = new Cat(“猫”);

System.out.println(c1.equals(c2));//false

看equals源码就知道了,源码如下:

public boolean equals(Object obj){

    return (this == obj);

}

原来 equals本质上是 == 。

 

两个相同值的String对象,为什么返回的是true?代码如下:

String s1 = new String("amo");

String s2 = new String("amo");

System.out.println(s1.equals(s2));//true

String 的 equals 源码如下:

public boolean equals(Object anObject){

    if (this == anObject){

        return true;

    }

    if (anObject instanceof String){

        String anotherString = (String)anObject;

        int n = value.length;

        if (n == anotherString.value.length){

            char v1[] = value;

            char v2[] = anotherString.value;

            int i = 0;

            while (n-- != 0){

                if (v1[i] != v2[i]){

                    return false;

                }

                i++;

            }

            return true;

        }

    }

    return false;

}

 

String 重写了 Object 的 equals方法,把引用比较改成了值比较。

 

总结: == 对于基本类型来说是值比较。对于引用类型来说是比较的引用;

而equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如String、

Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

 

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

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

代码示例:

String str1 = “通话”;

String str2 = “重地”;

System.out.println(String.format("str1: %d | str2: %d", str1.hashCode(),str2.hashCode()));

System.out.println(str1.equals(str2));

执行结果:

str1: 1179395 | str2: 1179395

false

代码解读:

显然 “通话” 和 “重地” 的hashCode() 相同,然而 equals() 则为false,因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等, 并不一定能得出键值对相等。

 

final 在 java 中有什么作用?

final修饰的类叫最终类,该类不能被继承。final 修饰的方法不能被重写。final修饰的变量叫常量,

常量必须初始化,初始化之后值就不能被修改。

 

final、finalize()、finally,性质不同

final为关键字

finalize()为方法

finally为区块标志,用于try语句中

 

final、finalize()、finally,作用

final为用于标识常量的关键字,final标识的关键字存储在常量池中(在这里final 常量的具体用法将在下面进行介绍);

finalize()方法在 Object 中进行了定义, 用于在对象“消失”时,由JVM进行调用用于对 对象进行垃圾回收,

类似于C++中的析构函数;用户自定义时,用与释放对象占用的资源(比如进行I/O操作);

finally {} 用于标识代码块, 与try {} 进行配合,不论try 中的代码执行完或没有执行完 (这里指有异常),该代码块之中的程序必定会进行。

 

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

等于-1,因为在数轴上取值时,中间值(0.5) 向右取整, 所以正0.5是往上取整,负0.5是直接舍弃。

 

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

Sting不属于基础类型,基础类型有8种:byte、boolean、char、short、int、float、long、double,而String属于对象。

 

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

操作字符串的类有:String、StringBuffer、StringBuilder

String 和StringBuffer、StringBuilder的区别在于String声明是不可变的对象,每次操作都会生成新的String 对象,然后将指针指向新的String 对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String。

StringBuffer 和StringBuilder 最大的区别在于, StringBuffer 是线程安全的,而StringBuilder 是非线程安全的, 但StringBuilder 的性能却高于StringBuilder,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

 

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

不一样,因为内存的分配方式不一样。String str = "i" 的方式,java虚拟机 会将其分配到常量池中;而 String str = new String("i") 则会被分到堆内存中。

 

如何将字符串反转?

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

示例代码:

// StringBuffer reverse

StringBuffer stringBuffer = new StringBuffer();

stringBuffer.append("abcdefg");

System.out.println(stringBuffer.reverse());// gfedcba

// StringBulider reverse

StringBulider stringBulider = new StringBulider();

stringBulider.append("abcdefg");

System.out.println(stringBulider.reverse());// gfedcba

 

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

indexOf() 返回指定字符的索引
charAt() 返回指定索引处的字符
replace() 字符串替换
trim() 去除字符串两端空白
split() 分割字符串,返回一个分割后的字符串数组
getBytes() 返回字符串的byte类型数组
length() 返回字符串长度
toLowerCase() 将字符串转成小写字符
toUpperCase() 将字符串转成大写字符
substring() 截取字符串
equals() 字符串比较

 

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

示例代码:

abstract class Cat{

    public static void sayHi() {

        System.out.println("hi~");

    }

}

抽象类并没有抽象方法但完全可以正常运行。

 

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

普通类不能包含抽象方法,抽象类可以包含抽象方法。

普通类可以直接实例化,抽象类不能直接实例化。

 

抽象类能使用final修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,

所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

   

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

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

构造函数:抽象类可以有构造函数;接口不能有 。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

 抽象类:

1、抽象方法,只有行为的概念,没有具体的行为实现。使用abstract关键字修饰,没有方法体。子类必须重写这些抽象方法。

2、包含抽象方法的类,一定是抽象类

3、抽象类只能被继承,一个类只能继承一个抽象类

接口:

1、全部的方法都是抽象方法,属性都是常量

2、不能实例化,可以定义变量

3、接口变量可以引用具体实现类的实例

4、接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法

5、接口之间可以多实现

6、一个具体类可以实现多个接口,实现多继承现象

 

java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

 

字节流和字符流的区别

以字节为单位输入输出数据,字节流按8位传输

以字符为单位输入输出数据,字符流按16位传输

 

BIO、NIO、AIO 有什么区别?

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

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

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

 

常用io类有哪些?

FileInputStream

FileOutputStream

BufferInputStream

BufferOutputStream

PrintWriter

FileReader

FileWriter

BufferReader

BufferWriter

ObjectInputStream

ObjectOutputStream

 

Files 的常用方法都有哪些?

Files.exists()

检测文件路径是否存在
Files.createFile() 创建文件
Files.createDirectory() 创建文件夹
Files.delete() 删除一个文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size() 查看文件个数
Files.read() 读取文件
Files.write() 写入文件

 

 

有不对欢迎指出,侵删

posted @ 2023-03-27 13:18  YvetteHathaway  阅读(27)  评论(0)    收藏  举报