String类

本文详细介绍了Java中字符串的创建、比较、常用方法及字符串常量池的概念。通过实例展示了String、StringBuilder和StringBuffer的区别,并解释了为什么String类设计为不可变。此外,还探讨了字符串的线程安全性和效率优化。
摘要由CSDN通过智能技术生成

一,字符串的构造(最常用的有三种方式)

        String s1 = new String("hello");

        String s2 = "world";

        char[] array1 = {'b','i','t'};
        String s3 = new String(array1);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);

二,String类型的比较

        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        String s4 = s1;

        System.out.println(s1 == s2);  //false
        System.out.println(s1 == s3);  //false
        System.out.println(s1 == s4);  //true

        System.out.println(s1.equals(s2));  //true
        System.out.println(s1.equals(s3));  //false
        System.out.println(s1.equals(s4));  //true

 

解释:在引用类型中,不能用  “==”  直接进行比较,否则他们比较的是地址

  • s1 和 s2是内容相同,但是地址不同,他们都是新的对象,所以地址不同
  • s1 和 s3是内容,地址均不相同
  • s1 和s4相同是因为,s4直接指向了s1的地址

 在引用类型中要用equals的方法才能进行比较

  • s1 和 s2的内容相同,所以结果应为true
  • s1和s3的内容不同,所以为false
  • s1 和 s4的内容相同,所以为true

还有两种方法是int compareto(String s)方法和 int compareToIgnoreCase(String str)的方法

int compareto(String s):

  • 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  • 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值

 int compareToIgnoreCase(String str):

这个方法忽略了大小写

        String s1 ="abc";
        String s2 ="def";
        String s3 ="ABC";

        System.out.println(s1.compareTo(s2));              // 不为0
        System.out.println(s1.compareTo(s3));              // 不为0

        System.out.println(s1.compareToIgnoreCase(s2));    // 不为0
        System.out.println(s1.compareToIgnoreCase(s3));    // 为0

三,常用的一些方法

四,转化

1.数字转字符串

要使用到 valueOf 的方法

        int a = 1234;
        double b = 12.34;
        String s1 = String.valueOf(a);
        String s2 = String.valueOf(b);
        System.out.println(s1);
        System.out.println(s2);

 

 在 valueOf的方法中,标准库给了很多重载的方法

2.字符串转数字

        String s3 ="12345";
        String s4 ="123.45";

        int c = Integer.parseInt(s3);
        double d = Double.parseDouble(s4);

        System.out.println(c);
        System.out.println(d);

 

3.大小写转化

        String s5 ="abc";
        String s6 ="ABC";

        System.out.println(s5.toUpperCase());
        System.out.println(s6.toLowerCase());

 

 4.字符串转数组

        String s8 ="hello!";
        char[] ch = s8.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.print(ch[i] + " ");
        }
    }

 

5.格式化字符串

        String s9 = String.format("%d-%d-%d",2021,10,30);
        System.out.println(s9);

 

 五,字符串常量池

在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池
 

为了节省存储空间以及程序的运行效率,Java中引入了:

1. Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息

2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份

3. 字符串常量池

 字符串常量池

1. 在JVM中字符串常量池只有一份,是全局共享的

2. 刚开始字符串常量池是空的,随着程序不断运行,字符串常量池中元素会越来越多

3. 当类加载时,字节码文件中的常量池也被加载到JVM中,称为运行时常量池,同时会将其中的字符串常量保存在字符串常量池中

4. 字符创常量池中的内容:一部分来自运行时常量池,一部分来自程序动态添加

 六,字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改

在标准库当中已经阐明

 大意是:字符串是常量;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为字符串对象是不可变的,所以可以共享它们

而不是因为,String是被final修饰,或者是保存字符串内容的的数组被final修饰

前者是因为,String不能被继承,后者是,表示该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的

问:为什要让String类不可变?(好处是什么?)

1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了

2. 不可变对象是线程安全的.

3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中

七,StringBuilder 和 StringBuffer(用来对字符串进行修改)

这两个和String一样都是两个类,因此使用时需要new一个相应的对象

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可

以修改。频繁修改字符串的情况考虑使用StringBuilder。

注意:

String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

String变为StringBuilder: 利用StringBuilder的构造方法或append()方法

StringBuilder变为String: 调用toString()方法

String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值