Java中 String类的详解

Posted 路宇_

tags:

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

一、String类的使用:

  1. String:字符串,使用一对“”引起来表示
  2. String声明为final的,不可以被继承
  3. String实现了Serializable接口:表示字符串是支持序列化的。
    实现了Comparable接口:表示String可以比较大小
  4. String内部定义了final char[] value用于存储字符串数据
  5. String代表不可变的字符序列,简称:不可变性
    体现:1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  6. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
  7. 字符串常量池中是不会存储相同内容的字符串的
    案例代码如下:
package www.demo1;

import org.junit.Test;

public class StringTest {
    @Test
    public void test1(){
        String s1="abc"; //字面量的定义方式
        String s2="abc";
        s1="hello";
        System.out.println(s1);
        System.out.println(s2);
        System.out.println("***********************");
        //比较s1,s2的地址值,结果为true
        System.out.println(s1==s2);

        String s3="abc";
        s3+="def";
        System.out.println(s3);
        
        System.out.println("***********************");
        String s4="abc";
        String s5=s4.replace("a","m");
        System.out.println(s4);
        System.out.println(s5);
    }
}

二、String实例化的方式:
方式一:通过字面量定义的方式
方式二:通过new + 构造器() 的方式
代码理解:

		//通过字面量定义的方式:此时数据abc声明在方法区中的字符串常量池中
        String s1="abc";
        String s2="abc";
        //通过new+构造器的方式: 此时s3,s4保存的地址值,是数据在堆空间中开辟以后对应的地址值
        String s3 = new String("abc");
        String s4 = new String("abc");

        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//false
        System.out.println(s1==s4);//false
        System.out.println(s3==s4);//false
        System.out.println("**************************");
        Person p1 = new Person("Tom",14);
        Person p2 = new Person("Tom",14);
        System.out.println(p1.name.equals(p2.name));//true,因为比较的是实体内容(String重写了equals()方法)
        System.out.println(p1==p2);//false new的两个对象地址值是不一样的
        System.out.println(p1.name==p2.name); //true
        p1.name="Lay";
        System.out.println(p2.name); //结果为Tom

结论:

  1. 常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量
  2. 只要其中有一个结果是变量,结果就在堆中
  3. 如果拼接的结果调用intern()方法,返回值就在常量池中
    加上代码便于理解:
		String s1 = "Java";
        String s2 = "android";
        String ss ="JavaAndroid";

        String s3 = "Java"+"Android";
        String s4 = s1 + "Android";
        String s5 = "Java" + s2;
        String s6 = s1 + s2;

        System.out.println(ss==s3);//true
        System.out.println(ss==s4); //false
        System.out.println(ss==s5);//false
        System.out.println(ss==s6);//false
        System.out.println(s4==s5);//false

        String s7=s4.intern();
        System.out.println(ss==s7);//true

以上是String字符串的讲解,有任何问题都可以在评论区指出!

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

《java基础知识》Java字符串详解

Java 中InetAddress类的详解

(转) Java中的负数及基本类型的转型详解

java 代码片段

Java面向对象 类的成员之代码块的详解

Java面向对象中 包装类(封装类)的详解