`

Java中的String类

阅读更多
1. 正像很多人所说的那样,equals 和 == 是完全两个不同的概念,将两者进行比较是有点滑稽的,不过对于Java的String类型来说,又使得两者之间建立了一点点联系。 要弄明白不同的String类型变量使用 “==” 操作符的结果何时为TRUE,何时为FALSE,只要将以下几点弄明白就好:
1. == 比较的是地址的引用
2. Java中的String池概念

做了个例子,如下:


/**
 * String
 * 	equals()	比较的是内容
 * 	==			比较的是引用
 * 需要注意的是java的String池。
 * 而且当一个String是由"常量的String"形成的,(如String s4 = "Mon" + "day"; s4会引用内存池中的"Monday"(如果存在的话))
 * 该String会引用内存中的String(如果存在的话).
 * @author yuahan
 * 
 */
public class _String {
	public static void main(String[] args) {
		String s1 = "Monday";
		String s2 = "Monday";
		
		System.out.println(s1 == s2);
		
		
		String s3 = new String("Monday");
		System.out.println(s1 == s3);
		
		
		s3 = s3.intern();//当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 
		System.out.println(s1 == s3);
		
		
		String s4 = "Mon" + "day";//对于String的常量表达式,java 会判断在内存中生成了Mon 和 day 两个常量之后,合成s4时会检查是否已经存在
		System.out.println(s1 == s4);
		
		String s5 = "Monday6";
		String s6 = s1 + 6;
		final String s7 = "Monday";
		System.out.println(s5 == (s7 + 6));//true
		System.out.println(s1 == "Monday");
		System.out.println(s5 == ("Monday" + 6));//两个都是常量,故在编译时便能确定,导致引用相同
		
		System.out.println(s5 == s6);//false
		System.out.println(s5 == (s1 + 6));//false
		System.out.println(s5 == ("Monday" + s1.length()));//后者是变量,只有在执行时才能确定,引用不同
		System.out.println(s6 == ("Monday" + s1.length()));
		
		
		
		String animal1 = "animal1";
		String animal2 = "animal" + "1".length();
		System.out.println("equals? " + animal1 == animal2);// result is "false", not "equals? false".
		System.out.println("equals? " + (animal1 == animal2));// result is "equals? false".
		
	}
}




2. 栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.
String str = "abc";和String str = new String("abc");和char[] c = {'a','b','c'};String str=new String(c);都采用堆存储
String str = "abc";在栈中如果没有存放值为"abc"的地址,等同于:
String temp=new String("abc");
String str=temp;
关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为str的对String类的对象引用变量:String str;
(2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
(3)将str指向对象o的地址。
使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
char[] c = {'a','b','c'};String str=new String(c);等同于:
String str = new String('a'+'b'+'c');
本概念转自: http://primer-2004.iteye.com/blog/125434

3. String对象的创建

原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。

另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

由于Java是不可变类,这可以在一定程度上提高String创建和使用的效率。
不可改变的字符串具有一个很大的优点:编译器可以把字符串设置为共享。不可变类String有一个重要的优点-它们不会被共享引用。

是这样的,JAVA为了提高效率,所以对于String类型进行了特别的处理---为string类型提供了串池。
定义一个string类型的变量有两种方式:
string name= "tom ";
string name =new string( "tom ")
使用第一种方式的时候,就使用了串池,
使用第二中方式的时候,就是一种普通的声明对象的方式。
如果你使用了第一种方式,那么当你在声明一个内容也是 "tom "的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname= "tom ",将会指向同一块内存

另外关于string类型是不可改变的问题:
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name= "madding "
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个 "tom "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
package com.java.lang;

public class _String {
	public static void main(String[] args) {
		String str1 = "hello";
		String str2 = "world";
		String str3 = "helloworld";
		String str4 = str1 + str2;//由于str1和str2是变量,编译时不能确定 str4指向的地址。
		String str5 = "hello" + "world";//由于"hello" 和  "world"都是常量,编译时确定 str5指向的地址是跟str3一样的。
		String str6 = "hello" + str2;//由于str2是变量,编译时不能确定 str6指向的地址。
		String str7 = str1 + "world";//由于str1是变量,编译时不能确定 str7指向的地址。
		
		System.out.println(str3 == str4);//false
		System.out.println(str3 == str5);//true
		System.out.println(str3 == str6);//false
		System.out.println(str3 == str7);//false
		
	}
}

分享到:
评论

相关推荐

    Java中String类中的常用方法.TXT

    简单总结可以下Java中String类中的常用方法

    Java中String类的详细文档打印版

    ### Java中String类详解 #### 引言 在Java编程语言中,`String`类扮演着至关重要的角色,它用于表示字符序列。本文档旨在深入探讨`String`类的特性和功能,帮助开发者更好地理解和应用这一核心类。 #### String类...

    java中String类的知识

    ### Java中String类的知识 #### 一、String 类概述与创建方式 在Java语言中,`String`类是用于表示不可变字符序列的核心类之一。它代表了一个字符串对象,一旦被初始化后,其内容不能被改变。这被称为不可变性...

    java基础String类选择题练习题

    根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...

    介绍java中String类的方法

    Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建,其内容就不能更改。下面我们将详细讨论String类的一些主要特性、实例化方式以及常用方法。 1. **String类的实例创建**: -...

    javastring类的源码

    java jdk中string类的源码 ,了解string类的书写,定义和声明

    Java中String类.pdf

    Java中的String类是编程中最常用的数据类型之一,它在处理文本数据时扮演着核心角色。String类位于java.lang包中,意味着它无需显式导入即可在任何Java程序中使用。由于字符串在Java中被视为不可变对象,即一旦创建...

    深入解析 Java 中的 String 类:特性与使用

    Java 中的 String 类是 Java 编程语言中最基本的类之一,用于表示字符串。它在 java.lang 包中,是所有 Java 程序的默认一部分。String 类是不可变的,这意味着一旦创建了 String 对象,就不能更改它所包含的字符...

    Java中String类的方法及说明.doc

    在Java编程语言中,String类是一个非常基础且重要的类,它代表不可变的字符序列。String类提供了多种方法,使得开发者能够方便地处理字符串。以下是对标题和描述中提到的Java String类方法的详细说明: 1. **构造...

    JAVA中String类与StringBuffer类的区别

    在Java编程语言中,String类和StringBuffer类是处理字符串的两种主要方式,它们各自有不同的特性和适用场景。理解二者的区别对于编写高效、优化的代码至关重要。 1. **String类**: - **不可变性**:String类的...

    Java中String类的方法及说明.pdf

    Java中的String类是Java语言中最基础且至关重要的类之一,它代表不可变的字符序列。在Java中,字符串被广泛用于各种数据处理和文本操作。本文将深入探讨String类的一些关键方法及其用法。 首先,让我们看看String类...

    Java中String中类的常用方法.doc

    ### Java中String类的常用方法详解 在Java编程语言中,`String` 类是一个非常重要的类,用于表示不可变的字符序列。它提供了丰富的内置方法,使得开发人员能够轻松地处理字符串相关的操作。本文将详细介绍Java中`...

    Java中String类(字符串操作)的10个常见问题和解决方法

    标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...

    全面解析Java中的String类的使用

    在Java编程语言中,String类是使用最广泛的类之一,它代表不可变的字符序列。以下是对Java中String类的全面解析,包括其比较方式、字符串常量的本质、以及常用的字符串操作方法。 一、String的比较方式 在Java中,...

    java中String类的笔试面试题含答案

    Java中的String类是编程面试和笔试中经常出现的考察点,因为它在日常开发中极其重要。下面我们将深入探讨几个关于String类的知识点。 1. **字符串对象的创建和比较** 在Java中,创建字符串有两种方式:直接赋值...

    5.javaString类.zip

    5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5.javaString类.zip5....

    Java的String类

    在Java编程中,`String`类是最常用的数据类型之一,用于处理文本数据。它是一个不可变类,意味着一旦创建了一个`String`对象,其内容就不能更改。这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的...

Global site tag (gtag.js) - Google Analytics