问题1.函数的参数调用是不是值传递。实验了一下public static void main(String[] args) {
List<String> paras = new ArrayList<String>(5);
paras.add("111");
String s = "begin";
test(paras,s);
System.out.println("paras="+paras);
System.out.println("s="+s);
}
public static void test( List<String> paras ,String str){
paras.add("222");
str = str +"end";
}
运行输出
paras=[111, 222]
s=begin
也就是说List对象只是把指针(引用)传给函数,而String对象则是值传递。同样都是对象,差距咋就这么大涅问题2 对于字符串拼接,很多书上都说StringBuilder的效率比 + 高,一般超过3个字符相加我都用StringBuilder
但是听说jvm 1.6以后,+号也是调用SB实现的,也就是说以后可以随便加了,不知属实否?请消息灵通人士一辩真伪要有证据啊!
List<String> paras = new ArrayList<String>(5);
paras.add("111");
String s = "begin";
test(paras,s);
System.out.println("paras="+paras);
System.out.println("s="+s);
}
public static void test( List<String> paras ,String str){
paras.add("222");
str = str +"end";
}
运行输出
paras=[111, 222]
s=begin
也就是说List对象只是把指针(引用)传给函数,而String对象则是值传递。同样都是对象,差距咋就这么大涅问题2 对于字符串拼接,很多书上都说StringBuilder的效率比 + 高,一般超过3个字符相加我都用StringBuilder
但是听说jvm 1.6以后,+号也是调用SB实现的,也就是说以后可以随便加了,不知属实否?请消息灵通人士一辩真伪要有证据啊!
java复杂对象是引用传递 比如List
String 是个比较特殊的对象,也是通过值传递
StringBuilder 效率肯定是比+高的,如果1.6+号也是调用SB实现那就一样,有的时候你有同步问题,就会用的StringBuffer, 所以建议不要用+
paras.add("222");是对实例对象进行操作。
str = str +"end";只是改变了实参的引用。就好像在test中将paras.add("222");改为
paras = new ArrayList<String>(5);
输出结果就不变了。
String s = new String("a");
s = new String("b");
因为要重新分配空间所以地址变了,
但在传入的地方,是引用传递,只是在被调函数的内部改变了指针。2还不清楚。
API中没有说明
你让str=str+“end”;
只是在内存中新开辟一段空间
存储str+end的值,
而str 依旧指向原来的内存空间ShtringBuffer 是可以改变的
字符拼接简单的用+来做比较简单,高级点的就用Stringbuffer类的方法如append()和insert()方法。
问题一:
String既可为基础数据类型也为对象数据类型。在你的例子中是对象数据类型,因此为引用传递。
楼主代码编译后,实际上为:
public static void main(String args[])
{
List paras = new ArrayList(5);
paras.add("111");
String s = "begin";
test(paras, s);
System.out.println((new StringBuilder()).append("paras=").append(paras).toString());
System.out.println((new StringBuilder()).append("s=").append(s).toString());
} public static void test(List paras, String str)
{
paras.add("222");
str = (new StringBuilder()).append(str).append("end").toString();
}问题二:是的.关于证据你可以反编译你的代码,或者是直接看下对应class文件,就知道了。