java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

概述

java中会经常用到String类,因此在这里做一个总结,方便查阅,本文将不定期补充,可能会有错误和疏漏之处,欢迎探讨。

内存模型

Java对字符串类中涉及的内存有堆内存、栈内存以及由JVM维持的常量池。下面将分别介绍。

堆内存

1堆内存主要存放运行过程时创建或实例化的对象和数组,由垃圾回收器自动管理。

栈内存

1栈内存主要存放程序代码中静态或者非静态的方法,基本类型变量和对象的引用变量。

常量池

1常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据,包括基本类型和对象型(String)的常量值和以文本形式出现的符号引用。
常量池中的值不可改变。

String类

String初始化及内存分析

1char[] chars = {'t','e','s','t'};
// 可指定编码字符集和chars数组的起始位置和长度,参照Java API
String str1 = new String(chars);

String str2 = new String("test");

1String str3 = "test";
1String str4 = "te" + "st";

下面将使用测试代码解释String类及其应用。

测试

“==”测试1

1/**引用测试*/

//除了在堆中生成一个String实例外,还会在常量池中生成一个字符串常量"Test";
String str1 = new String("Test");

//在堆中生成一个String实例,并返回其引用。
String str2 = new String("Test");

System.out.println("Result: "+(str2==str1));

//////////////////////////////////////////////////////////
Result: false
/////////////////////////////////////////////////////////

/** 
String类"=="比较的是String引用;
使用new实例化String时,首先在堆中产生一个String的实例,然后将其引用存放在栈中,str1,str2分别存放的是堆中"Test"和"Test"的引用,故为false;
 */

“==”测试2

1String str1 = new String("Test");
String str2 = "Test";
System.out.println("Result: "+(str2==str1));

/////////////////////////////////////////////////////////
Result: false
////////////////////////////////////////////////////////

“==”测试3

1String str1 ="Test";
String str2 ="Test";
System.out.println("Result: "+(str2==str1));

/////////////////////////////////////////////////////////
Result: true
////////////////////////////////////////////////////////

/**
str1将在常量池中生成一个"Test"常量并返回其引用,
str2将返回常量池中的"Test"的引用,
故两者相等
*/

“==”测试4

1String str1 ="Test";
String str2 ="Te"+"st";
System.out.println("Result: "+(str2==str1));

/////////////////////////////////////////////////////////
Result: true
////////////////////////////////////////////////////////

/**
str1将在常量池中生成一个"Test"常量并返回其引用,
str2将返回常量池中的"Test"的引用,
故两者相等
此时常量池中将存在"Test","Te","st"三个常量
*/

基于以上测试,我们可以得到如下结论:String类在实例化时会在堆内存和常量池各产生一个字符串常量

堆中可以产生多份相同的String常量,常量池中只存在一份。

当我们使用new实例化String时返回的是该String对象在堆内存的引用

当我们使用字符串常量直接给String赋值时,若常量池中存在该字符串常量则返回其引用,否则在常量池中创建该字符串常量然后返回其引用

用法及源码解析

接口

1java.io.Serializable, Comparable<String>, CharSequence

主要成员变量

1private final char value[];
private int hash; // Default to 0

String类主要成员变量为一个声明为final的字符数组和一个int型的hash值,我们有如下结论:

1. String类的value一旦赋值,不能被改变。

2. String类在堆内存中以数组形式存储,当我们使用”==”时比较的是数组在堆内存或者常量池的地址。

3. hash值只与String的值有关。

常用方法

1 public int length() //返回字符串长度
 public int hashcode() //返回hash值

JavaString字符串正则表达式

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。