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方法, 将其改为了比较值是否相等
	String x = "string";
	String y = "string";
	String z = 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

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

  • 不对, 两个对象的hashCode()相等, 结果也可能为flase

        String s1 = "通话";
        String s2 = "重地";
        System.out.printf("s1: %d | s2: %d%n", s1.hashCode(), s2.hashCode());
        System.out.println("s1.equals(s2) = " + s1.equals(s2));
    
    结果:
        s1: 1179395 | s2: 1179395
    	s1.equals(s2) = false
    
    • 分析 :

      显然, "通话"和"重地"的hashCode()值都为1179395, 而equals()却为false, 因为在散列表中, hashCode()相等即两个键值对 的哈希值相等, 而哈希值相等, 并不一定能得出键值对相等.

4.final在java中的作用

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

5.Java的Math.round(-1.5)等于多少

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

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

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

7. Java中操作字符串都有哪些类, 他们之间有什么区别

  • String, StringBuffer, StringBuilder
  • String, StringBuffer和 StringBuild的区别在于, String声明的是不可变的对象, 每次操作都会生成新的String对象, 然后将指针指向新的String对象, 而StringBuffer和StringBuilder可以在原有对象的基础上进行操作, 所有在经常改变字符串的情况下不推荐使用String
  • StringBuffer和StringBuilder的区别在于, StringBuffer是线程安全的, 而StringBuilder是线程不安全的, 而StringBuilder的性能高于StringBuffer, 所以在单线程的情况下推荐使用StringBuilder, 多线程情况下推荐使用StringBuffer

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

  • 不一样, 分配内存的方式不一样, String str = "i", JVM会将其分配到常量池中, 而String str = new String("i")会分配到堆内存中

9. 如何将字符串反转

  • 可以使用StringBuffer 或者 StringBuilder 的reverse()方法
    String s1 = "wo ai ni";
    //StringBuffer stringBuffer = new StringBuffer(s1);
    StringBuilder stringBuilder = new StringBuilder(s1);
    //StringBuffer reverse = stringBuffer.reverse();
    StringBuilder reverse = stringBuilder.reverse();
    System.out.println(reverse);

结果:
	in ia ow

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

  • indexOf(): 返回指定字符串的索引
  • charAt(): 返回字符串的字符数组
  • replace(): 替换指定处的字符串
  • trim(): 去除字符串两端的空白
  • split(): 截取字符串, 返回截取后的字符串数组
  • getBytes(): 返回字符串的byte类型数组
  • length(): 返回字符串长度
  • toLowerCase(): 将字符串全部转化为小写
  • toUpperCase(): 将字符串全部转化为大写
  • subString(): 截取字符串
  • equals(): 比较两个字符串是否相等

11. 抽象类一定要有抽象方法吗

  • 不一定,抽象类不一定要有抽象方法, 如

    public abstract class Cat() {
        public static void say() {
            System.out.println("miao~");
        } 
    }
    
    • 上述代码中抽象类没有抽象方法, 但代码完全可以正常运行

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

  • 普通类不能有抽象方法, 抽象类可以有抽象方法
  • 普通类可以被实例化, 抽象类不可以被实例化

13. 抽象类可以用final修饰吗

  • 不能, 抽象类就是让其它类继承的, final修饰的类不能被继承, 互相驳斥, 所以final不能修饰抽象类

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

  • 实现: 接口使用implements来实现, 抽象类使用extends来继承
  • 构造函数: 接口不能有构造函数, 抽象类可以有构造函数
  • 实现数量: 一个类可以实现多个接口, 但只能继承一个抽象类
  • 方法访问修饰符: 接口的方法默认使用public修饰, 抽象类的方法可以是任何访问修饰符

15. Java中IO流分为几种

  • 按功能来分: 输入流(input) 和 输出流(output)
  • 按类型来分: 字节流 和 字符流
    • 字节流和字节流的区别: 字符流是按8位传输以字节为单位输入输出的数据, 字符流是按16位传输以字符为单位输入输出数据

16. BIO, NIO, AIO 有什么区别

  • BIO : Biock IO 同步阻塞式IO, 就是我们传统使用的IO, 它的特点是模式简单使用方便, 并发处理能力低
  • NIO: New IO 同步非阻塞式IO, 是我们传统IO的升级, 客户端和服务器端通过Channel(通道) 通讯, 实现多路复用
  • AIO: Asynchronous 异步非阻塞式IO, 是NIO的升级, 也叫NIO2, 异步IO的操作是基于事件和回调机制

17. Fields的常用操作有哪些

  • Fields.exists() 检查文件路径是否存在
  • Fields.createFile() 创建文件
  • Fields.createDirectory() 创建文件夹
  • Fields.delete() 删除文件或文件夹
  • Fields.copy() 复制文件
  • Fields.move() 移动文件
  • Fields.size() 查看文件个数
  • Fields.read() 读取文件
  • Fields.write() 写入文件
posted @ 2021-01-19 23:04  Zzzy君不见  阅读(34)  评论(0编辑  收藏  举报