string-关于java中String类型参数传递的问题,谁能给我讲清楚

问题描述

关于java中String类型参数传递的问题,谁能给我讲清楚

我知道java里面参数传递是值传递,这点不用给我解释了。但是:
import java.util.*;

public class Test {
public static void change(String s){
s="2";
}
public static void main(String[] args) throws Exception{
String s="1";
change(s);
System.out.println(s);
s="2";
System.out.println(s);
}
}
为什么两次s的值不一样。
希望能从底层原理方面讲的我心服口服,不要讲一些模棱两可的空概念。
你说String是final的,那么为什么在main里面就可以改变。

解决方案

change函数的形参是String 类型,所以是引用地址传值

String s="1";
change(s);

上面首先定义String 变量s="1",然后调用函数方法change,传入实参 s,这里实际传入的仅仅是引用地址 ,也就是"1"的引用地址 ,而不是s本身

,change函数里面s="2" 这句代码中的s是局部变量,并不是外面定义的s,它的引用地址又指向了 "2", 然而外部s变量依旧指向 "1",所以打印依然为1

解决方案二:

http://freej.blog.51cto.com/235241/168676/......
答案就在这里:Java-String类型的参数传递问题

解决方案三:

你第一次输出为1 因为你虽然调用了change()方法 但是你只是调用方法 如果要修改你的S的值 需要有返回 第二次是你将2赋予给了S 所有第二次输出是2 不知道我是否说清楚了 但是意思就是说你调用了change()方法后并没有修改你的S的值

解决方案四:

就是值传递的理解。调用change(s),将S的引用拷贝一份传入方法中,可以理解为第二个引用和原来的S都指向"1"。change方法内部给传入
的第二个引用赋值为“2”,对原有的变量S以及指向的“1”没有任何影响。
String s="1"; ----一个引用S,一个字符串“1”
change(s); ------拷贝S传入方法内部
public static void change(String s){
s="2"; ------------将拷贝的参数S赋值为“2”,不影响原引用。
}

解决方案五:

  main函数中的String s="1";执行完后,在jvm的方法区的常量池中会有一个常量1,同时main函数的java栈中会有一个变量s,指向这个1。如图:

  当执行change(s)时,只是将main函数中的变量s的值“1”传递给了change函数里的局部变量s。这里容易引起混淆的是,main函数里的s和change函数里的s并不是一个变量,只是两者恰巧名字相同而已,change函数也可以写成这样:change(String str){ str = "2"},折不会影响change函数的功能。因此当执行change(s)是,jvm的情况如下图所示:

  由上图可知,当执行change(s)时,修改的是change函数栈中的变量s,和main函数栈中的变量s无关,因此main函数中输出变量s的值当然还是1了。

  至于你说的String是final类型的,是不可变的,为什么重新赋值还是会成功呢,原因是这样的。这里的不可变说的是指不可变,但不是指引用不可变。我们知道s="1"是指变量s指向值“1”所在的地址,因为String是final类型的,所以当执行s="2"时,变量会指向常量池中值为2的常量所在的地址,此时s所指向的地址变了。如下图所示:

  而如果与String相对的StringBuffer则不同,它不是final类型的,是可变的,所以假设原来有StringBuffer类型的变量sb指向一个值为1的对象所在的地址,而当执行sb="2"时,它只是将原来指向的值为1的对象的值修改成2,sb指向的地址不会变。如下图所示:

StringBuffer sb = "1"

sb="s"

解决方案六:

如果你是要调用了change()方法后获得 s="2" 那么 你的change()方法需要又返回值。

解决方案七:

你没有改变引用的那个s,而是让s指向了新的string对象。
引用可以改,引用指向的对象不能改。

你在函数中改变指向没用,因为引用的改变不会影响实参

时间: 2024-12-31 12:48:50

string-关于java中String类型参数传递的问题,谁能给我讲清楚的相关文章

string-关于java中String类型汉字字符串的升序问题

