问题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实现的,也就是说以后可以随便加了,不知属实否?请消息灵通人士一辩真伪要有证据啊!

解决方案 »

  1.   

    在java 里的基础对象(好像8种)是通过值传递,比如int 
    java复杂对象是引用传递 比如List
    String 是个比较特殊的对象,也是通过值传递
    StringBuilder 效率肯定是比+高的,如果1.6+号也是调用SB实现那就一样,有的时候你有同步问题,就会用的StringBuffer, 所以建议不要用+
      

  2.   

    问题一:两个都是引用传递。
    paras.add("222");是对实例对象进行操作。
    str = str +"end";只是改变了实参的引用。就好像在test中将paras.add("222");改为
    paras = new ArrayList<String>(5);
    输出结果就不变了。
      

  3.   

    1java的String是因为改变值是会重新分配空间,如下:
    String s = new String("a");
    s = new String("b");
    因为要重新分配空间所以地址变了,
    但在传入的地方,是引用传递,只是在被调函数的内部改变了指针。2还不清楚。
    API中没有说明
      

  4.   

    String (字符串常量)是不可改变的 
    你让str=str+“end”;
    只是在内存中新开辟一段空间
    存储str+end的值,
    而str 依旧指向原来的内存空间ShtringBuffer 是可以改变的
      

  5.   

    注意:在java中,当把一个简单类型传递给方法时,使用按值调用,而对象传递则是按引用传递的。也就是说按值传递时,接收参数的子程序参数的改变不会影响到该方法子外,而引用调用,当创建一个类类型的变量时,仅仅创建一个对象的引用,这就导致了对象改变时会影响作为参数的对象。通俗点就是一个没有变化,一有变化,原来的东东变了。
    字符拼接简单的用+来做比较简单,高级点的就用Stringbuffer类的方法如append()和insert()方法。
      

  6.   

    1,Java中只有值传递,以上所谓的引用传递究其本质也是值传递的一种:传递reference值(引用指向的对象地址)
      

  7.   


    问题一:
    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文件,就知道了。
      

  8.   

    我测试过jdk1.5和jdk1.6,都是用StringBuilder做+操作.