2个java基础问题,一个40分
问题1.函数的参数调用是不是值传递。实验了一下
Java code
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中只有值传递,String并没有得到什么特殊待遇.自己看书即可,不多解释了.
问题2: 从1.5开始就用StringBuilder做+操作了.如果只是一般的字符串连接,可以直接用"+"来实现.
如果涉及到循环,还是要自己用Stringbuilder,否则每次循环,jvm都要帮你创建一个StringBuilder对象,然后连接完了再创建一个String对象,远不如自己直接创建一个StringBuilder对象,每次循环中使用append效率高.
------解决方案--------------------在java 里的基础对象(好像8种)是通过值传递,比如int
java复杂对象是引用传递 比如List
String 是个比较特殊的对象,也是通过值传递
StringBuilder 效率肯定是比+高的,如果1.6+号也是调用SB实现那就一样,有的时候你有同步问题,就会用的StringBuffer, 所以建议不要用+
------解决方案--------------------问题一:两个都是引用传递。
paras.add("222");是对实例对象进行操作。
str = str +"end";只是改变了实参的引用。就好像在test中将paras.add("222");改为
paras = new ArrayList<String>(5);
输出结果就不变了。
------解决方案--------------------1java的String是因为改变值是会重新分配空间,如下:
String s = new String("a");
s = new String("b");
因为要重新分配空间所以地址变了,
但在传入的地方,是引用传递,只是在被调函数的内部改变了指针。
2还不清楚。。。。
API中没有说明
------解决方案--------------------String (字符串常量)是不可改变的
你让str=str+“end”;
只是在内存中新开辟一段空间
存储str+end的值,
而str 依旧指向原来的内存空间
ShtringBuffer 是可以改变的
------解决方案--------------------注意:在java中,当把一个简单类型传递给方法时,使用按值调用,而对象传递则是按引用传递的。也就是说按值传递时,接收参数的子程序参数的改变不会影响到该方法子外,而引用调用,当创建一个类类型的变量时,仅仅创建一个对象的引用,这就导致了对象改变时会影响作为参数的对象。通俗点就是一个没有变化,一有变化,原来的东东变了。
字符拼接简单的用+来做比较简单,高级点的就用Stringbuffer类的方法如append()和insert()方法。