Java 基础篇
1. jdk和jre的区别;
- jdk(java develop kit) java开发环境, jre(java runtime environment) java运行环境
- jdk包含jre, 同时包含编译器javac, 和一些其他的java调试和分析的工具;
2. == 和 equals的区别;
- == 是符号运算符, equals是Object中的方法;
- == 比较的是进本类型的值, 引用类型的地址值, equals比较的是地址值;
equals可以被重写, equals是Object中的方法, 源码底层也是, 等号的比较
public boolean equals(Object obj) {
return (this == obj);
}
但是可以被重写, Integer 和 String等对象就是进行了重写, 相当于值的比较
Integer.equals()
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
String.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;
}
3. 两个对象的hashCode()相同, 则equals()也一定为true
- 不一定, String中hashCode的计算, 是 s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1] 字符的asic码计算得来的, 可能会出现重复, 例如
System.out.println("ABCDEa123abc".hashCode()); // 165374702
System.out.println("ABCDFB123abc".hashCode()); // 165374702
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
自定义的对象也可以重写hashCode和equals方法, 可能 hashCode相同, equals不同;
4. final在java中有什么作用
- final添加到类上, 不能被继承;
- 添加到方法上, 不能被重写;
- 添加到变量上, 成为常量, 必须有初始化的值, 不能被修改
5. java中Math.round(-1.5)等于多少
- 向右取整 为 -1;
6. String 是基础的数据类型吗
- 不是基础数据类型不包含String
- 基本数据类型包含
1个字节是8个2进制的字符组成
1024 byte = 1 kb
byte : 1 字节
char : 2 字节
short : 2 字节
int : 4 字节
long : 8 字节
fload : 4 字节
double : 8 字节
boolean : 1bit (1/8 字节)
7. String str = “a” 与 String str = new String(“a”) 一样吗
- 不一样的 new 是新创建了一个对象;
- String str = “a” 是java虚拟机在常量中分配, 指向的是常量池中的地址值;
- new String(“a”) 是在堆内存中分配内存, 指向的是堆内存中的地址值;
8. 如何将字符串反转
- 使用StringBuffer 和 StringBuilder 的 reverse 方法;
9. BIO , NIO, AIO 有什么区别
- BIO Block IO 同步阻塞式IO, 使用简单方便, 并发处理能力低;
- NIO No Block IO 同步非阻塞式IO, 服务端和客户端使用channel(通道)来通行, 实现io多路复用, 只需要1一个线程, 提高了并发处理能力
- AIO Asynchronous IO 异步非阻塞式IO, NIO的升级, 异步处理, 基于事件和回调处理;
10. java的Error,Exception的区别,试着举例几种RuntimeException
- 全部继承 Throwable ;
- Error只错误, 是系统级别的错误, 程序不必处理的异常, 当出现错误的时候, 程序没有办法处理虚拟机会抛出, 例如内存异常等;
- Exception, 异常, 是需要程序处理的异常, 程序可以捕捉, 可以处理;
- Exception 分为运行时异常RuntimeException 和 非运行时异常;
- 常见的RunntimeException : NullPointException , IndexOutOfBoundsException, IllegalArgumentException;
- 常见的非运行时异常 : IOException, NoSuchMethodException
11. TCP的三次握手
- 第一次握手: 客户端向服务端发送syn(syn=j)包, 进入sync_send 状态, 等待服务端确认;
- SYN:同步序列编号(Synchronize Sequence Numbers)
- 第二次握手: 服务端接受客户端的syn包, 并进行确认(syn=j+1), 并发送syn包, 即syn+ack包, 并进入syn_recv状态;
- 第三次握手: 客户端接收到服务端发送的包, 向服务端发送确认的ack包(ack=k+1), 发送完毕, 此时完成三次握手, 客户端服务端进入established(已建立)状态;