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() 写入文件