Java和C#是极其的相似,两种语言都各有优劣,这里对Java和C#中string的异同进行一下介绍。
相同点:
1/ 在java和C#中string都被看做对象来处理,都有处理字符串的丰富的方法。
2/ 在java和C#中string都是不可变类。
亦即,当两个string变量s1,s2指向同一个字符串对象ss时,如果通过s1改变ss的值,将不会对s2指向的string实例产生影响,而是开辟另一块内存空间存储新的string,这也是和其他普通类最大的不同。对于下面的代码,java和C#都会输出相同的结果,先输出true后输出false。
string s1 = "123"; string s2 = s1; if (s1 == s2) { //输出true; } else { //输出false } s2 = "456"; if (s1 == s2) { //输出true; } else { //输出false }
不同点:
1/ C#中所有string对象都放在堆中,而java根据定义的形式,既可以放到堆栈中(有一个string池)也可以放到堆中。
String s=""; String s=new String();
对于上面的两种定义方式,C#都会将相应的string对象放到堆中,而在java中,用第一种方式定义的字符串会被放到堆栈中的string池中,第二种方式定义的字符串会放到对中,相应的第一种方式中的s存储的是堆栈中字符串的地址,第二种方式中的s存储的是堆中string对象的起始地址。
2/ java和C#中,比较字符串时“==”和“equals()方法”的异同。
String s1="123"; String s2=new String(xxx);//java中xxx为"123",C#中xxx为存储"123"的字符数组
上面的s1,s2代表的都是字符串"123",分别在java中和C#中执行下列操作,比较异同。
2.1 代码如下:
if (s1 == s2) { //输出true; } else { //输出false }
执行上面的代码,在C#中输出地会是true,而在java中输出地会是false,原因在于在C#中“s1s2”比较的是s1和s2指向字符串的实际内容,而在java中“s1s2”比较的是s1和s2这两个变量指向的string的地址,一个在堆栈中,一个在堆中,输出地肯定是false。
2.2 代码如下
if (s1.equals(s2)) { //输出true; } else { //输出false }
这次在C#和java中输出地都是true,现在可以总结出:在C#中s1 == s2和(s1.equals(s2)表示的意义相同,都是比较字符串的实际内容;而在java中前者比较的是地址,后者比较的才是字符串实际的内容。
这里我们再介绍点儿java中字符串的其它特性。
2.3 代码如下
String s1="123"; String s2="123"; String s3=new String("123"); String s4=new String("123"); if (s1 == s2) { //输出true; } else { //输出false } if (s3 == s4) { //输出true; } else { //输出false }
运行上面的代码你会发现,会先输出true,再输出false。后者输出false容易理解,因为s3和s4在堆的不同区域中,而前者为什么会输出true呢?这是因为,在java中当采用string s="test"的形式定义字符串时,会先检查string池中是否已经有test,如果有就将s指向已经有的这个test所在的内存区域中,本例中s1和s2指向的是同一个“123”,所以会输出为true。
本文转自 https://blog.csdn.net/lubiaopan/article/details/5784841,如有侵权,请联系删除。