Java基础知识学习笔记(1)
一、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文件)或者类本身就初始化失败了等。