共计 2164 个字符,预计需要花费 6 分钟才能阅读完成。
一、String, StringBuffer, StringBuilder
1、可变性
(1)String 类型是使用一个 final 修饰的字符数组,因此它是不可变的。
private final char value[];
那把 String 定义为不可变有什么好处呢?
安全性 :当你在调用其他方法,比如调用一些系统级操作之前,可能会有一系列校验,如果是可变类的话,可能在你校验过后,其内部的值被改变了,可能引起严重的系统崩溃问题。
性能:进行哈希计算时,由于不可变性,可以只计算一次哈希值,如果设计为可变,那么就需要多次重新计算哈希值,性能上会有损耗。
(2)StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,也采用字符数组存储,但未用 final 修饰,因此可变
2、线程安全性
(1)String 变量因不可变,可看作常量,因此是 线程安全 的。
(2)StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是 线程安全 的。(3)StringBuilder 并没有对方法进行加同步锁,所以是 非线程安全 的。
3、性能
(1)每次改变 String 后都会生成一个新的对象,因此性能损耗较大。
(2)StringBuffer 每次都会对 StringBuffer 对象本身进行操作,性能较 String 更优。
(3)相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
4、使用场景
(1)操作少量数据用String
(2)单线程下操作大量数据用StringBuilder
(3)多线程下操作大量数据用StringBuffer
5、其他
为何推荐使用 StringBuilder 而不是“+”做字符串连接?
在使用“+”做字符串拼接时,是会创建一个 StringBuilder 去完成拼接的,但是如果是在循环中进行操作,就会每次创建一个新的 StringBuffer,性能上会有损耗,因此推荐直接使用 StringBuffer。
二、Collection 和 Collections
1、java.util.Collection 是一个 集合接口。很多类包括 map,set 等都实现了这个接口。
2、Collections是一个 工具类,不能实例化,提供了有一些方法:sort 等。
三、char 和 varchar
1、char 属于 固定长度 字符,而 varchar 属于 可变长度 字符,都可以用来存储字符串。
2、使用 char 时,如果输入的数目 小于 指定的数目,会在后面 补空格 ; 大于 指定的数目时,会 截取后面的部分。
https://ask.qcloudimg.com/htt…
3、varchar 使用时,输入长度 + 1 即为实际长度,多出来的一个字节用于保存实际使用了多大的长度。
四、Object 类有哪些方法
1、toString()方法 : toString 方法 返回该对象的字符串表示,其实该字符串内容就是 对象的类型 +@+ 内存地址值
2、equals()方法 :判断这两个对象是否是相同的,如果不进行重写,只会判断 对象的地址是否相同,即如果不是同一个对象,就会返回 false。
3、hashCode()方法:将十六进制地址值通过哈希算法换算为整值。
4、getClass()方法:获取对象的字节码文件(该对象运行时的类)。
五、Java 中的内存泄漏
Java 中的内存泄漏指的是对象虽然不再被使用,但它们仍然被引用。
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{Object o=new Object();
v.add(o);
o=null;
}
比如在上述这个例子中,Object 对象 o 被加入了 Vector 对象 v 中,虽然 o 修改为 null,这种情况下,v 依然引用对象,那么这个对象对于 GC 来说,就是不可回收的,即 产生了内存泄漏。
六、Error 和 Exception(继承自同一个类)
1、Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。(水池)
2、Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。(水 )
(1)CheckedException:(编译时异常)需要用 try——catch 显示的捕获,对于可恢复的异常使用 CheckedException。
(2)UnCheckedException(RuntimeException):(运行时异常)不需要捕获,对于程序错误(不可恢复)的异常使用 RuntimeException。
比如:
NullpointerException:空指针异常(我目前遇见的最多的)
IndexOutOfBoundsException:索引超出边界异常
注:ClassNotFoundException与 NoClassDefFoundError 的区别:
(1)ClassNotFoundException是指在类加载器的加载阶段找不到类信息。如 Class.forName(),ClassLoader.loadClass()等。
(2)NoClassDefFoundError是指在运行使用阶段时却出现了问题。如实例化依赖类找不到(删除了.class 文件)或者类本身就初始化失败了等。