扫码关注公众号
String实例化的方式?
方式一:通过字面量定义的方式方式二:通过new+构造器()的方式代码理解://通过字面量定义的方式:此时数据abc声明在方法区中的字符串常量池中Strings1="abc";Strings2="abc";//通过new+构造器的方式:此时s3,s4保存的地址值,是数据在堆空间中开辟以后对应的地址值Strings3=newString("abc");Strings4=newString("abc");System.out.println(s1==s2);//trueSystem.out.println(s1==s3);//falseSystem.out.println(s1==s4);//falseSystem.out.println(s3==s4);//falseSystem.out.println("**************************");Personp1=newPerson("Tom",14);Personp2=newPerson("Tom",14);System.out.println(p1.name.equals(p2.name));//true,因为比较的是实体内容(String重写了equals()方法)System.out.println(p1==p2);//falsenew的两个对象地址值是不一样的System.out.println(p1.name==p2.name);//truep1.name="Lay";System.out.println(p2.name);//结果为Tom
String和StringBuilder有哪些区别呢?
1:String的值不可变,StringBuilder的值是可变的。String每赋予一个值,都会产生一个新的地址,而StringBuilder是在原有地址上一直更改的,节省了大量的空间,这也代表了它运行的速度更快。速度上来说:StringBuilder>String。2:将StringBuilder的实例用于多个线程是不安全的,它不像String一样,在最后会被final修饰不可更改,所以需要这样的同步,则建议使用StringBuffer,单独同步处理则用StringBuilder。String:适用于少量的字符串操作的情况StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuilder 类基本概念与使用细节?
基本概念(1)StringBuilder类保存了一个可变的字符序列。此类提供了一个与StringBuffer类兼容的API。该类被设计用作StringBuffer类的一个简易替换,用在字符串缓冲区被单个线程使用的时候。(2)StringBuilder类不保证同步(即不是线程安全的),但它要比StringBuffer类的速度快,在单线程中,优先使用该类。使用细节1.StringBuilder类的直接父类是AbstractStringBuilder类。2.StringBuilder实现了Serializable接口,代表了StringBuffer类的对象可以串行化【即可以进行网络编程】。3.在父类AbstractStringBuilder中包含属性char[]value,没有final修饰(与String类不同),因此该value数组存储字符串的位置在堆内存中,而不是在方法区的常量池中。4.StringBuilder类是一个final类,不能被继承。5.因为StringBuilder类对象的字符序列是存储在char[]value属性中的,所以在改变字符序列时(增加/删除),不用每次都更换对象地址(即不是每次创建新对象),因此其效率高于String类6.StringBuilder类没有实现多线程同步(即它不是线程安全的)。
StringBuffer与StringBuilder的应用场景?
1、StringBuffer多线程安全,但是加了synchronized,其效率低。故适用于多线程下,并发量不是很高的场景2、StringBuilder没有加任何锁,其效率高,适用单线程场景,但同时也适用于高并发场景中,提高高并发场景下程序的响应性能,至于线程安全问题可以通过其它手段解决,如ThreadLocal,CAS操作等3、所以对于高并发场景下,若有用到二者,还是建议优先使用StringBuilder的