`

字符串详解

 
阅读更多
一、字符串的六道经典题

看明白了,基本上就掌握了字符串的原理了。

public class test1 {

/**
* @param args
*/
public static void main(String[] args){
String a = "a1";
String b = "a"+ 1;
System.out.println(a==b);
}//true

}



test2:

package StringTest;

public class test2 {

/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
String bb = "b";
String b = "a"+ bb; //编译器不能确定为常量
System.out.println(a==b);
}//false

}

test3:


package StringTest;

public class test3 {

/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
final String bb = "b";
String b = "a"+ bb; //bb加final后是常量,可以在编译器确定b
System.out.println(a==b);
}//true

}

test4:

package StringTest;

public class test4 {

/**
* @param args
*/
public static void main(String[] args){
String a = "ab";
final String bb = getBB();
String b = "a"+ bb;//bb是通过函数返回的,虽然知道它是final的,但不知道具体是啥,要到运行期才知道bb的值
System.out.println(a==b);
}//false
private static String getBB(){ return "b"; }

}

test5:

package StringTest;

public class test5 {

/**
* @param args
*/
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;//+的用法
System.out.println(s == a);
System.out.println(s.intern() == a);//intern的含义
}//flase true

}

test6:

package StringTest;

public class test6 {

/**
* @param args
*/
private static String a = new String("ab");
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
System.out.println(s.intern() == a.intern());
}//flase false true
}

原因解析:

    String str1 = "java";
    String str2 = "blog";
    String s = str1+str2;
    System.out.print(s=="javablog");
原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道,也就是说str1+str2是在堆里创建的,s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。

    另外,对字符串进行赋值时,假如右操纵数含有一个或一个以上的字符串引用时,则在堆中再建立一个字符串对象,返回引用;如String s=str1+ "blog"; 会在堆中创建对象。


二、创建了几个对象

    现在分析String str = new String("abc");创建了几个String对象。很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象,一个是编译期,一个是运行期。


三、字符串的不可变性

    String s1 = "s1";
  String s2 = s1;
  s2 = "s2";
  s1指向的对象中的字符串是什么?
  答案: "s1"。(永远不要忘了String不可变的,s2 = "s2";实际上s2的指向就变了,因为你不可以去改变一个String,)

Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",假如存在则直接将"abc"赋给str,假如不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(留意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,由于新建字符串占用内存空间。String str = new String()创建了一个空字符串,与String str=new String("")相同。
String的不变性的机制显然会在String常量内有大量的冗余。如:"1" + "2" + "3" +......+ "n" 产生了n+(n+1)个String对象!因此Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。对String多么照顾啊!当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的String,不创建任何新的String常量对象。



四、怎么检查字符串在字符串常量池中
    public static boolean inPool(String s) {
        String s2 = s.intern();
        if (s2 == s)
            return true;
        return false;
    }

五、intern方法的作用

 当调用 intern 方法时,假如池已经包含一个即是此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
分享到:
评论

相关推荐

    java字符串 详解 java实例20

    本实例“Java字符串详解 Java实例20”将深入探讨Java中的字符串处理机制,包括其创建、操作以及性能优化等方面的知识。 一、字符串的创建与初始化 在Java中,字符串是对象,它们被封装在`String`类中。字符串可以...

    Python教程-字符串详解及序列类型.pdf

    Python 字符串详解及序列类型 Python 中的字符串是我们在程序中使用非常多的一个对象,对于字符串的处理在各种编程语言中也是非常重要的一部分。 字符串定义 在 Python 中,字符串可以使用单引号、双引号或者三个...

    nodejs中转换URL字符串与查询字符串详解.doc

    nodejs中转换URL字符串与查询字符串详解.doc

    格式化数字字符串详解(sprintf)

    格式化数字字符串详解(sprintf) sprintf 函数是 C 语言中一个强大的格式化数字字符串函数,可以将整数打印到字符串中,控制浮点数打印格式,连接字符串,等等。 格式化数字字符串 sprintf 函数最常见的应用之一...

    EditPlus正则表达式替换字符串详解

    ### EditPlus正则表达式替换字符串详解 #### 正则表达式基础介绍 正则表达式是一种用于匹配、查找和替换字符串的强大工具。在文本处理领域有着广泛的应用,尤其是在编程语言中,它可以帮助我们高效地处理各种文本...

    MS_SQL_Server_数据库连接字符串详解

    接字符串属性时,可以使用 `true`、`false`、`yes` 或 `no`,它们之间是等价的。MS SQL Server 数据库连接字符串是用于建立与 SQL Server 数据库实例连接的重要配置,包含了多种参数以确保正确和安全地访问数据库。 ...

    Java字符串详解

    内容讲解了Java的字符串实现String和StringBuffer,以及对应的方法,同时包含讲解的测试例子。

    Python变量和字符串详解

    ### Python变量和字符串详解 #### 一、变量 在Python编程中,变量是最基本的数据存储单元,用于存储各种类型的数据,如数字、字符串等。在Python中声明变量非常直观,无需提前指定变量类型,直接赋值即可。 #####...

    C++字符串详解.pdf

    C++中的字符串处理是编程中常见且重要的任务,涉及到数据的读取、处理和输出。在C++中,字符串通常以字符数组的形式存在,而C++标准库提供了多个函数来帮助我们有效地操作这些字符串。 首先,`strcpy()`函数用于...

    C++字符串详解.docx

    C++字符串是编程中不可或缺的一部分,它用于存储和操作文本数据。C++提供了多种方法来创建、修改和处理字符串,这些方法包括标准库中的C风格字符串函数和STL中的`std::string`类。以下是对这些知识点的详细解释: #...

    Mathematica 语法之字符串详解

    Mathematica 作为一套先进的计算平台,在国内普及的程度远远不如matlab,这与它的参考资料稀少有关,这个文档详细介绍了Mathematica 的字符串的操作方式,可作为使用Mathematica的进阶教程使用。

    各种数据库链接字符串

    ### 各种数据库链接字符串详解 #### 一、概述 在进行数据库开发的过程中,数据库连接字符串是必不可少的一部分。本文将详细介绍几种常见的数据库连接字符串及其配置参数。这些数据库包括:DBase 5.0、DBASE IV、...

    java 数组和字符串

    ### Java数组和字符串详解 #### 实验目标与背景 本次实验旨在深化理解Java中的数组与字符串操作,聚焦于`String`类与`StringBuffer`类的掌握,包括它们的常用方法、相等性判断的不同方式、数组的创建及引用机制,...

    python3字符串

    ### Python3字符串详解 #### 一、字符串简介 在Python3中,字符串是最常用的数据类型之一,用于存储一系列字符。字符串可以通过单引号('')或双引号("")创建。例如: ```python var1 = 'HelloWorld!' var2 = ...

    按键精灵字符串函数详解

    按键精灵字符串函数详解 本文档详细介绍了按键精灵字符串函数的使用方法和应用场景,涵盖了 Sqr、Asc、Chr、Hex、InStrRev、Join、LCase、Left、Len、LTrim、RTrim、Trim、Mid、Replace、Right、Space 和 StrComp ...

    其中的ADODB.Connection中的连接字符串怎么写

    ### 连接字符串详解 连接字符串是ADODB.Connection对象与特定数据源建立连接的关键参数集合。它通常包含以下几种类型的参数: - **Provider**: 指定数据源的提供者,如SQL Server、Oracle等。 - **DataSource**: ...

    MFC字符串CString 操作用法详解

    ### MFC字符串CString操作用法详解 #### 一、引言 Microsoft Foundation Classes (MFC) 是一套由微软开发的类库,它封装了Windows API,使得开发者可以更方便地进行Windows应用程序的开发。其中,`CString`是MFC中...

    Sql Access连接数据库字符串

    ### 数据库连接字符串详解 #### 一、概述 在IT领域中,数据库连接字符串是用于建立应用程序与数据库之间通信的关键参数。本文档旨在提供一种针对Microsoft Access 2007和SQL Server 2008数据库连接字符串的全面...

    SQL_Server_连接字符串和身份验证.pdf

    #### 二、连接字符串详解 连接字符串是用于指定应用程序如何连接到数据库的一组参数。对于 SQL Server 来说,连接字符串通常由一系列属性/值对组成,每个属性/值对之间用分号隔开。例如: ``` DataSource=...

    ASP.NET Oracle连接字符串

    ### ASP.NET Oracle连接字符串详解 在开发基于ASP.NET的应用程序时,经常需要与Oracle数据库进行交互。为了确保数据能够正确地被读取、写入,一个正确的连接字符串至关重要。本文将详细探讨如何设置一个适用于ASP...

Global site tag (gtag.js) - Google Analytics