本文目录一览:
java关于字符串拼接的问题
这是描述Java编译器对字符串常量的优化方法。
众所周知,数据内容是要定义在数据段的,假设下面的代码:
String s1 = "abc" ;
String s2 = "abc" ;
假如不进行优化的话,结果就是内存中有两个重复的"abc"内容,也就是说有两个“对象”。
Java编译器会针对这种情况进行优化,对于常量字符串"abc",java编译器会只产生一个"abc"对象。这样,s1和s2是指向同一个内存区域的。
但假如字符串的值无法在编译时确定,如:String g = a.concat("3");
那么Java编译器将会为g变量分配一个空间。注意也不是立即分配,因为Java编译器是在全局对动态分配内存。
补充: 编译器不会检查 "test" + "3" 的结果是否就是"test3",因此创建新对象。
java字符串拼接
不是指向同一个对象的。
假设再有个语句,String e = "test3";因为String是final的,不可修改,所以可以把e看成常量。
当再遇到String d="test"+"3"时,编译器在这里做了优化,把这条语句优化为String d="test3",由于存在一个相同的对象e,所以d也指向了e.
所以d、e是同一个对象。
而编译器在处理String c=a+b时,认为是两个变量相加,不会做优化。所以c,d不是同一个对象。
如果将a,b定义为
final String a = "test";
final String b="3";
这时String c=a+b就变成了常量相加,所以编译器会对其进行优化,即这时c,d就相等了
ps:推荐楼主一本书《深入java虚拟机》,对java的底层机制有很好的介绍。
Java字符串拼接问题
因为String类型是引用类型,s3和s4的引用值是不一样的,尽管他们存储的数据一样,直接使用==进行比较,比较的是引用值的大小,所以是false,字符串这种引用类型比较大小的话一定要使用equals来比较,即System.out.println(s3.equals(s4));这样,输出结果就是true了。
java中string类concat方法和+的区别
java中string类concat方法和+的区别如下:
concat:将指定字符串连接到此字符串的结尾。如果参数字符串的长度为 0,则返回此 String 对象。否则,创建一个新的 String 对象,用来表示由此 String,对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列。示例:
"cares".concat("s") returns "caress"
"to".concat("get").concat("her") returns "together"参数:
str - 连接到此 String 结尾的 String。
返回:
一个字符串,它表示在此对象字符后连接字符串参数字符而成的字符。
+可以把任何类型的数据连接起来
C#拼接字符串的几种方式和性能
C# 拼接字符串的几种方式和性能
开发过程中常用到的拼接字符串的方法有三种:
1 简单 “+=” 拼接法
1
2
3
4
5
string str="a";
str+="c"+"d";
string str_1="a"+"b";
首先需要明白的是string类型,string是引用类型,保留在堆上,而不是栈上,用的时候传的是内存中的地址,每次修改就会重新创建一个新的string对象来存储字符串,原有的会被自动回收。
第一种方式的实现原理,第一步先在内存中分配空间,存储str变量的对象,值为"a", “+=”时,又会重新创建一个对象来存储新的字符串(“abc"),把str指向这个新的地址。所以只有简单几步的拼写时,一般不会有太大问题,如果有时候需要循环拼接时,就会不断创建新的对象,很浪费性能和内存。
2 String.Format()
1
string str= String.Format("{0}{1}{2}","a","b","c");
这就需要先看看他的源代码了,
public static String Format(IFormatProvider provider, String format, params Object[] args) br data-filtered="filtered"{
if (format == null || args == null)
throw new ArgumentNullException((format==null)?"format":"args");
StringBuilder sb = new StringBuilder(format.Length + args.Length * 8);
sb.AppendFormat(provider,format,args);
return sb.ToString();
}
可以看到是先创建一个StringBuilder类型的变量,长度为第一个参数的长度+参数长度的8倍。.Net自动分配一个比较大的容量来存储。StringBuilder的介绍请看第3种方法.
这种方式的代码看起来比较整洁,易于月度,效率也比+=高效很多。
3 StringBuilder.Append
StringBuilder str=new StringBuilder();
str.Append("a");
StringBuilder 是预先创建一个比较大的内存,以后每次操作时判断容量上限是否不够用,如果不够用就自动把容量扩大一倍,修改的还是第一次创建的对象的值。
如果是简单的拼写时,可以用 "+=", string.format
循环内拼写很长的字符串时,就需要用到StringBuilder来节省性能和内存了。