Java面试题(Java基础篇)

Posted jihc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试题(Java基础篇)相关的知识,希望对你有一定的参考价值。

Java 基础

1.JDK 和 JRE 有什么区别?

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

JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

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

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

==比较数值或地址引用的相等。

equals比较两个对象内容之间的相等。

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

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

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

代码示例:

String str1 = "str";

String str2 = "String";

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

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

执行的结果:

str1:1179395 | str2:1179395

false

代码解读:很显然“str”和“String”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

4.Java中final、finally、finallize的区别与用法

final、finally、finallize并无关联。

final:java中的关键字、修饰符,用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

finally:java的一种异常处理机制,是异常处理语句结构的一部分,表示总是执行。

finallize:java中Object类的一个方法,在垃圾回收其执行的时候会调用被回收对象的此方法,供垃圾回收时的其他资源回收。

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

Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。四舍五入的原理是在参数上加0.5然后做向下取整。

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

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

1、int长度数据类型有:byte(8bits)、short(16bits)、int(32bits)、long(64bits)。

2、float长度数据类型有:单精度(32bits float)、双精度(64bits double) 。

3、boolean类型变量的取值有:ture、false 。

4、char数据类型有:unicode字符,16位 。

7.java 中操作字符串都有哪些类?它们之间有什么区别?(String、StringBuffer、StringBuilder有什么区别?)

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

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

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

执行速度:StringBuilder > StringBuffer > String。

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

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。
前者可能新建了一个对象,也可能没有新建对象。

后者因为new关键字,至少在内存中创建了一个对象,也可能新建了两个对象。
这些都取决于“i”是否在字符串常量池中。

9.如何将字符串反转?

1.使用 StringBuilder 或 StringBuffer 的 reverse() 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。(JDK1.8)

2.不考虑字符串中的字符是否是 Unicode 编码,自己实现。

3.递归

代码:

package constxiong.interview;

public class TestReverseString {

    public static void main(String[] args) {

        String str = "ABCDE";

        System.out.println(reverseString(str));

        System.out.println(reverseStringByStringBuilderApi(str));

        System.out.println(reverseStringByRecursion(str));

    }

    /**

     * 自己实现

     * @param str

     * @return

     */

    public static String reverseString(String str) {

        if (str != null && str.length() > 0) {

            int len = str.length();

            char[] chars = new char[len];

            for (int i = len - 1; i >= 0; i--) {

                chars[len - 1 - i] = str.charAt(i);

            }

            return new String(chars);

        }

        return str;

    }  

    /**

     * 使用 StringBuilder

     * @param str

     * @return

     */

    public static String reverseStringByStringBuilderApi(String str) {

        if (str != null && str.length() > 0) {

            return new StringBuilder(str).reverse().toString();

        }

        return str;

    }

    /**

     * 递归

     * @param str

     * @return

     */

    public static String reverseStringByRecursion(String str) {

        if (str == null || str.length() <= 1) {

            return str;

        }

        return reverseStringByRecursion(str.substring(1)) + str.charAt(0);

    }

}

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

equals:字符串是否相同

equalsIgnoreCase:忽略大小写后字符串是否相同

compareTo:根据字符串中每个字符的Unicode编码进行比较

compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较

indexOf:目标字符或字符串在源字符串中位置下标

lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标

valueOf:其他类型转字符串

charAt:获取指定下标位置的字符

codePointAt:指定下标的字符的Unicode编码

concat:追加字符串到当前字符串

isEmpty:字符串长度是否为0

contains:是否包含目标字符串

startsWith:是否以目标字符串开头

endsWith:是否以目标字符串结束

format:格式化字符串

getBytes:获取字符串的字节数组

getChars:获取字符串的指定长度字符数组

toCharArray:获取字符串的字符数组

join:以某字符串,连接某字符串数组

length:字符串字符数

matches:字符串是否匹配正则表达式

replace:字符串替换

replaceAll:带正则字符串替换

replaceFirst:替换第一个出现的目标字符串

split:以某正则表达式分割字符串

substring:截取字符串

toLowerCase:字符串转小写

toUpperCase:字符串转大写

trim:去字符串首尾空格

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

不必须抽象类不一定非要有抽象方法。

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

1. 抽象类声明时要使用abstract关键字来定义,而普通类可以是public , private 等;

2.抽象类里的方法不能有方法的主体, 只能是方法的声明,而普通类的方法可以有主体。

3.抽象类被继承时,子类必须实现它的所有方法,而普通类不需要;

4.抽象类的方法在扩展性和延伸性方面要比普通类的好;

5.抽象类可以应用多态,但是普通类不可以。

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

不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

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

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

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

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

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

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

15.java 中 IO 流分为几种?

按照流的流向可以分为输入流和输出流;

按照操作单元可以划分为字节流和字符流;

按照流的角色可以划分为节点流和处理流。

Java I0流的40多个类都是从如下4个抽象类基类中派生出来的:

InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

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

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

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

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

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

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

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

Files.createFile() 创建文件

Files.createDirectory() 创建文件夹

Files.delete() 删除文件或者目录

Files.copy() 复制文件

Files.move() 移动文件

Files.size() 查看文件个数

Files.read() 读取文件

Files.write()写入文件

以上是关于Java面试题(Java基础篇)的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题超详细讲解系列之四Jvm篇

Java集合面试题看这篇就够了

Java集合面试题看这篇就够了

Java面试题

Java面试题(Java基础篇)

高薪就业必备 整合全网Java面试题——基础篇 (持续更新)