Java之旅(十)

Java 字符串

在Java中,字符串是一个非常重要的数据类型,它是由字符组成的序列。我们可以使用Java内置的String类来定义和操作字符串。

  • String 类
    • String 类是 final 的,意味着它不能被子类继承。
    • String 类实现了 Serializable 接口,意味着它可以序列化。
    • String 类实现了 Comparable 接口,意味着最好不要用‘==’来比较两个字符串是否相等,而应该用 compareTo() 方法去比较。
    • StringBuffer、StringBuilder 和 String 一样,都实现了 CharSequence 接口,所以它们仨属于近亲。由于 String 是不可变的,所以遇到字符串拼接的时候就可以考虑一下 String 的另外两个好兄弟,StringBuffer 和 StringBuilder,它俩是可变的。
    • 每一个字符串都会有一个 hash 值,这个哈希值在很大概率是不会重复的,因此 String 很适合来作为 HashMap 的键值。

以下是Java字符串的相关知识点、作用、操作方法、注意点以及学习建议。

1、常用知识点:

  • 创建字符串:String s1 = "Hello, world!";
  • 比较字符串:s1.equals("Hello, world!");
  • 拼接字符串:String s2 = "Hello" + " world!";
  • 字符串长度:int length = s1.length();
  • 字符串截取:String sub = s1.substring(7, 12);
  • 字符串替换:String replaced = s1.replace("world", "Java");
  • 字符串查找:int index = s1.indexOf("world");
  • 转换成大写:String upper = s1.toUpperCase();
  • 转换成小写:String lower = s1.toLowerCase();
  • 去除首尾空白字符:String trimmed = s1.trim();
  • 分割字符串:String[] parts = s1.split(" ");

2、作用:字符串在程序开发中非常常见,它广泛地应用于各种场景,如:用户输入、文件读取、网络通讯、数据库操作等。

3、常量池:

  • 作用:可以通过双引号的方式直接创建字符串对象,不用再通过 new 的方式在堆中创建对象
  • String s = new String("值")
    • 创建二个对象
      • 一个是字符串对象 “值”,被添加到字符串常量池中
    • 另一个通过 new String() 构造函数创建的字符串对象“值”,被分别到堆内存中,同时引用变量 s 存储在栈上,它指向堆内存中字符串对象“值”
    • String s = “值”
      • Java 虚拟机会先在字符串常量池中查找有没有“值”这个字符串对象,如果有,则不创建任何对象,直接将字符串常量池中这个“值”的对象地址返回,赋给变量 s;如果没有,在字符串常量池中创建“值”这个对象,然后将其地址返回,赋给变量 s。

4、String、StringBuild、StringBuffer区别

  • String:不可变
  • StringBuilder:可变,线程不安全,效率高(不能同步访问,但有速度优势)
  • StringBuffer:可变,并且线程安全,效率差。

5、equals 与 == 对比

  • "==" 用于数据类型的比较,判断引用是否指向堆内存的同一块地址
  • equals 用于判断两个变量是否是同一个对象的引用,即堆中的内容是否相同返回值为布尔类型。
  • 比较 java 基本类型:比较基本数据类型只能用 == ,不能用 “equals”,这里的 == 比较两个基本类型的值
  • 比较 String: "==" 比较的是内存地址,“equals” 比较的是值
  • 比较对象:都比较地址

6、注意点:

  • 字符串是不可变的,任何对字符串的操作,如:拼接、截取、替换等操作,都会创建一个新的字符串对象。因此在进行大量字符串操作时,建议使用StringBuilder或StringBuffer进行优化。
  • 在进行字符串比较时,需要使用equals()方法而不是==操作符,因为==操作符比较的是两个字符串对象的引用地址而非内容相等。
  • 字符串常量池:为了减少内存中的字符串对象数量,Java在编译阶段会对同一字符串对象进行优化,将其放入字符串常量池中,以便多次使用。
  • 当处理大量数据时,尽量避免频繁的字符串拼接,否则会导致内存中创建大量临时对象,影响性能。在这种情况下,可以使用StringBuilder或StringBuffer进行优化。

你可能感兴趣的:(Java,java)