JAVA中String、StringBuffer和StringBuilder的形式参数问题

由于StringBuffer和StringBuilder只有安全性不同,因此本文中用StringBuilder代表StringBuffer和StringBuilder。

形式参数分为两种:1、基本数据类型   2、引用数据类型

1、方法调用时,实际参数将它的值传递给对应的形式参数,方法接收到的是原始值的副本,此时内存中存在两个相等的基本类型,若方法中对形参执行处理操作,并不会影响实际参数的值。

2、方法调用时,实际参数(指向的是地址而不是值)传递的是它的地址的值,方法接收到的是地址的值。因此当调用方法时,形式参数和实际参数指向的是同一个地址,因此改变形参的值,实际参数的值也会改变。

本文从两个方面入手:1、String作为参数 2、StringBuilder作形式参数

1、String作为参数

public static void main(String[] args) {
        String s1="hello";
		String s2="world";
		System.out.println(s1+" "+s2);
		Change(s1,s2);
		System.out.println(s1+" "+s2);
}

 public static void Change(String s1, String s2) {
		// TODO Auto-generated method stub
		s1=s2;
		s2=s1+s2;
	}

输出结果:

hello world

hello world

String为特殊的形式参数。String的值为常量,存放在常量池中,并且其值不会被改变,当change方法中引用形参时,会在常量池中产生新的值(形参s2指向的地址发生改变),而main方法中的s1和s2指向的地址的值不变,因此调用change方法不改变s1和s2的值。

String作形式参数时,效果与基本数据类型一样。

2、StringBuilder作形式参数时

    public static void main(String[] args) {
		StringBuilder S1=new StringBuilder("hello");
		StringBuilder S2=new StringBuilder("world");
		System.out.println(S1+" "+S2);
		Change2(S1,S2);
		System.out.println(S1+" "+S2);
	}

    public static void Change2(StringBuilder s1, StringBuilder s2) {
		// TODO Auto-generated method stub
		s1=s2;
		s2.append(s1);
	}

输出结果:

hello world

hello worldworld

S1和S2将地址传给形参s1和s2,调用Change2方法时,s1=s2,将s2的地址赋给s1,实际参数S1指向的地址的值没有改变。调用s2.append方法时改变了s2所指向地址对象的值,因此实际参数S2发生改变。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StringStringBufferStringBuilder都是Java用于处理字符串的类。 String是一个不可变的字符串类,也就是说一旦创建了一个String对象,它的值就不能被修改。每次对String进行修改操作时,都会创建一个新的String对象,这样会浪费内存空间和时间。因此,当需要频繁地对字符串进行修改时,使用String并不高效。 StringBufferStringBuilder是可变的字符串类,它们可以被用来进行字符串的修改操作。StringBufferStringBuilder的主要区别在于StringBuffer是线程安全的,而StringBuilder是非线程安全的。这意味着在多线程环境下,如果有多个线程同时访问一个StringBuffer对象,它们是安全的;而多个线程同时访问一个StringBuilder对象时,可能会导致数据错乱。 使用StringBufferStringBuilder的场景通常是在需要频繁地对字符串进行修改的情况下。例如,在循环拼接字符串、在递归函数修改字符串等情况下,使用StringBufferStringBuilder可以提高性能。 如果需要将StringBufferStringBuilder转换为String对象,可以使用两种方式。一种是调用它们的toString()方法,将其转换为String对象。另一种是使用String的构造器String(StringBuffer buffer)来创建一个新的String对象,将StringBufferStringBuilder的内容复制到新的String对象。 总结起来,String是不可变的字符串类,而StringBufferStringBuilder是可变的字符串类,适用于需要频繁修改字符串的场景。转换为String对象可以通过调用toString()方法或使用String的构造器来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值