`
墙头上一根草
  • 浏览: 154645 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java String 参数传递 按值与地址

阅读更多

           今天看erlang,看到一个最基本的问题,就是方法调用或函数调用时,参数传递的方式,大家都知道在Java中,基本类型是通过按值传递的方式,来实现参数传递,而对象类型则是通过按引用地址传递的,但是这个里面有一个Java里面被作为基本类型的对象,就是string,在其他语言中,基本上是没有String基本类型的,比如c++,erlang等,所以Java中,String这个对象比较特殊,他传递参数时候也比较特殊。

        下面一个例子:

       

public class StringTest {

	public static void main(String[] args) {
		String value = "Hello World";
		String newValue = new String("Hello World2");
		System.out.println("change before value is:"+value);
		System.out.println("change before new value is:"+newValue);
		change(value);
		change(newValue);
		System.out.println("====================================");
		System.out.println("change after value is:"+value);
		System.out.println("change after new value is:"+newValue);
	}
	
	
	public static void change(String value){
		value = value+" change";
	}
}

      上面的程序运行结果为:

         change before value is:Hello World

         change before new value is:value

         ====================================

        change after value is:Hello World

        change after new value is:value

 

     从上面的运行结果可以看出来,不管string是直接通过 “=”赋值,或者是通过new的方式赋值,方法调用之后,他的值都没有改变,也就是说,不管这个string是在常量池中或者堆内存中,他的值都不会改变,这样string的参数传递就和其他的基本类型不一样了,虽然Java中string类型是基本类型。

    为什么会有上面的结果呢,网上有人说,string的值是在常量池中,所以不会改变,但是我们用new的方式,他也是没有改变呢。其实解释这个原因很简单,简单到看一下源码就行了。以下是string的源码:

       

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** The count is the number of characters in the String. */
    private final int count;

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    /**
     * Class String is special cased within the Serialization Stream Protocol.
     *
     * A String instance is written initially into an ObjectOutputStream in the
     * following format:
     * <pre>
     *      <code>TC_STRING</code> (utf String)
     * </pre>
     * The String is written by method <code>DataOutput.writeUTF</code>.
     * A new handle is generated to  refer to all future references to the
     * string instance within the stream.
     */
    private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[0];

    /**
     * Initializes a newly created {@code String} object so that it represents
     * an empty character sequence.  Note that use of this constructor is
     * unnecessary since Strings are immutable.
     */
    public String() {
	this.offset = 0;
	this.count = 0;
	this.value = new char[0];
    }

    从源码中可以知道,string的实现是通过char[] 数组的形式,之所以String对象不管怎么整都不会改变是因为,String对象是一个final对象,就是不变的对象,里面的属性也是不变的对象,所以不管你怎么弄他都是不变的,这个就是String基本类型和其他基本类型不一样的地方,所以网上说各种原因的,看一下源码就知道为什么了。

   通过操作符 “+”,来实现string对象的相加,这个就是有点c++重的操作符重载的意思了,编译的时候,String的相加会有优化,这个优化就是如果常量池中有同样的string就会给他赋为这个变量的地址,如果没有就会通过new的方式创建一个char[],还有string中的所有有关两个string的操作比如concat这种方法,都是通过new String的方式返回新的String对象。

分享到:
评论

相关推荐

    Java:按值传递还是按引用传递详细解说

    ### Java中的按值传递与按引用传递详解 #### 一、引言 在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点...

    String作为形式参数传递给方法的情况

    Java 中 String 作为方法参数的传递机制详解 在 Java 语言中,String 类型的变量作为方法参数时,表现出了...同时,在 Java 中,基本类型和对象类型的参数传递机制是不同的,前者是“值传递”,后者是“引用传递”。

    lotus domino java代理_获取传递值json

    我们学习了如何使用 `doc.getItemValueString("Query_String_Decoded")` 方法获取传递值,拆分查询字符串,获取参数值,并输出 JSON 字符串。这些技术可以帮助我们更好地开发 Lotus Domino 服务器端应用程序。

    java值传递与引用传递

    因此,尽管看似是引用传递,但对`String`类型的处理结果与值传递类似。 总结来说,Java中的参数传递主要有以下特点: 1. 基本数据类型按值传递,函数内部无法改变实际参数的值。 2. 引用类型看似按引用传递,实际上...

    JAVA反射参数传递概略

    在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将变量的副本传递给方法,而引用传递则是传递变量指向的对象引用。对于基本类型,Java总是使用值传递;而对于对象,实际上是引用的复制,但仍然保持...

    JNI开发Java调用C传递int、String、Array类型参数

    JNI开发Java调用C传递int、String、Array类型参数; 详情参考: int类型: (https://blog.csdn.net/niuba123456/article/details/80959892) String类型(https://blog.csdn.net/niuba123456/article/details/80977247);...

    java方法的参数传递其二.docx

    Java 方法参数传递之引用类型 Java 方法参数传递是 Java 编程语言中的一种基本机制,在方法调用时将参数传递给方法体内的变量,但是在传递过程中,参数的类型会对传递结果产生影响。在本文中,我们将讨论 Java 方法...

    java参数的传递与返回值

    ### Java参数的传递与返回值 #### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用...

    浅议JAVA语言中的参数传递.pdf

    一些书中认为,在 Java 中参数传递都是按值传递的,但是这种说法存在一定的模糊性。本文将对 Java 语言中的参数传递进行详尽的说明。 参数传递是指在方法调用时,传递参数的方式。在 Java 中,参数传递可以分为按值...

    Java语言中参数值传递和引用传递比较.pdf

    Java 语言中参数值传递和引用传递是两种不同的参数传递方式,它们在 Java 编程中扮演着重要的角色。参数值传递是指将实际参数的值复制给形式参数,形式参数的变化不影响实际参数的值。引用传递是指将实际参数的引用...

    java 参数传递

    Java 中的参数传递机制,可以简单地总结为:基本类型作为参数传递时,是传递值的拷贝;对象作为参数传递时,是传递对象的引用。如果你在方法内改变了对象的值,那么原对象也跟着改变,但是如果你重新分配了对象的...

    Java是值传递,传对象引用也是通过值

    标题“Java是值传递,传对象引用也是通过值”揭示了Java中参数传递的核心概念。Java总是以值传递方式进行,这意味着当你将一个变量作为参数传递给方法时,传递的是该变量所存储值的一个副本。然而,对于对象类型的...

    详解java的值传递、地址传递、引用传递

    java是一种面向对象的编程语言,它的参数传递机制是值传递的,而不是地址传递或引用传递。很多开发者对java的值传递和地址传递存在误解,认为java中的基本数据类型是值传递,而对象是地址传递或引用传递。事实上,...

    JAVA参数传递方式实例浅析【按值传递与引用传递区别】

    JAVA 参数传递方式实例浅析【按值传递与引用传递区别】 JAVA 参数传递方式实例浅析【按值传递与引用传递区别】是 JAVA 编程语言中的一种基本概念,对于 JAVA 开发者来说是非常重要的。本文将通过实例形式分析 JAVA ...

    浅析Java引用类型和方法参数传递

    Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理...

    java参数传递 java 参数.doc

    Java 参数传递机制是编程中的重要概念,尤其是在Java中,它涉及到“值传递”和“引用传递”的理解。这里我们将深入探讨这两个概念,并结合给定的示例代码进行解析。 首先,我们看“值传递”。在Java中,基本类型...

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...

Global site tag (gtag.js) - Google Analytics