Java 基础
1. JDK 和 JRE 有什么区别?
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。
JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。
JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收购SUN公司的JRE版本
2. == 和 equals 的区别是什么?
- 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
- 引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)
== 的作用:
基本类型:比较的就是值是否相同
引用类型:比较的就是地址值是否相同
equals 的作用:
引用类型:默认情况下,比较的是地址值。
注:不过,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”(存在不同地址返回同一整数?)。
equals 默认情况下,比较的是地址值。即
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
4. final 在 Java 中有什么作用?
final关键字可以用于三个地方。用于修饰类、类属性和类方法。
1.被final关键字修饰的类不能被继承。
2.被final关键字修饰的类属性必须给定初始值,且不能被修改;
3.类方法不能被重写(重写:不论返回值,参数类型、数量不同,只要方法名相同都属于重写);
5. Java 中的 Math.round(-1.5) 等于多少?
Math.round 的四舍五入的原理是在参数上加0.5然后进行下取整。
即 Math.round(-1.5) = -1;
6. String 属于基础的数据类型吗?
不属于,是final修饰的java类。
数据类型:
1 字符类型:byte,char
2 基本整型:short,int,long
3 浮点型:float,double
4 布尔类型:boolean
7. Java 中操作字符串都有哪些类?它们之间有什么区别?
String : 不可变字符串
StringBuffer :线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。
StringBuilder : 不能安全使用多线程,可变的字符序列。 如果需要同步,建议使用StringBuffer
8. String str1="i"与 String str2=new String(“i”)一样吗?
通过测试 str1 == str2 返回 false ; str1.equels(str2) 返回 true
String A = "ABC";内存会去查找常量池,如果没有的话,在常量池中中开辟一块儿内存空间,把地址付给栈指针,如果已经有了"ABC"的内存,直接把地址赋给栈指针;
因此
String str1="aa";
Srting str2="aa";
String Str3="aa";
....
这样下去,str1==Str2==str3;会一直相等下去,(a) ==的判断, (b) equals()的判断;都相等,因为他们的地址都相等,因此只在常量池中有一份内存空间,地址全部相同;
而String str = new String("a");是根据"a"这个String对象再次构造一个String对象;在堆中从新new一块儿内存,把指针赋给栈,
将新构造出来的String对象的引用赋给str。 因此 只要是new String(),则,栈中的地址都是指向最新的new出来的堆中的地址,
(a)“”==“” 是判断地址的,当然不相同;
(b)至于equals,String类型重写了 equals()方法,判断值是否相等,明显相等,因此 equals 是相等的;
这是String 重写的equals:
9. 如何将字符串反转?
1.使用StringBuffer的reverse()方法 (最优推荐)
2.自己实现String反转 递归法
将首字符放到末尾。
public static String reverse(String str){
if ((str == null) || str.length() <2) return str;//为Null,长度少于2直接跳过
return reverse(str.subString(1))+str.charAt(0);
}
10. String 类的常用方法都有那些?
int length() : 返回字符串的长度
char charAt(int index) : 根据位置返回字符 ,范围为 0~(length-1)
byte[] getBytes() : 转换为字节数组
boolean equals(Object o) : 比较字符串值是否一致
int indexof(String str) : 查找需要字符串在目标字符串中出现的第一次的索引 , 未出现返回 -1
String replaceAll(String old,String new) : 替换全部制定匹配字段 old --> new
String substring(int start,int end) : 截取字符串
String[] split(String regex) : 根据指定regex分割字符串为数组
boolean startsWith(String start) / endsWith(String end) : 以指定字符串开头或结尾
int compareTo(String another) : 比较大小
String trim() : 去空格
String toUpperCase() / toLowerCase() : 全部转换大小写
11. 抽象类必须要有抽象方法吗?
不必须。
- 抽象类必须有关键字abstract来修饰。
- 抽象类可以不含有抽象方法
- 如果一个类包含抽象方法,则该类必须是抽象类
12. 普通类和抽象类有哪些区别?
- 抽象类不能被实例化。
- 抽象类可以有构造函数,抽象方法不能被声明为静态。
- 抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
- 含有抽象方法的类必须申明为抽象类
- 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
13. 抽象类能使用 final 修饰吗?
不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。
14. 接口和抽象类有什么区别?
分类 | 接口 interface | 抽象类 abstract |
构造方法 | N | Y |
普通成员变量 | N | Y |
方法 | 全抽象 | 可包含非抽象 |
访问权限 | 全 public | public、protected 和 default |
静态方法 | N | 已实现的静态方法(JDK1.8前不能有静态方法) |
静态成员 | Y | Y |
PS:一个类 可实现多个接口,仅能继承一个类。一个接口不可实现接口,可以继承一个接口
15. Java 中 IO 流分为几种?
I:input/read 输入、O: output/write 输出
(1)按照数据的流向:
输入流、输出流
(2)按照流数据的格式:
字符流、字节流
(3)按照流数据的包装过程:
节点流(低级流)、处理流(高级流)
16. BIO、NIO、AIO 有什么区别?
同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
BIO是一个连接一个线程。BIO往往会引入多线程,每个连接一个单独的线程
NIO是一个请求一个线程。NIO是使用单线程或者只使用少量的多线程,每个连接共用一个线程
AIO是一个有效请求一个线程。由OS先完成了再通知服务器应用去启动线程进行处理
17. Files的常用方法都有哪些?
- Files.exists() 检测文件路径是否存在
- Files.createFile()创建文件
- Files.createDirectory()创建文件夹
- Files.delete() 删除文件或者目录
- Files.copy() 复制文件
- Files.move() 移动文件
- Files.size()查看文件个数
- Files.read() 读取文件
- Files.write()写入文件