Java中与String有关的且不得不说的事

如果以下有与Java堆栈和JVM常量池有关的可以访问下面的连接

Java当中的堆与栈详细解析

JVM中的常量池解析

前期记得自己学习编程语言的时候,只要能写出代码就可以。编程语言不就是写程序的吗?自己报着这种目的性很强的心态去学习,忽略了其中的精彩部分,学完C++之间学Java感觉Java中的String和C++中的没有什么区别,都是能存储大小随意变化的字符串。

如:String s="12345"; s  = "0";如果是字符串数组的话那就不,感觉很方便很好用。

话不多说了,看一段代码如果能直接看出结果的你可以回头了。

package com.tzx.ne;

public class Text {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String a = "1234561";
		String a1 = new String("1234561");
		String a2 = new String();
		a2 = "1234561";
		System.out.println(a==a1);
		System.out.println(a==a2);
		System.out.println(a1==a2);
		System.out.println("=================");
		String b = "1234561";
		String b1 = "123456";
		String b2 = "1";
		String b4 = "123456" + 1;
		System.out.println(b==b4);
		String b5 = b1 + b2;
		System.out.println(b==b5);
		System.out.println(b4==b5);
		String b6 = "123456" + b2;
		System.out.println(b==b6);
		System.out.println(b4==b6);
		System.out.println(b5==b6);
	}
	/**
	 * false
	 * true
	 * false
	 * =================
	 * true
	 * false
	 * false
	 * false
	 * false
	 * false
	 * */
}

String类的本质是字符数组char[],其次String类是final的,是不可被继承的,String还是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。

第一句String a = "12341561";是在String池当中创建一个"123461"的常量。

第二句String a1 = new String("123461");是首先在栈当中创建一个a1的引用,在堆当中创建一个String对象,其内容是"123461",而a1指向的是堆内存中这个对象的首地址。

在这里添加一点东西:Java当中比较一共有两种方式一种是a==a1,一种是a.equals(a1);前者比较的是地址,后者比较的是内容。

所以a1和a的指向不一样他们的地址也就不一样。

第三句a2 = new String();先是a2指向new的这个对象的堆中的地址空间,然后a2 = "123461";这时因为"132461"在常量池当中已经存在了,所以a2指向的是常量池当中"1234561",这时判断a和a2他们的地址必然是相等的,而a1和a2也必然是不等的。

下面主要说的是Sring的+:

第四句:b4 = "123456" + 1;因为"1234156"和1都是存储在常量池当中的,所以Java首先解析的是"1324561" + 1它的结果是一个字符串常量,在常量池当中找"1234561"如果有那就返回它的引用,如果没有那么就创建后返回该引用。结果是有的所以b==b4.

第六句和第九句分别是b5=b1+b2;b6="123456" + b2;因为String不是基础类型,所以这个时候他们返回的就不是字符串常量了,而是一个对象,对象时存储的堆当中的,所以b5和b6是指向等式后面的返回的堆中对象的地址。

Java中与String有关的且不得不说的事

时间: 2024-10-12 02:18:32

Java中与String有关的且不得不说的事的相关文章

Java中的String为什么是不可变的?

转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象的引用 对于J

再解Java中的String

今天朋友问我String的内容是真的不可变吗?我肯定告诉他是的?因为在我的主观意识里String就是一个不可变的对象.于是他给我发了这段程序: public class StringTest { public static void main(String[] args) throws Exception { String a = "chenssy"; System.out.println("a = " + a); Field a_ = String.class.g

Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的. 不能改变状态的意思是:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 2. 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑.看下面代码: 1 String s =

java中字符串String 转 int(转)

java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue(); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=

java中的String.getBytes()的用法

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不通OS下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如 byte[] b_gbk = "中".getBytes("GBK"); byte[] b_utf8 = "中".getBytes("UTF-8"); by

重温java中的String,StringBuffer,StringBuilder类

任何一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String 类已在上一篇随笔 小瓜牛

java 中的String类型

java 中的String类型   (1)String类型的数据可以表示所有的数据类型. (2)String中的字符串常量与一般的字符串:                String str0 = "hello";//字符串常量“hello”被预先放到了数据段的字符串常量池中                String str1 = "hello";//直接从常量池中寻找已有的字符串常量                String str2 = new String

java 中的String类

String a = "aaa"; 用这种方式的时候java首先在内存中寻找"aaa"字符串,如果有,就把aaa的地址给它 如果没有则创建 String a = new String("aaa"); 是不管内存中有没有"aaa" 都开辟一块新内存保存它 可以用以下方法验证下 String a = "aaa"; String b = "aaa"; String c = new String

Java中的String常量和String.intern的实现

在java中有constantPool常量池,常量池里对类,方法,接口的常量,而对于存放字符串常量通常存放的符号链接Symbol 或者真实的String的对象的引用. 我们来看一段简单的代码和反编译字节码 public class test { public static void main(String[] args) { String test = "test"; } } Constant pool: #1 = Class #2 // test #2 = Utf8 test #3