问题描述 关于java中String类型汉字字符串的升序问题 本人新手,遇到一个项目问题:有若干个对象,每个对象里面都有一个String类型的姓名属性,现在要求根据姓名属性的升序将这些对象排列在List集合里,问如何将String类型的汉字升序排列.求大神 解决方案 String[] strs = {""张三(Z)""李四(L)""王五(W)""}; // 定义一个中文排序器 Comparator c = Collator.g

Java中String类型能转成int类型吗

问题描述 Java中String类型能转成int类型吗 一个String字符串 能否像 char类型一样 转换成int值 如果可以Java中怎么写 解决方案 看你用什么预言,各种预言都有转换函数,只要符合数值型,就可以正常转换 解决方案二: double?d?=?1.233; String?s1?=?String.valueOf(d); String?s2?=?s1.substring(0,?s1.indexOf("."))?+?s1.substring(s1.indexOf(&quo

java中string 类型的对象间比较的学习笔记

在JAVA 中String 有两种不同的赋值方式 ,"="和new一个新的对象,虽然在输出时显示的内容是一样的,但数据存储的原理是不同的. String a="ab"; String b="ab"; System.out.println(a==b);//true 三句话的执行时这样的:        当把"ab"赋值给a变量时,因为是用"="直接赋值,此时"ab"作为字面量存在栈中,然后

字符串-java中String究竟是传递的值,还是引用

问题描述 java中String究竟是传递的值,还是引用 很多人说,java中的String虽然是对象,但是具有值类型的特征.他是值传递,传递的值. 我认为这这种说法完全是错误的. String和普通对象毫无区别,和其他对象一样,传递的是引用,而不是值. 一段String的运用代码: String a = "123"; public void change(String a){ a = "234"; } 很多人会说,a的值没有变,是因为String是值传递,问题是,

java中string可以作用于switch吗?

问题描述 java中string可以作用于switch吗? switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 很多回答都是不能,但是关于string的问题,为什么可以呢? String s="1"; switch(s){ case "1": } 这要是没问题的呢?为什么呢 解决方案 这是编译器规定的.因为switch的判断的代码是编译器硬编码实现的,因此编译器对于内置类型,理论上想实现,都可以实现. 解决方案二: jdk1.7中

java中string类转成timestamp类

问题描述 java中string类转成timestamp类 java中string类转化成timestamp时,调用了timestamp的valueof()方法,但是转换后是还有小数点的,想去掉小数点,但还是timestamp类型,该如何做呢?说明下,string是存放类似日期格式的字符串.谢谢各位大神的指导,在下感激不尽. 解决方案 timestamp本身就是带毫秒的.如果要输出用,还是的格式化成string输出.如果数据库要存储用,可以转成date后,用date.gettime()获取lon

java中String的没有结束符吗?

问题描述 java中String的没有结束符吗? 为什么含有#的字符串使用toString()方法转化为String类型时就自动丢失了#及其后面的部分? 解决方案 最好把你的代码贴出来,看不明白你的意思.类似下面这样不可能会有问题的. String a = new String("dadfas#sdfdaa"); System.out.println(a.toString()); 解决方案二: http://ideone.com/O7w2q3 /* package whatever;

从内存方面解释Java中String与StringBuilder的性能差异_java

以前经常在网上看到关于Java字符串拼接等方面的讨论.看到有些Java开发人员在给新手程序员的建议中类似如下写道: 不要使用+号拼接字符串,要使用StringBuffer或StringBuilder的append()方法来拼接字符串. 不过,用+号拼接字符串就真的那么令人讨厌,难道使用+号拼接字符串就没有一点可取之处吗? 通过查阅Java API文档中关于String类的部分内容,我们可以看到如下片段: "Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串

区分java中String+String和String+char_java

我们来考虑一个关于java中String的问题: "abc" + '/'和 "abc" + "/"的区别. 通过这个例子, 我们可以顺便练习一下JDK工具中javap的用法, 原问题是这样的: 把斜杠/当作字符或字符串有什么区别呢? 一个是当作基本数据类型char,一个是对象String.具体有什么区别呢? 当作字符效率会更高吗?String str = "abc" + '/';和String str = "abc&