String
一、String 和 StringBuilder、StringBuffer 的区别?
- String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的⽣成。
- StringBuffer:跟 String 类似,但是值可以被修改,使⽤ synchronized 来保证线程安全。
- StringBuilder:StringBuffer 的⾮线程安全版本,性能上更⾼⼀些。
二、String str1 = new String(“abc”)和 String str2 = “abc” 和 区别?
- 两个语句都会去字符串常量池中检查是否已经存在 “abc”,如果有则直接使⽤,如果没有则会在常量池中创建 “abc” 对象。
- 但是不同的是,String str1 = new String(“abc”) 还会通过 new String() 在堆⾥创建⼀个 “abc” 字符串对象实例。所以后者可以理解为被前者包含。
三、String 字符串拼接是如何实现的?
在jdk1.8 之前,a 和 b 初始化时位于字符串常量池,ab 拼接后的对象位于堆中。经过拼接新⽣成了String 对象。在Java8 时JDK 对“+”号拼接进⾏了优化,上⾯所写的拼接⽅式会被优化为基于 StringBuilder 的append ⽅法进⾏处理。
四、String 怎么转成 Integer 的?原理?
- String 转成 Integer,主要有两个⽅法:Integer.parseInt(String s) Integer.valueOf(String s)
- 不管哪⼀种,最终还是会调⽤ Integer 类内中的 parseInt(String s, int radix) ⽅法。
public static int parseInt( String s, int radix )
throws NumberFormatException
{
int result = 0 ;
/ /是 否 是 负 数
boolean negative = false ;
//char字符数组 下 标 和 长 度
int i = 0 , len = s. length ();
… …
int digit ;
/ /判 断 字符长度 是 否 ⼤ 于0, 否 则 抛 出 异 常
i f ( len > 0 ) {
… …
while ( i < len ) {
// Accumulating negatively avoids surprises near MAX_VALUE
/ /返 回 指 定 基 数中字符 表 ⽰ 的 数 值 。(此处是 ⼗ 进 制 数 值 )
digit = Character. digit(s. charAt ( i + + ) , radix ) ;
/ /进 制 位 乘 以 数 值
result * = radix ;
result - = digit ;
}
}
/ /根 据 上⾯得到的是 否 负 数 , 返回相应 的 值
return negative ? result : - result ;
}
五、Object 类的常见⽅法
异常
六、三道经典异常处理代码题
public class TryDemo {
public static void main ( String [] args) {
System.out.println(test());
}
public static int test () {
try {
return 1 ;
} catch ( Exception e ) {
return 2 ;
} finally {
System.out.print("3") ;
}
}
}
- 执⾏结果:3 1。
try、catch。finally 的基础⽤法,在 return 前会先执⾏ finally 语句块,所以是先输出 finally ⾥的3,再输出 return 的 1。
public class TryDemo {
public static void main ( String [] args) {
System.out.println(test1());
}
public static int test1 () {
try {
return 2 ;
} finally {
return 3 ;
}
}
}
- 执⾏结果:3。
try 返回前先执⾏ finally,结果 finally ⾥不按套路出牌,直接 return 了,⾃然也就⾛不到 try ⾥⾯的 return 了。
finally ⾥⾯使⽤ return 仅存在于⾯试题中,实际开发这么写要挨吊的。
public class TryDemo {
public static void main ( String [] args) {
System . out . println ( test1 ());
}
public static int test1 () {
int i = 0 ;
try {
i = 2 ;
return i ;
} finally {
i = 3 ;
}
}
}
- 执⾏结果:2。
- ⼤家可能会以为结果应该是 3,因为在 return 前会执⾏ finally,⽽ i 在 finally 中被修改为 3 了,那最终返回 i 不是应该为 3 吗?
但其实,在执⾏ finally 之前,JVM 会先将 i 的结果暂存起来,然后 finally 执⾏完毕后,会返回之前暂存的结果,⽽不是返回 i,所以即使 i 已经被修改为 3,最终返回的还是之前暂存起来的结果 2。
I/O
-------------
序列化
七 、什么是序列化?什么是反序列化?
- 什么是序列化,序列化就是把 Java 对象转为⼆进制流,⽅便存储和传输。
- 所以反序列化就是把⼆进制流恢复成对象。