快捷搜索:  汽车  科技

java中string类原理详解(深入理解javaString)

java中string类原理详解(深入理解javaString)这三种形式创建字符串返回的结果是一样的,但是java 虚拟机在内存分配上是不同的。3. String str3 = “string".intern()String 的创建形式有以下三种基本形式:1. String str = "string"2. String str2 = new String("string");

JDK 中的String 类是一个简单而又不平凡的类, 它是java 语言的核心类。我们今天就来讲讲java String这个类的故事。

先看java String 类源码:

java中string类原理详解(深入理解javaString)(1)

从源码中我们可以看到String 类是被定义为final 的,这就意味着String 类是不可以被继承的,里面的方法也被定义为final 的,因为String 类是java 语言的核心类,所以java语言设计者基于安全和效率考虑,不予许String 类可以被继承。(我们先在这里留下一个问题:为什么String 类被定义为final, String 类的方法也被定义为fianl?)

一.字符串的创建形式

String 的创建形式有以下三种基本形式:

1. String str = "string"

2. String str2 = new String("string");

3. String str3 = “string".intern()

这三种形式创建字符串返回的结果是一样的,但是java 虚拟机在内存分配上是不同的。

在解释这点之前,我们先来看看java 虚拟机对内存分配:

java栈内存(私有数据区): 主要用来存储局部变量,(基本数据类型变量,对象引用变量)

java堆内存(共享数据区):主要存放实例对象

方法区(共享数据区):主要存放加载的类信息,静态变量,常量

常量池(共享数据区):常量池是方法区的一部分,用来存储字面常量、使用final修饰的变量以及符号引用

第一种方法在创建字符串str 时,java虚拟机会在方法区的常量池中判断是否存在具有和字符串string内容相同的String对象:如果常量池不存在和赋值字符串内容相同的对象,虚拟机就在常量池中分配内存并创建该String对象,并将String对象的引用赋值给String类型的变量;如果常量池存在与赋值字符串内容相同的对象,虚拟机会直接将该对象的引用赋值给String类型的变量。这种创建方式对连续创建同一字符串内容的String对象特别有用,内存利用效率非常高效

第二种方法, intern()是一个Native方法,底层调用C 的 StringTable::intern 方法,虚拟机会创建两个String对象:一个String对象是在常量池中创建,如果常量池中已有字符串内容相同的对象,则不创建;一个String对象是在运行数据区的堆中创建,将在常量池中创建的String对象的字符数组复制到在堆中创建的String对象。

第三种方法,java虚拟机会返回常量池种对象的引用给变量str3。

所以我们在创建一个字符串的时候,基于内存效率的考虑,多用方法一。

所以, String被设计成不可变和不能被继承的原因,可以理解为考虑效率和安全,只有当字符串不可变,String 常量池才可以实现,从而在运行时节省很多heap 空间。

二, String 类中常用方法

方法

用途

boolean startsWith(String str)

boolean endsWith(String str)

boolean contains(CharSequence str)

检查开始或者结束字符

int indexOf(String str)

int lastIndexOf(String str)

int indexOf(String str int fromIndex)

int lastIndexOf(String str int fromIndex)

字符索引,如果没有匹配则返回-1

String replace(CharSequence oldStr CharSequence newStr)

字符替换

String toUpperCase()

String toLowerCase()

返回大小写字符

String trim()

去除首尾空格

三, 字符串连接

java 语言使用操作符 来拼接字符串, 如果要将字符串拆开,可以用substring 方法,结合indexOf 方法对字符串进行拼接。

java中string类原理详解(深入理解javaString)(2)

输出结果:

ebcf4464091342229224034deb0fcf2e

ebcf446409

四。 更高效的字符串处理类StringBuilder 与StringBuffer

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类

java中string类原理详解(深入理解javaString)(3)

五, String 的equals 与==

下面是String 类的equals 方法, equals 是Object 类中的方法。

java中string类原理详解(深入理解javaString)(4)

从源码上看

1. 若当前对象和比较的对象是同一个对象,即return true。也就是Object中的equals方法。

2.若当前传入的对象是String类型,则比较两个字符串的长度,即value.length的长度。

若长度不相同,则return false

若长度相同,则按照数组value中的每一位进行比较,不同,则返回false。若每一位都相同,则返回true。

若当前传入的对象不是String类型,则直接返回false

猜您喜欢: