String就是C++、java、VB等编程语言中的字符串,用双引号引起来的几个字符.如”Abc”,”一天”
String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.
string s1,s2;
s1="abc";
s2=s1;
s2="def";
//这样操作之后s1是”abc”,s2是”def”.
string a="hello,world!";
string b="hello,world!";
string c="hello!";
a 和 b 是不是指向同一个地址呢,下面看一下他们的内存地址
string a="hello,world!";
00000042moveax,dwordptrds:[02A62208h]
00000048movdwordptr[ebp-44h],eax
string b="hello,world!";
0000004bmoveax,dwordptrds:[02A62208h]
00000051movdwordptr[ebp-48h],eax
string c="hello!";
00000054moveax,dwordptrds:[02A756F8h]
0000005amovdwordptr[ebp-4Ch],eax
a的地址指向02A62208h,b的地址也是02A62208h,这说明了什么,创建b的时候.net机制肯定是先去查找内存中是否有这个字符串的内存地址,如果有则指向,没有才创建
String是不可变类,String对象的状态是不变的,所以线程安全。
所有不可变类都是线程安全的,但是线程安全的类并不一定是不可变类。比如StringBuffer,是可变类,但它的线程安全是靠锁来保证的。
Java StringBuffer 和 StringBuilder 类
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
捎带说下什么是线程安全
java中的线程安全是什么:
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。