String和StringBuffer相关

在http://www.cnblogs.com/aishangJava/p/7262577.html这里看到了一个题目,就去尝试了一下,代码如下:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

/**
 *
 * @author Administrator
 */
public class change {

    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        StringBuffer sb1 = new StringBuffer("hello");
        StringBuffer sb2 = new StringBuffer("world");
        change(s1, s2);
        System.out.println(s1 + "---" + s2);
        change(sb1,sb2);
        System.out.println(sb1+"---"+sb2);
    }

    public static void change(String s1, String s2) {
        s1 = s2;
        s2 = s1 + s2;
    }

    public static void change(StringBuffer sb1, StringBuffer sb2) {
        sb1 = sb2;
        System.out.println("first sb1:"+sb1);
        sb2.append(sb1);
        System.out.println("sb1:"+sb1+"\tsb2:"+sb2);
    }
}

百度了一下,整理一下自己的理解:

在第一个change中,改变的只是形参的值,实参并没有改变;

第二个change中,由于StringBuffer定义时,sb1是存储在栈空间里的一个指向堆空间的一个地址,堆的值就是“hello”,当进行sb1=sb2的操作后,sb1中的地址就指向了sb2所指向的对象,所以在此时sb1的值为“world”,之后sb2进行append,随之s1的值变为“worldworld”。

至于为什么最后sb1输出的还是"hello",百度看了一下是这么回事:

要知道java中所有方法的实参都是传入变量的副本,所以对于基本类型参数,改变其副本值,原始参数不受影响,而对于引用类型参数,传入的是引用的副本,原始引用和副本引用指向同一个对象,操作副本引用指向的对象时,原始引用的对象也会随之改变(说白了,两个引用指向一个对象),但是 sb1=sb2,是说将这个sb1的副本引用设置为sb2的引用,使得副本引用sb1指向了sb2对象,但是原始引用sb1却没有参与任何操作,所以sb1不变。
时间: 2024-10-17 07:47:54

String和StringBuffer相关的相关文章

【转载】String、StringBuffer与StringBuilder之间区别

文章来源:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 这两天在看Java编程的书,看到String的时候将之前没有弄懂的都理清了一遍,本来想将String之间的区别记录下来的,在找资料的时候发现这位网友整理的很不错,值得借鉴.我就在这个上面添一点自己的理解了.原文地址在上面. 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的

java中String、StringBuffer、StringBuilder的总结

看了很多关于java的string的相关知识,这里做一个较为全面的总结,内容转自不同地方的博客,鉴于出处较多,就不一一列举了. java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 1.可变与不可变 String类中使用字符数组保存字符串

[Java开发之路](4)String、StringBuffer与StringBuilder详解

最近学习到字符串,整理了一下String,StringBuffer,StringBuilder相关知识 1. String String 类位于 java.lang 包中.String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同. String str1 = "xiaosi"; str1 = "欢迎你 " + str1; System.out.println(str1); // 欢迎你 xiaosi 通过观察运行结果可以

String、StringBuffer、StringBuilder的区别及使用

不可变类 - String 一如既往,在进行学习之前我们先看看相关的定义吧-下面引自 JavaDocs: Strings are constant; their values cannot be changed after they are created String 类是不可变的,String 对象的值在创建后不会发生改变.换句话说,我们平常对 String 对象的操作,实际上都是创建了一个新的 String 对象,将该对象的引用赋给我们的对象,而内存之中仍然存有原来的两个字符串.可能有点绕

【37】String,StringBuffer,StringBuilder区别和概念

基本的概念: 查看 API 会发现,String.StringBuffer.StringBuilder 都实现了 CharSequence 接口,内部都是用一个char数组实现,虽然它们都与字符串相关,但是其处理机制不同. String String:是不可改变的量,也就是创建后就不能在修改了String 类是final类,不可以继承.对String类型最好的重用方式是组合 而不是继承. value是一个被final修饰的数组对象,所以只能说他不能再引用到其他对象而不能说明他所引用的对象的内容不

java基础巩固系列(十):String、StringBuffer、StringBuilder的使用与比较

他们之间的主要区别: String是字符串常量,不能够改变 StringBuffer是字符串变量,可以改变,线程安全 StringBuilder是字符串变量,可以改变,线程不安全(JDK1.5以后出现的) 一.为什么说String是字符串常量 public static void main(String[] args) { String s1 = "Hello "; String s2 = "World"; s1 += s2; System.out.println(

6、Object、String、StringBuffer

Java的Api以及Object类 API概念 * A:API(Application Programming Interface) * 应用程序编程接口 * B:Java API * 就是Java提供给我们使用的类,这些类将底层的实现封装了起来, * 我们不需要关心这些类是如何实现的,只需要学习这些类如何使用. * C: 演示查看Object类中的相关方法 Object类概述 * A:Object类概述 * 类层次结构的根类 * 所有类都直接或者间接的继承自该类 * Object中描述的所有方

String和StringBuffer的区别;字符串的一些基本方法

String 和 StringBuffer区别 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间.我们来看一下这张对String操作时内存变化的图: 我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内

String、StringBuffer与StringBuilder之间区别

最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuilder)的原因 String:字符串常