concat和add的区别,concat和concat_ws的区别
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。
返回:
一个字符串,它表示在此对象字符后连接字符串参数字符而成的字符。
+可以把任何类型的数据连接起来
JS 数组的 push 与 concat 区别
1、功能不同
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
concat() 方法用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
2、函数不同
push() :
var?a?=?[1,2,3,4];
a.push(5);??//a?现在是1,2,3,4,5
concat() :
var?a?=?[1,2,3,4];
var?b?=?[5,6];
var?c?=?a.concat(b);?//?a,b?数组都不变,c变成了1,2,3,4,5,6
扩展资料:
push是一个汇编术语,实现压入操作的指令是PUSH指令,实现弹出操作的指令是POP指令。
push()?说明
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。
concat() 返回值
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
例子
把 concat() 中的参数连接到数组 a 中:
script type="text/javascript"
var a = [1,2,3];
document.write(a.concat(4,5));
/script
输出:1,2,3,4,5
参考资料来源: 百度百科-push (汇编术语)
java里字符串的连接用加号和用concat()方法有什么不同
首先要明白java中字符串的原理:
java中字符串其实是一个char数组,但这个数组是不可变的,所以如果改变字符串内容都会对应的重新创建一个String对象,对应的也就生成了一个新的char数组。
public?String?concat(String?string)?{
????if?(string.count??0??count??0)?{
????????char[]?buffer?=?new?char[count?+?string.count];
????????System.arraycopy(value,?offset,?buffer,?0,?count);
????????System.arraycopy(string.value,?string.offset,?buffer,?count,?string.count);
????????return?new?String(0,?buffer.length,?buffer);
????}
????return?count?==?0???string?:?this;
}
这是jdk中的concat源码,它保证了重新生成的String对象内部的char数组的长度刚好是字符串长度。
对于使用加号连接,编译完后其实使用的是StringBuilder对象的append方法,它也会在System.arraycopy前进行扩容。
private?void?enlargeBuffer(int?min)?{
????int?newCount?=?((value.length??1)?+?value.length)?+?2;
????char[]?newData?=?new?char[min??newCount???min?:?newCount];
????System.arraycopy(value,?0,?newData,?0,?count);
????value?=?newData;
????shared?=?false;
}
可以看到这个扩容操作后char数组的长度是原长度的3/2倍,这样再调用 append方法如果长度是现有长度的1/2以内,就不用再进行扩容操作,进行提高了append性能,所以使用StringBuilder时设置初始长度是很有必要的。
java语言:String类的concat方法与StringBuffer类的append方法区别?内存状态?
首先我们先看几个概念:
1:在java内部是对+进行了重载,在处理String的过程中要创建一个StringBuffer对象,用StringBuffer对象的append方法对字符串进行连接,最后调用toString方法返回String字符串。
2: +和concat操作,是先开辟一个要拼接的字符串的空间,在和老字符串一起拼接成一个新的字符串,所以在堆内存中是创建了三块空间的;
然后先来说1和2的区别:line1: 用的是+,+在底层是通过StringBuffer对象的append方法对字符串进行连接,但是他也并不是直接添加的,我们看看他开辟了几块空间?“abc”“def”“ghi”,刚开始开辟了三块堆内存空间,执行一次+,“abcdef”这是第四块内存空间,最后是最终结果“abcdefghi”开辟了第五块堆内存空间,然后其余的被回收。
line2:同样也是开辟了五块堆内存空间,concat()和+号的区别我们可以看下concat()源代码:
public?String?concat(String?str)?{
????int?otherLen?=?str.length();
????if?(otherLen?==?0)?{
????????return?this;
????}
????int?len?=?value.length;
????/*copyOf数组复制,copyOf()的第二个自变量指定要建立的新数组长度,
????如果新数组的长度超过原数组的长度,则保留为默认值null或0*/
????char?buf[]?=?Arrays.copyOf(value,?len?+?otherLen);
????//将字符从此字符串复制到目标字符数组,len为数组中的起始偏移量
????str.getChars(buf,?len);
????return?new?String(buf,?true);
}
我们可以看到concat()方法是通过copyOf(),和getChars();两个方法来拼接数组的。+在底层是通过StringBuffer对象的append方法对字符串进行连接。
最后是StringBuffer:StringBuffer使用时,只会开辟一块内存空间,使用append添加或delete删除其内容时,也是在这一块内存空间中并不会生成多余的空间。所以速度是比较快的而String 每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,对速度的影响一定是相当大的。