Java基础2

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 对象转为⼆进制流,⽅便存储和传输。
  • 所以反序列化就是把⼆进制流恢复成对象。
    在这里插入图片描述

八、序列化的⼏种⽅式

  • 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值