String类

Posted 张同学吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String类相关的知识,希望对你有一定的参考价值。

String的常用方法

String常量池

为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池。
除了字符串常量池外,Java中还有:

  1. Class常量池:每个.Java源文件编译后生成.Class文件,.Class文件中会保存当前类中的字面常量以及符号信息
  2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常
    量池每个类只保存一份。
    字符串常量池在JVM中是StringTable类,实际是一个固定大小的HashTable,不同JDK版本下字符串常量池的位置以及默认大小是不同的
public static void main(String[] args) {
	// s1和s2引用的是不同对象 s1和s3引用的是同一对象
	String s1 = "hello";
	String s2 = "hello";
	String s3 = new String("hello");
	System.out.printf(s1==s2);//true
}

注意:

  1. 字符串常量池在JVM中字符串常量池只有一份,是全局共享的
  2. 刚开始字符串常量池是空的,随着程序不断运行,字符串常量池中元素会越来越多
  3. 字符创常量池中的内容:一部分来自运行时常量池,一部分来自程序动态添加

String创建对象的方法

String是引用类型,内部并不存储字符串本身,字符串具体的内容存储在对象中,而字符串引用类型变量存储的是对象的地址。

  1. 直接使用字符串常量进行赋值
public static void main(String[] args) {
	String s1 = "hello";
	String s2 = "hello";
	System.out.println(s1 == s2); // true
}
  1. 通过new创建String类对象
 public static void main(String[] args) {
	String s1 = new String( "hello");
	String s2 = new String("world");
	System.out.println(s1 == s2); // true
}

String不可变性

形如 += 这样的操作, 表面上好像是修改了字符串, 其实不是. += 之后 str 打印的结果却是变了, 但不是 String 对象本身发生改变, 而是 str 引用到了其他的对象. 内存变化如下:

字符串不可被修改,是因为:

  1. String类在设计时时就是不可改变的,String类实现描述中已经说明了
    String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:
  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中 的内容可以修改

应该注意,此处的final并不是String不可被修改的原因,final只是表明String不可被继承。
2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。

从上述例子可以看出:String和StringBuffer最大的区别在于String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。避免使用String频繁修改String的值。

以上是关于String类的主要内容,如果未能解决你的问题,请参考以下文章

如何将代码片段存储在 mongodb 中?

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

片段内的网格适配器不起作用

如何理解这段代码片段中的两对括号?

从Asynctask ONPostExecute调用片段方法

elasticsearch代码片段,及工具类SearchEsUtil.java