请问java怎么实现String的引用传递

Kano1990 2017-06-04 03:48:46
请先别管我的说法准不准确,总之就是这个意思——在函数内修改String参数,让函数外的String值也跟着改变,该怎么实现?
网上有大堆的帖子解释java String传递外部值不变的原因,却没一个给出解决办法的,简直让人火大。
麻烦大佬解答下,谢谢了!
...全文
2462 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzx会游泳的鱼 2018-12-27
  • 打赏
  • 举报
回复
	public static void main(String[] args) throws Exception {
String str = "abc";
System.out.println(str); // abc
str = test2(str);
System.out.println(str); // cba
}
private static String test2(String str) {
return "cba";
}


兄弟,,你是不是表达这样的意思
咸鱼混子 2018-12-26
  • 打赏
  • 举报
回复
String是不可变的,String的底层是一个char类型的数组,只要想办法把他这个数组改变就可以,毕竟String是引用类型,虽然String不可变,但是里面的属性是可以改变的。
飞!!!! 2018-12-20
  • 打赏
  • 举报
回复
将改变的字符串return返回,然后用旧的接收。
济南大飞哥 2018-12-20
  • 打赏
  • 举报
回复
只能用包装类。。。。
a350062174 2017-06-12
  • 打赏
  • 举报
回复
引用 16 楼 poorguy007 的回复:
[quote=引用 7 楼 a350062174 的回复:] Stirng 是不可变对象. 只能通过反射修改.

   public static void main(String[] args)  throws  Exception{
        String s = "abc";
        changeString(s);
        System.out.println(s); //
    }
    
    public static void changeString(String s) throws  Exception{
        String re = s;
        s = "12345"; //将s改成新的字符串
        Field valueFieldOfString = String.class.getDeclaredField("value");
        valueFieldOfString.setAccessible(true);
        valueFieldOfString.set(re,s.toCharArray());
    }
最后打印 12345. 用的jdk 8. 看下是不是你要的结果.
经手工测试,修改前后字符串变量的hashcode相同,可认为还是同一个对象;不过修改字符串的长度上有问题。 新赋值长度大于等于原字符串,可以正常输出,最多修改原长度部分,上述代码中输出的是“123”; 如果新赋值长度小于原字符串,报错 java.lang.ArrayIndexOutOfBoundsException。而且问题出在函数执行之后,打印时报错。 猜想内存结构被破坏,字符串结束符的位置有问题。 具体请大神解释。[/quote] 之前亲测过,没有你说的问题. 不知 你使用的什么环境
我在地球 2017-06-11
  • 打赏
  • 举报
回复
可不可以以使用静态全局变量 public static String a;来实现?
poorguy007 2017-06-10
  • 打赏
  • 举报
回复
引用 7 楼 a350062174 的回复:
Stirng 是不可变对象. 只能通过反射修改.

   public static void main(String[] args)  throws  Exception{
        String s = "abc";
        changeString(s);
        System.out.println(s); //
    }
    
    public static void changeString(String s) throws  Exception{
        String re = s;
        s = "12345"; //将s改成新的字符串
        Field valueFieldOfString = String.class.getDeclaredField("value");
        valueFieldOfString.setAccessible(true);
        valueFieldOfString.set(re,s.toCharArray());
    }
最后打印 12345. 用的jdk 8. 看下是不是你要的结果.
经手工测试,修改前后字符串变量的hashcode相同,可认为还是同一个对象;不过修改字符串的长度上有问题。 新赋值长度大于等于原字符串,可以正常输出,最多修改原长度部分,上述代码中输出的是“123”; 如果新赋值长度小于原字符串,报错 java.lang.ArrayIndexOutOfBoundsException。而且问题出在函数执行之后,打印时报错。 猜想内存结构被破坏,字符串结束符的位置有问题。 具体请大神解释。
程序员开心鸭 2017-06-09
  • 打赏
  • 举报
回复
提供get,set,方法,用反射更改?
henuni 2017-06-08
  • 打赏
  • 举报
回复
java都是值传递,string对象,实际是传递对象本身。 值传递才是面向对象
HinanaiTenshi 2017-06-06
  • 打赏
  • 举报
回复
啊,上面没注意,那个不是用数组当指针,用反射是把简单问题复杂化了。 这里就简单举例吧,数组包装:

