Java中String对象的传递解析

话不多说了,直接上代码。

public class Demo {

//	static String str = "hello world!";
//	static String str = new String("hello world!");
//	static char[] ch = new char[]{‘A‘,‘B‘,‘C‘};

	public static void test(String str,char[] ch,int a) {
		System.out.println("str=" + str);
		System.out.println("str.hashCode():" + str.hashCode());
		str = "-------";
		System.out.println("str=" + str);
		System.out.println("str.hashCode():" + str.hashCode());
		ch[0] = ‘G‘;
		a = 11;
	}

	public static void main(String[] args) {

		String str = "hello world!";
		String str1 = new String("hello world!");
		char[] ch = new char[]{‘A‘,‘B‘,‘C‘};
		int a = 1;
		System.out.println("str.hashCode():" + str.hashCode());
		System.out.println("str1.hashCode():" + str1.hashCode());

		test(str,ch,a);

		System.out.println("a=" + a);
		System.out.println("str=" + str);
		System.out.println("str.hashCode():" + str.hashCode());
		str = "ooooooo";//改变str的值
		System.out.println("str.hashCode():" + str.hashCode());
		System.out.println("str1.hashCode():" + str1.hashCode());

		for (char e : ch) {
			System.out.print(e);
		}

		/* ①上述str和a变量打印出来的值并没有改变,但str打印出来的内存地址(hashCode)却有变化的;
		 * ②str打印出来的内存地址(hashCode)相同。
		 * 
		 * 推测:
		 * 不同String变量的值只要相同,指向就相同。String对象在常量池中创建(开辟空间)的,调用者访问的是常量池中空间
		 * 如果上面推测成立,那么疑惑就来了。(建议把前面的记住就行了)
		 * String类型变量在方法间传参时,是传递引用(内存地址)还是值传递?。
		 * 
		 * 这里先说明C++的String变量引用传递是传递内存地址的,也就是说访问的是变量的实际内存空间,
		 * 修改变量的值就是修改该内存空间中的值。
		 * 在Java中对象是引用传递的,但如果字符串作为常量使用,显然单纯的引用传递是不合适的。
		 * 这里有两个考虑:1.常量是不能改变值的,2.如果能改变,这就属于共享数据,涉及数据安全问题了。
		 * 所以做法是修改值时,会在常量池先开辟好一个String对象空间,再把引用(内存地址)赋值给String变量,使其指向该空间。
		 * 如果是值传递,当一个字符串有1G大的时候,想想这个字符串传来传去是什么情况?搬着块大石头走来走去舒服吗?嘿嘿,这是笑话
		 * 相同的数据,1G大的空间,不会再开辟一个的。
		 */
	}
}

控制台打印结果:

str.hashCode():-217287203

str1.hashCode():-217287203

str=hello world!

str.hashCode():-217287203

str=-------

str.hashCode():-1680751795

a=1

str=hello world!

str.hashCode():-217287203

str.hashCode():-1282542897

str1.hashCode():-217287203

GBC

时间: 2024-10-01 05:54:36

Java中String对象的传递解析的相关文章

Java中String是不是引用传递?

本文转自:http://www.jcodecraeer.com/a/chengxusheji/java/2012/0805/340.html 编者语:书上都说string是引用类型,但事实上我所看到的string和所谓的值类型没有什么区别,但通过看以下的文章,明白了: 1.string a="abc";之后,如果a="xy",则是a并没有改变内存中已经存在的"abc",而是又创建了另外一个实例.实际上相当于:string a=new String

Java中String对象的不可变性

首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=new String("abc"); String c2=new String("abc"); String c3=c1; System.out.println("c1==c2:"+ (c1==c2)); System.out.println(&quo

java中String对象和String变量

java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看到关于String s = new String("XYZ") + new String("XYZ");到底创建几个对象的讨论,觉得比较有意思,在此总结一下. 在JAVA中除了8种基本类型之外,其他的都是类对象及其引用.所以 "XYZ"在JAVA中是一个String对象,对于String类对象来说它的对象值是不能修改的,也

java中String对象的长度

java中String的长度 使用 Integer.MAX_VALUE Integer.MAX_VALUE = 2147483647 :   String   和   StringBuffer 获得长度的方法: public   int   length() Returns   the   length   of   this   string.   The   length   is   equal   to   the   number   of   16-bit   Unicode   c

Java中String的 "引用" 传递

1.来看一段有趣但又让人困惑的代码片段 public static void main(String[] args){ String x = new String("ab"); change(x); System.out.println(x); } public static void change(String x){ x = "cd"; } 打印结果:"ab" 2.这段代码真正做了什么呢?来解释一下这个过程 首先,当字符串"ab&q

java中String对象的split方法

在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|789"; System.out.println(str1.split("|")[0]); 结果是1 这里要注意的是"|"作为分隔符要写成这样 System.out.println(str1.split("\\|")[0]); 同理如果用&qu

JAVA中String类

1.String类定义的变量是不可变得 eg:String s0="kvill"; String s1 = new String("kvill"); 为什么要设计为不可变: 1.1 字符串常量池的需要 1.2允许String对象缓存HashCode Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中. 字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码. 在String

java中String类为什么不可变?

在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象不可以改变,典型的例子有java中的String类型. 2.相比于可变对象,不可变对象有很多优势: (1)不可变对象可以提高String Pool(字符串常量池)的效率和安全性.如果你知道一个对象是不可变动 ,那么需要拷贝的对象的内容时就不用复制它本身二只是复制它的地址,复制地址(通常一个指针的大小

java中String的不可变性

昨天面试的时候,面试官问我String的不可变性,我回答的有点糟糕,赶紧查资料总结一下以备忘! 一.原理 1.不变模式(不可变对象) 在并行软件开发过程中,同步操作似乎是必不可少的.当多线程对同一个对象进行读写操作时,为了保证对象数据的一致性和正确性,有必要对对象进行同步.而同步操作对系统性能是相当的损耗.为了能尽可能的去除这些同步操作,提高并行程序性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保其在没有同步操作的多线程环境中依然始终保持内部状态的一致性和正确性.这就是不变模式. 不