面向对象 - String类和常量池

返回目录

String类

    • String类基础:String类又被称作不可变字符序列,Java字符串就是Unicode字符序列;Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例;String位于java.lang包中,Java程序默认导入java.lang包下的所有类。
      package me.hzyis.test;
      public class Test {
        public static void main(String[] args) {
          String a = "测试"; //定义字符变量
          String b = new String("测试2"); //创建String类对象
          String c = "测试"+"3"; //字符串拼接
          String d = "测试"+4; //有一个字符串,+号则变为字符串连接符
          System.out.println(a+"\r\n"+b+"\r\n"+c+"\r\n"+d);
        }
      }
      package me.hzyis.test;
      public class Test {
        public static void main(String[] args) {
          String s1 = "core Java";
          String s2 = "Core Java";
          System.out.println(s1.charAt(3)); //提取下标为3的字符,从0开始索引,所以第三个值为"e",不可为负数
          System.out.println(s2.length()); //字符串的长度,算上空格共10个字符
          
          System.out.println(s1.equals(s2)); //比较两个字符串是否相等
          System.out.println(s1.equalsIgnoreCase(s2)); //比较两个字符串是否相等(忽略大小写)
          
          System.out.println(s1.indexOf("Java")); //字符串s1中是否包含"Java"字符,如果存在返回指定字符在序列的位置
          System.out.println(s1.indexOf("java")); //字符串s1中是否包含"java"字符,如果没有返回-1
          
          String s = s1.replace(' ','&'); //将s1中的空格替换为&符号,替换后赋值给s,s1不会有任何变化
          System.out.println("result is:" + s);
          System.out.println("\r\n****************************\r\n");
          
          String st = "";
          String st1 = "How are you?";
          System.out.println(st1.startsWith("How")); //是否以How开头
          System.out.println(st1.endsWith("you")); //是否以You结尾
          
          st = st1.substring(4); //从下标为4的字符开始 到 字符串结尾为止,提取子字符串
          System.out.println(st);
          st = st1.substring(4,7); //提取下标是4到7,包括4不包括7的字符串
          System.out.println(st);
          
          st = st1.toLowerCase(); //全部转小写
          System.out.println(st);
          st = st.toUpperCase(); //全部转大写
          System.out.println(st);
          
          String st2 = " How old are you!! ";
          st = st2.trim(); //去除首尾空格,无法去除中间的空格
          System.out.println(st); //st2不变,生成新的st字符串输出
          System.out.println(st2); //因为String是不可变字符序列,所以st2不变
        }
      }

常量池

    • 全局字符串常量池(String pool):全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
    • class文件常量池(Class Constant Pool):class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final常量等)和符号引用。
    • 运行时常量池(Runtime Constant Pool):运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
      package me.hzyis.test;
      public class Test {
        public static void main(String[] args) {
          String test1 = "abc";
          String test2 = "abc";
          String test3 = new String("abc");
          System.out.println("是否相同:" + (test1==test2)); //test1和test2处在相同对象中,所有为true
          System.out.println("是否相同:" + (test3==test2)); //test3是不同对象,所以为false
        }
      }