`

字符串详解

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

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

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 中,字符串可以使用单引号、双引号或者三个...

    格式化数字字符串详解(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_Server_连接字符串和身份验证.pdf

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

    ASP.NET Oracle连接字符串

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

    详解C++ string常用截取字符串方法

    在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...

Global site tag (gtag.js) - Google Analytics