1. StringBuffer 和 StringBuilder的比较
相同点
继承层次相同
底层都是用字符数组实现,字符串都是可变的;
都是将大部分操作委托给父类;
初始容量都是16和扩容机制都是”旧容量*2+2”
不同点
StringBuffer是线程安全的,StringBuilder不是线程安全的。
StringBuffer从JDK1.0就有了,StringBuilder是JDK5.0增加的
StringBuffer比StringBuilder多了一个toStringCache字段,用来在toString方法中进行缓存。在重复调用toString()时能提升效率
由于StringBuilder没有考虑同步,在不会出现线程安全问题的情况下,性能上StringBuilder应该要优于StringBuffer
2. == 和 equals 的区别
它这个东西主要是用在 Hashmap 和 Hashset 这类容器中,Hashset 存储元素时会去判断它是否存在,假设你没有重写 equals 方法那么它会调用超类也就是 Object 类中的 equals 方法去比较,而超类中的 equals 中实际上是调用了==去比较这两个对象是否一样
public boolean equals(Object obj) {
return (this == obj);
}
==在比较引用类型的时候比较的是这两个对象的内存地址,所以尽管这个对象内容一样,只要它的内存地址不一样它就会判断为不一样的元素,就可以无情的存储进去。
所以我们需要重写它的 equals 方法。让它变成比较这个对象里面的属性。这样它就不会出现明明长的一样的对象却存了两个的情况了。
那么既然讲到了 equals 肯定要讲 hashCode 为什么要讲,因为 hascode 也就是哈希码值,哈希码不同对象肯定不同,所以为了节省时间在调用 equals 方法前,程序首先会计算出哈希码通过这个哈希码去查询序列是否已经有值如果没有直接存入,如果有数据则比较它们的 hashCode, 有相同的则调用 equals 进行比较。 那么为什么要重写它,因为你已经把 equals 方法改成比较内容了,那么你的 hashCode 方法也应该重写为计算内容的 hascode 不然就会对应不上。
综上所述,假设你看不懂那么你首先你需要去了解 HashMap 的底层结构,其次引用类型和基本类型的区别,再次所有类的爸爸 Object 类中的方法的作用,最后 jvm 的内存模型。
==是判断两个引用类型指向堆中的对象是否是同一个,也就是比较两个地址是否一致,如果一致,那就是同一个对象,那这两个指针就相等。equals 往往是要比较两个对象的内容是否一致。因为我们认为即使在堆中是两个对象,但只要对象里面的熟悉完全一样,那么我们就认为这两个对象也是相等的。所以如果我们需要比较两个自定义的类的两个对象内容是否一样,就要重写 equals 方法。比如 String a="aaaa"和 String b=new String(“aaaa”) 这两个对象 a 和 b 是相等的,因为内容一样。即使他们两个不是同一个对象,a 是在常量区,b 是在堆中,但因为 String 重写了 equals 方法,比较的是内容,所以两个变量都表示"aaaa"这个字符串。
线程进程区别
wait(持有锁)
sleep(不会持有锁)
线程的几种状态
用户线程 守护线程
用户线程:自定义线程 都是用户线程 主线程已经结束,用户线程还在运行,jvm还是处于存活状态
守护线程:运行在后台中的特殊线程 如:垃圾回收 没有用户线程,都是守护线程,jvm结束
Synchronize关键字:
创建资源类,在资源类创建属性和方法
创建多个线程,调用资源类的操作方法
1478

被折叠的 条评论
为什么被折叠?



