`
墙头上一根草
  • 浏览: 149234 次
  • 性别: 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对象。

分享到:
评论

相关推荐

    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参数传递的经典示例

    Java参数传递的经典教学PPT,引用类型,基础类型传递的区别,String和StringBuffer类型传递的区别。

    为什么Java只有值传递

    引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 值传递和引用传递的区别: 值传递会创建副本,引用传递不创建副本 值传递的函数中无法改变原始...

    url传递的参数值中包含&时,url自动截断问题的解决方法

    在做一个公告浏览功能时,只要通过url传递的某参数值中包含 & 或 ,就会出现问题–该变量的值无法显示。 问题定位结果: 遇到&时,该参数的值会自动截断,导致参数值传递有误。 二、问题的解决 java代码中做如下...

    Java中的值传递和引用传递

    当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。  值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值  引用传递的特点:方法内部对传...

    java参数传递

    试根据html文件中提供的参数,编写一个计算矩形面积和周长的Java Applet程序,并把计算结果显示在APPLET窗口中。

    简单谈谈Java中String类型的参数传递问题

    主要介绍了简单谈谈Java中String类型的参数传递问题的相关资料,需要的朋友可以参考下

    Java怎么在函数内改变传入的值

     函数调用时,参数传递的方式主要有两种: 值传递和引用传递。  Java使用的是值传递。值传递是把变量的值、常数或常量传递给参数。而引用传递,是把变量的所在内存中的地址传递给参数,参数通过地址找

    java 返回多个值的问题

    由于某些项目需要知道一个函数处理中需要返回函数的处理状态,同时 ...原因就是java 使用的是对象传递. 那么怎么解决返回多个参数值呢? 解决方式就是用HashMap来保存返回的结果.这样就可以解决多个返回值的问题

    Java程序设计基础:方法的值传递.pptx

    按值传递 【示例】写出程序运行结果。 方法的值传递 【示例】写出程序运行结果。 方法的值传递 运行结果: 调用swap方法之前,num1=1,num2=2 交换两变量之前,n1=1,n2=2 交换两变量之后,n1=2,n2=1 调用swap方法之后...

    Java当中的String数据类型

    虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理–视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改,而是产生一个副本对其进行操作...

    java的传值与传引用详解

     大家可以明显的看到,按指针传递参数可以方便的修改通过参数传递进来的值,而按值传递就不行。  当 Java 成长起来的时候,许多的 C 程序员开始转向学习 Java,他们发现,使用类似 SwapValue 的方法仍然不能改变...

    Java开发技术大全(500个源代码).

    invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法...

    在axis1.4中传递复杂类型数组参数(ArrayMapping)

    NULL 博文链接:https://conkeyn.iteye.com/blog/1010959

    JAVA面试基础知识题

    25、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递...

    jquery ajax 向后台传递数组参数示例

    需求: 在JS中向后台传递数组参数 分析: JS中的数组是弱类型的可以放任何类型(对象、基本类型),但是如果数组中放的是对象类型,传递到后台是显示的只能是对象字符串–[object Object],原因如下: 在后台接收的...

    C#调用JavaWebService

    然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string类型能正常传递参数外,q其他类型的参数不是默认值就是...

    java发送邮件封装,链式传递参数

    ServiceResponse&lt;String&gt; serviceResponse = SendMailSynUtils.sendEmail(param); System.out.println("errorNO = "+ serviceResponse.getErrorNO()); System.out.println("errorMsg = "+ serviceResponse....

    JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

    一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList&lt;string&gt;,ArrayList嵌套ArrayList&lt;ArrayList&lt;String&gt;&gt;等。

    JNI技术手册 c/c++调用java

    2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...

Global site tag (gtag.js) - Google Analytics