1、String、StringBuilder和StringBuffer的区别?
String:字符串常量
StringBuilder 字符串变量(线程不安全)
StringBuffer 字符串变量 (线程安全)
原因:
String:定义存储字符数组为 private final char[] value ------> 字符串常量
StringBuffer 与 StringBuilder:共同继承AbstractStringBuilder类 ,而AbstractStringBuilder类的存储字符数据为 char[] value ,子类定义存储字符串数据的数组为 private char[] value------->字符串变量。
StringBuilder和StringBuffer线程安全问题:StringBuffer类中的方法加入synchronize方法锁。
String为设计为final类:安全性
StringBuilder和StringBuffer扩容和初始化大小:
初始化数据长度为:16
扩容:原有长度的两倍+2
2、sleep()方法和wait()方法的区别?
sleep()方法是属于Thread类,调用该方法让当前线程暂停,让出CPU,但是不释放线程锁。
wait()方法是属于Object类,调用该方法的线程必须拥有此对象的锁,执行该方法之后,线程阻塞,让出CPU并且释放锁;等待期间不配拥有CPU执行权,必须调用notify/notifyAll方法(notify是随机唤醒)唤醒并不意味着里面就会执行,而还是需要等待分配CPU才会执行。
相同点:
一旦执行sleep()方法或者wait()方法,使当前线程进入阻塞状态。
不同点:
1、所属类不同,sleep()属于Thread类,wait()属于Object类。
2、对锁是否释放不同,sleep()不释放锁,wait()释放锁。
3、方法适用的场景不同,sleep()任何场景都能调用,wait()只能用在同步代码块或者同步方法的监视器中。
4、线程被唤醒方式不同,调用sleep()方法的线程,被自动唤醒,而调用wait()方法并没有设置线程阻塞时间,该线程必须通过notify()方法/notifyAll()方法唤醒,反之,如果该线程调用wait()方法设定线程阻塞时间,则线程能被自动唤醒。