`

String型变量的定义与引用

阅读更多
String型变量的定义与引用

大家都在讲, 在Java中,变量是按引用传递,除了基本数据类型和String。基本数据类型没有什么可讲的,那么String到底有什么特殊的地方。

提到String,就得提StringBuffer,下面通过几个例子来说明他们的区别。

public class Test {
    public static void main(String[] args) {
     String A="aaa";
     String B="bbb";
    
     System.out.println(A.equals(B));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
     B=A;
     System.out.println(A.toString().equals(B.toString()));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
    }
}

输出结果为:

false
false
96321
97314
true
true
96321
96321
大家都应该能预测到这个结果,因为我们把A赋值给了B。

让我们稍微改动一下,用B="aaa"代替B=A。

public class Test {
    public static void main(String[] args) {
     String A="aaa";
     String B="bbb";
    
     System.out.println(A.equals(B));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
     B="aaa";
     System.out.println(A.toString().equals(B.toString()));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
    }
}

再来看输出结果,

false
false
96321
97314
true
true
96321
96321

有些想不到吧,和B=A是一样的。再做一下改动,把B="aaa"改成B="aa“+”a",

public class Test {
    public static void main(String[] args) {
     String A="aaa";
     String B="bbb";
    
     System.out.println(A.equals(B));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
     B="aa"+"a";
     System.out.println(A.toString().equals(B.toString()));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
    }
}

结果仍然是,

false
false
96321
97314
true
true
96321
96321

看到了吧,这就是String和其他对象类型不一样的地方。不管你怎么定义或赋值,只要字符串变量的内容是相同的,他们指向的就是同一个字符串对象。
比如上面的例子,不管B的值是从A赋过来的,还是自己定义的,只要他的值是‘aaa’,他和A指向的就是同一个对象。
这样做的好处嘛,我只想到一点儿,节省资源。比如你有10个变量的值都是'aaa',那么这10个变量指向的是同一个对象,而不是10个对象。

再来看看StringBuffer,差不多的一个例子,

public class Test {
    public static void main(String[] args) {
     StringBuffer A=new StringBuffer("aaa");
     StringBuffer B=new StringBuffer("bbb");
    
     System.out.println(A.equals(B));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
     B=A;
     System.out.println(A.toString().equals(B.toString()));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
    }
}


输出结果,

false
false
3526198
7699183
true
true
3526198
3526198


稍微改动一下,B=A替换为B=new StringBuffer("aaa"),

public class Test {
    public static void main(String[] args) {
        //(Man.getMan()).printName();
        //System.out.println((Man.getMan()));
     StringBuffer A=new StringBuffer("aaa");
     StringBuffer B=new StringBuffer("bbb");
    
     System.out.println(A.equals(B));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
     B=new StringBuffer("aaa");
     System.out.println(A.toString().equals(B.toString()));
     System.out.println(A==B);
     System.out.println(A.hashCode());
     System.out.println(B.hashCode());
    }
}

输出结果为,

false
false
3526198
7699183
true
false
3526198
14285251

怎么样,看到StringBuffer和String是不一样的啦吧,虽然A和B的值相同,但是指向的是不同的对象。StringBuffer和其他对象类型一样,是按引用传递的。


String和StringBuffer的其他区别:
1. StirngBuffer是可以变话的,如果改变了StringBuffer变量的长度或内容,不会改变对这个对象的引用。
2. String是固定的,如果改变了String变量的长度或内容,就会新建一个String对象,原来的String变量会指向新的String对象。

原网址:http://blog.csdn.net/mayabin/archive/2008/10/10/3051537.aspx
分享到:
评论

相关推荐

    String型的不可变性

    在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称...

    C#_String与string的区别

    引用与值传递 在C#中,`string`类型(实际上是`System.String`)是通过引用传递的。这意味着当你将一个`string`变量赋值给另一个变量时,实际上只是传递了引用,而非数据副本。例如: ```csharp string a = ...

    String和string区别以及string详解.doc

    - `string`是一个保留关键字,用于定义字符串类型的变量,而`String`是一个类,提供了丰富的字符串操作方法和属性。 - 在C#编码规范中,推荐使用小写的`string`,因为它更符合语言的使用习惯。但在性能敏感的场景下...

    C语言变量名命名规则

    3. **变量定义位置**: - 尽量将变量的定义放在函数的开始位置,这有助于快速了解函数使用了哪些变量。 #### 二、命名规则 变量命名规则在编程中非常重要,它能够提高代码的可读性和可维护性。以下是C语言中推荐...

    值引用与对象引用

    ### 值引用与对象引用 #### 一、引言 在编程中,变量的引用方式分为两大类:值引用(Value Reference)和对象引用(Object Reference)。这两种引用方式决定了程序如何处理数据以及数据的存储方式。理解这些概念...

    basic_string源码

    basic_string::Rep的结构包含三个成员变量:len、res和ref,分别表示字符串的长度、容量和引用计数。 basic_string的源码提供了一个非常重要的字符串处理机制,基于引用计数的思想,它提供了高效的字符串处理功能。...

    JAVA定义变量与输出详解

    JAVA定义变量与输出详解 JAVA语言中定义变量和输出是非常重要的基础知识,理解这些知识点对于JAVA初学者和开发者来说都是非常必要的。本文将详细介绍JAVA定义变量和输出的相关知识点。 一、变量的定义和命名 在...

    java变量的生命周期与作用域

    方法作用域是指变量定义在方法内部的作用域,块作用域是指变量定义在块内部的作用域,类作用域是指变量定义在类内部的作用域,而实例作用域是指变量定义在实例内部的作用域。 在 Java 中,变量的生命周期和作用域是...

    java成员变量覆盖问题

    当我们创建`Test2`对象并调用`getMes()`方法时,`this.color`实际上引用的是`Test1`类中的`color`变量,而不是`Test2`类中的`color`。因此,输出的结果是父类的`color`值,即“黄色”。 #### 使用`final`关键字验证...

    String a="hello" String b="hello" a==b 返回true的问题分析

    //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...

    java flex 对象定义

    ### Java Flex 对象定义与数据类型定义 在Java编程语言中,对象是程序的基本单元,而数据类型则是定义这些对象属性的关键元素。本篇将深入探讨Java中的对象定义及其相关的数据类型定义,帮助读者更好地理解Java的...

    java变量讲解

    需要注意的是,如果要在类的方法外部使用某个变量,则该变量需要定义为类的成员变量。 #### 四、变量的分类 根据数据类型的不同,Java中的变量可以分为两大类:基本数据类型和引用数据类型。 ##### 4.1 基本数据...

    Java中的常量和变量概念及定义.docx

    - **取值**:变量可以被程序中的其他部分引用和读取。 ##### 3. 变量的注意事项 - **作用域**:变量的作用域决定了变量可以在哪些部分被访问。一般来说,变量只在其定义的作用域内有效。 - **重名**:在同一作用域...

    WPF绑定静态变量的示例代码

    1. **定义静态变量**:在你的类中定义一个静态变量,例如: ```csharp public static class StaticDataSource { public static string MyStaticValue { get; set; } = "默认值"; } ``` 2. **创建UI元素**:在...

    Java中的成员变量

    成员变量,也称为类变量或实例变量,是定义在类中的变量,但不在任何方法、构造器或代码块内部。这些变量与类的对象紧密相关,用来描述对象的状态或功能。 成员变量有两种主要类型:实例变量和静态变量。 1. 实例...

    Delphi中String与WideString的区别2.docx

    Delphi 中 String 与 WideString 的区别 Delphi 中的字符串类型主要有三种:ShortString、AnsiString 和 WideString。其中,AnsiString 是 Delphi 中最常用的字符串类型,它具有动态分配字符串空间和自动回收的功能...

    C++函数声明和定义

    而变量定义除了提供名称和类型信息外,还会分配内存空间,如`int x = 5;`。`extern`关键字可以用来明确表示一个变量的声明,而不是定义,特别是在需要跨文件共享变量的情况下。 例如,如果你在一个头文件中声明了一...

    微信小程序关于变量对象data 和 前端wxml取后台js变量值

    对象data定义的变量支持各种数据类型,string,int,[],{} **第一.**wxml数据渲染,只要通过设置data值(this.setData({...}))即可 如: wxml页面:detail对象中包含有TaskBillCode与BillDate两个属性 (此图片来源于...

Global site tag (gtag.js) - Google Analytics