Java面试-基础(一)

原文地址https://blog.csdn.net/fangchao2011/article/details/89184058

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本质上就是==,只不过String和Integer等重写了equals的方法
//equals的源码,实际上也是用==
public boolean equals(Object obj) {
	return (this == obj);
}
//String类重写了Object的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;
}

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

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

不对,俩个对象的hashCode()相同,则equals()不一定为true,把它变成了值的比较

String str1 = "通话";
String str2 = "重地";
//str1:1179395 | str2:1179395
System.out.println(String.format("str1:%d | str2:%d",  str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));    //false

4.final在Java中的作用

  • final修饰类叫最终类,该类不能不继承。
  • final修饰方法,该方法不能被重写。
  • final修饰变量叫常量,常量必须初始化,初始化之后值就不能被改变

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

等于 -1和2。

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

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

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

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

  • String是不可变对象,每次操作都会生成新的对象,StringBuffer、StringBuilder可变
  • StringBuffer是线程安全的,效率较低;StringBuilder是线程不安全的,效率较高。

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

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

9.如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba

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

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

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

不需要,抽象类不一定非要有抽象方法

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

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

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

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,编辑器也会提示错误信息:

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

  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

15.java 中 IO 流分为几种?

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

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

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

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

  • BIO:BLOCK IO 同步阻塞IO,就是我们平常使用的传统IO。它的特点是模式简单,使用方便。并发处理能力低。
  • NIO:New IO同步非阻塞IO,是传统IO的升级,客户端和服务端通过Channel(通道)通讯,实现了多路复用。

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_39650971/article/details/94546267