public class Test {

    public static void main(String... args){
        //test array
        String[] testStr1 = {"old string-1"};
        refStringTestArray(testStr1);
        System.out.println(testStr1[0]);

        //test bean
        RefString ref = new RefString();
        ref.setTemp("old string-2");
        refStringTestBean(ref);
        System.out.println(ref.getTemp());
    }

    public static void refStringTestArray(String[] array){
        array[0] = "new string by array!";
    }

    public static void refStringTestBean(RefString ref){
        ref.setTemp("new string by ref-bean!");
    }

}
class RefString{
    String temp;

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }
}
HinanaiTenshi 2017-06-06
  • 打赏
  • 举报
回复
引用 7 楼 a350062174 的回复:
Stirng 是不可变对象. 只能通过反射修改.

   public static void main(String[] args)  throws  Exception{
        String s = "abc";
        changeString(s);
        System.out.println(s); //
    }
    
    public static void changeString(String s) throws  Exception{
        String re = s;
        s = "12345"; //将s改成新的字符串
        Field valueFieldOfString = String.class.getDeclaredField("value");
        valueFieldOfString.setAccessible(true);
        valueFieldOfString.set(re,s.toCharArray());
    }
最后打印 12345. 用的jdk 8. 看下是不是你要的结果.
这是最可靠的做法,上面其他说不能改的都属于读书读死了,可以放弃治疗了。 当然,java除开这种数组当指针用的手段之外,还有最正统最优(ma)雅(fan)的实现,那就是封装:定义一个bean,它有一个类型为String的属性,把这个bean的实例当做参数传递进去,然后对bean做get和set。
dameo 2017-06-06
  • 打赏
  • 举报
回复
不就是定义一个全局变量???再在函数内给这个函数赋值?你
MikeDDT009 2017-06-05
  • 打赏
  • 举报
回复
String赋值以后,值是固定的,死的,不可更改的。如果改变了,那么其本质就是换了个新的字符串让你原来的引用去参考。如果是想玩函数改变当前引用指向的字符串,那么这个函数(方法)需要传入一个字符串(当前的或者说要改变的),然后返回一个新的String。而函数的具体内容就是针对传入字符串的操作,操作完了返回新的字符串。比如这样: 我对传入的字符串进行只要第一个和第二个字符组成的字符串,也就是裁剪:
mmqw 2017-06-05
  • 打赏
  • 举报
回复
String作为一个对象的属性,传递的参数是这个对象,修改对象的String 函数外获取对象的String的也会变 不过最好别这么做,容易出问题
galiniur0u 2017-06-05
  • 打赏
  • 举报
回复

	public static void main(String[] args){
		String[] b = new String[]{"adfsdf", "werwere"};
		change(b);
		System.out.println(b[0]);
	}
	
	public static void change(String[] b){
		b[0]="23423434";
	}
楼主想法好奇特,在Java中貌似一般都不希望这么做,因为会弄混。
a350062174 2017-06-05
  • 打赏
  • 举报
回复
Stirng 是不可变对象. 只能通过反射修改.

   public static void main(String[] args)  throws  Exception{
        String s = "abc";
        changeString(s);
        System.out.println(s); //
    }
    
    public static void changeString(String s) throws  Exception{
        String re = s;
        s = "12345"; //将s改成新的字符串
        Field valueFieldOfString = String.class.getDeclaredField("value");
        valueFieldOfString.setAccessible(true);
        valueFieldOfString.set(re,s.toCharArray());
    }
最后打印 12345. 用的jdk 8. 看下是不是你要的结果.
nikyotensai 2017-06-05
  • 打赏
  • 举报
回复
String a=""; public void set(){ a="aa"; }
leavesxy 2017-06-05
  • 打赏
  • 举报
回复
String是一个不可变的对象,所以不能以传值的方式来修改对象。 只能通过重新赋值对象
soton_dolphin 2017-06-05
  • 打赏
  • 举报
回复
用StringBuilder 喽
qq_39034097 2017-06-04
  • 打赏
  • 举报
回复
return一个新生成字符串,然后用旧的字符串接收,可以不? string str; str = function(str); public static string function (string str){}
加载更多回复(2)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