StringBuilder一疑问

问题描述

public static void main(String[] args) {StringBuilder b1 = new StringBuilder("a");StringBuilder b2 = new StringBuilder("b");op(b1,b2);System.out.println(b1+","+b2); // 结果为 ab,b 为什么??}public static void op(StringBuilder b1, StringBuilder b2){b1.append(b2);b2 = b1;}

解决方案

入门基础 Java参数传递方式 1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。 2、对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象( 70-305 ),方法调用结束后,原来对它的引用并没用指向新的对象。 代码如下: public class Tester { public static void main(String[] args) { int primitive = 2; changePrimitive(primitive); //primitive的值依然是2 MyClass myClass = new MyClass(); changeObject(myClass); //myClass仍然指向的是执行changeObject之前的那个对象 //但是myClass.i等于3了 } public static void changePrimitive(int primitive) { primitive = 3; } public static void changeObject(MyClass myClass) { myClass.i = 3; myClass = new MyClass(); } } class MyClass { int i; }
解决方案二:
传递给op方法的两个参数其实是b1,b2这两个对象在内存中的地址的拷贝;对b1调用了append方法,就是对这个地址上的对象进行了某种程度的修改,最终b1还是指向原来的地址,但是在该地址的对象已经改变了;而b2=b1;这个语句只是单纯的将b1这个对象的地址赋值给了b2,由于b2只是一个拷贝,所以最终原来的b2还是指向new StringBuilder("b")这块内存空间,所以不变。
解决方案三:
public static void main(String[] args) {// 创建一个"a"的StringBuilder对象,b1是这个对象的引用StringBuilder b1 = new StringBuilder("a");// 创建一个"b"的StringBuilder对象,b2是这个对象的引用StringBuilder b2 = new StringBuilder("b");// 调用op方法,把引用b1,b2传递给opop(b1,b2);System.out.println(b1+","+b2); // 所以结果ab,b}public static void op(StringBuilder b1, StringBuilder b2){// b1指上面的对象"a",append后修改了"a"这个对象,变成abb1.append(b2);// 把b1的引用赋给b2,也就是b2指向了"ab",上面b2引用的对象并没有变化b2 = b1;}
解决方案四:
方法是传值的。调用方法时,b2指针拷贝了一份传入方法,在方法内部改变了这个拷贝的指针的值,但是原来的b2并没有改变

时间: 2024-08-17 21:31:33

StringBuilder一疑问的相关文章

String StringBuffer StringBuilder的区别

原文:http://blog.csdn.net/ygc87/article/details/6796843  三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 原因: String:字符串常量 StringBuffer:字符串变量 StringBuilder:字符串变量 从上面可以看到,String是"字符串常量",也就是不可改变的对象.对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码: String s

java-基础-String、StringBuilder以及StringBuffer剖析

String源码分析 从一段代码说起: public void stringTest(){ String a = "a"+"b"+1; String b = "ab1"; System.out.println(a == b); } 大家猜一猜结果如何?如果你的结论是true.好吧,再来一段代码: public void stringTest(){ String a = new String("ab1"); String b =

深入理解String、StringBuffer、StringBuilder(转)

文章系转载,非原创,原地址:  http://www.cnblogs.com/dolphin0520/p/3778589.html 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder

String 的“+”操作一定比 StringBuilder.append()慢吗

问题描述 如果不知道而想知道就去看java特种兵这本书,讲的很透彻 解决方案 比较讨厌的就是这类人,打着技术的幌子,行推销的勾当. 此类帖子,如果你不是真的有疑问或者想热心帮人解答,而是故弄玄虚的广告贴,只能更让人厌烦,书有多烂不知道,但是此类的推销会让人对书的评估减分,这点是无益的. 很多技术类的论坛,基本全是被这些广告贴搞跨的,这样的例子比比皆是.解决方案二:明显的广告贴,一个人发帖,找几个人回帖,然后再伪装成书的作者回答问题,典型的一问一答,呵呵 ,低级解决方案三:没想到这里被拿到提问了里

Java那点事——StringBuffer与StringBuilder原理与区别_java

最近在找工作,考官问我一个简单的题目:"StringBuffer与StringBuilder的区别,它们的应用场景是什么?",下面小编答案分享给大家,方便以后大家学习,以此也做个备录. 其实只要找下Google大神就有答案了:StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全

String,StringBuffer,StringBuilder

String,StringBuffer,StringBuilder 这三者的区别是 Java 学习中的一个基础知识,也是在面试中经常会问到的一个知识点 String String 也许是 Java 中最常被用到的类了,关于它,有很多值得一提的地方 首先,Java 中的 String 是一个 char 类型序列: char[] data = {'a', 'b', 'c'}; // 等价于 String str = "abc"; 不过,更加严格地定义 String , 它应该是 Unico

dreaweaver-关于网页边框使用的问题,新手有疑问

问题描述 关于网页边框使用的问题,新手有疑问 右下边框mp3,视频,图片--这个内嵌表格为什么不是在左上角开始,而是跑中间去了-求解 解决方案 td默认就是水平居中的,你要居上给td添加valign="top" <td width="760" valign="top"> 解决方案二: 新手使用python常见问题 解决方案三: 给table或者td写样式啊,实在不行就打开开发者工具看看居中的那个块元素在哪个位置.然后根据实际情况去加样

java中++a和a++ 在数组实现栈中的小疑问

问题描述 java中++a和a++ 在数组实现栈中的小疑问 package 数组实现栈; public class StackArray implements Stack { public static final int num = 1024;//数组默认容量 public int capacity;//数组实际容量 public Object s[];//对象数组 public int top = -1;//栈顶元素位置 //构建默认容量栈对象 public StackArray() { t

新手学JAVA(三)----StringBuilder类

   上一篇文章新手学JAVA(二)----String类与StringBuffer类的区别中了解到,String的值是不可变的,这就导致 每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变 类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象.       StringBuffer类和StringBuilder类功能基本相似.算是两个双胞胎.   下面主要说两点   第一点  线程安全   Str