您现在的位置是:首页 > 正文

java-String类

2024-01-30 21:03:55阅读 0

String的特性

  • String类:代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作 为此类的实例实现。
  • String是一个final类,代表不可变的字符序列。
  • 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
  • String对象的字符内容是存储在一个字符数组value[]中的。
    在这里插入图片描述
    在这里插入图片描述

String对象的创建

String str = "hello";
//本质上this.value = new char[0];
String s1 = new String(); 
//this.value = original.value;
String s2 = new String(String original); 
//this.value = Arrays.copyOf(value, value.length);
String s3 = new String(char[] a); 
String s4 = new String(char[] a,int startIndex,int count);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

String使用陷阱

String s1 = "a"; 
说明:在字符串常量池中创建了一个字面量为"a"的字符串。
s1 = s1 + "b"; 
说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符
串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本
字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响
程序的性能。
String s2 = "ab";
说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
String s3 = "a" + "b";
说明:s3指向字符串常量池中已经创建的"ab"的字符串。
String s4 = s1.intern();
说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串
赋值给s4。

在这里插入图片描述

字符串与其他类型的转换

  • 字符串→基本数据类型、包装类

    1. Integer包装类的public static int parselnt(String s):可以将由“数字”字符组成的字符串转换为整型。
    2. 类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型。
  • 基本数据类型、包装类→字符串

    1. 调用String类的public String valueOf(int n)可将int型转换为字符串
    2. 相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(doubled)、 valueOf(boolean b)可由参数的相应类型到字符串的转换
  • 字符串→基本数据类型、包装类
    public static int parse***(String s)

public class StringTest2 {
    public static void main(String[] args) {

        int a = 3;
        //Integer a = 3; 也可以
        System.out.println(Integer.valueOf(a));

        String b = "4";
        System.out.println(Integer.parseInt(b));
    }
}
  • String --> char[]:调用String的toCharArray()
  • char[] --> String:调用String的构造器
public class StringTest2 {
    public static void main(String[] args) {

        String str1 = "abc123";

        char[] charArray = str1.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            System.out.println(charArray[i]);
        }
        char[] arr = new char[]{'h','e','l','l','o'};
        String str2 = new String(arr);
        System.out.println(str2);
    }
}

String 与 byte[]之间的转换

String --> byte[]:调用String的getBytes()

public class StringTest2 {
    public static void main(String[] args) {

        String str1 = "abc123";
        byte[] bytes = str1.getBytes(); //使用默认的字符集,进行转换
        System.out.println(Arrays.toString(bytes));
        String str2 = new String(bytes);
        System.out.println(str2);

		byte[] bytes = str1.getBytes();
    }
}

String,StringBuffer,StringBuilder

String:不可变的字符序列:底层使用char[]存储
StringBuffer:可变的字符序列:线程安全,效率低:底层使用char[]存储
StringBuilder:可变的字符序列:jdk5.0新增的,线程不安全,效率高:底层使用char[]存储

//源码里面怎么创建的:
     String str = new String(); //char[] value = new char[0];
     String str1 = new String("abc"); //char[] value = new char[]{'a','b','c'}

     StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了16个长度的数组

     sb1.append('a'); //value[0]='a';
     sb10append('b'); //value[1]='b';

     StringBuffer sb2 = new StringBuffer("abc"); //char[] value = new char["abc".length() + 13]
     //
     //问题1:System.out.println(sb2.length());//3
     //问题2,扩容问题:如果要添加的数据底层数据盛不下了,那就需要扩容底层的数组
     //默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中
     //指导意义:开发中建议大家使用:StringBuffer(int capacity)或 StringBuilder(int capacity)
     //速度从大到小:String,StringBuffer,StringBuilder

StringBuffer

在这里插入图片描述
StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

  1. StringBuffer():初始容量为16的字符串缓冲区
  2. StringBuffer(int size):构造指定容量的字符串缓冲区
  3. StringBuffer(String str):将内容初始化为指定字符串内容

在这里插入图片描述

StringBuffer类的常用方法
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
  • 当append和insert时,如果原来value数组长度不够,可扩容。
  • 如上这些方法支持方法链操作。
  • 方法链的原理:
    在这里插入图片描述

StringBuilder类

  • StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样
  • 面试题:对比String、StringBuffer、StringBuilder
    1. String(JDK1.0):不可变字符序列
    2. StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
    3. StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全

注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder 会改变其值。

网站文章

  • RabbitMQ之消息模式1

    RabbitMQ之消息模式1

    1、消息如何保证100%的投递?第一步:保障消息的成功发出第二步:保障MQ节点的成功接收第三步:发送端收到MQ节点(Broker)确认应答第四步:完善的消息进行补偿机制BAT/TMD互联网大厂的解决方案:方法一:消息落库,对消息状态进行打标方法二:消息的延迟投递,做二次确认,回调检查流程步骤:第1步:将订单入库,创建一条MSG(状态为0) 入MSG DB库第2步:将消息发出去...

    2024-01-30 21:03:48
  • C++重载

    目录重载覆盖隐藏重载运算符重载是C++新增的机制,将语义和功能相似的函数用同一个名字表示,提高函数的通用性。重载特征:(1)相同范围(2)函数名相同(3)参数不同(4)virtual可有可无全局函数和...

    2024-01-30 21:03:19
  • ORACLE数据库 —— PL/SQL知识点2

    ORACLE数据库 —— PL/SQL知识点2

    ORACLE数据库 —— PL/SQL知识点2 内置函数 游标

    2024-01-30 21:03:14
  • security的一个过滤器——SecurityContextPersistenceFilter

    security的一个过滤器——SecurityContextPersistenceFilter1、关于security的用户信息获取a、SecurityContextHolder.getContex...

    2024-01-30 21:03:07
  • 聊聊ctrl+c和ctrl+z的区别

    一句话总结:ctrl+c是强制中断程序,ctrl+c是暂停程序。 Ctrl+C Ctrl+Z Ctrl+D bg fg jobs 强制中断程序,进程终止 暂停程序,挂起 退出shell 将一个在后台暂停的命令,变成继续执行 将后台中的命令调至前台继续运行 查看

    2024-01-30 21:02:36
  • 【蓝桥杯】100个数相乘末尾有几个零

    【蓝桥杯】100个数相乘末尾有几个零

    蓝桥杯-简单计算与模拟部分

    2024-01-30 21:02:23
  • 云时代架构读后感(十二)

    途牛订单的服务化演进 原文地址: https://mp.weixin.qq.com/s?__biz=MzI3MzEzMDI1OQ==&amp;mid=2651814702&amp;idx=1&amp;sn=cafc4aa95db9cfdbd0373d00c633a8fb&amp;scene=21#wechat_redirect 一个系统无论视同开发还是运行时的资源,都无法满足业务的需求...

    2024-01-30 21:02:16
  • 数字图像处理_傅里叶变换_输出矩阵的物理含义分析总结

    考虑二维傅里叶变换。傅里叶变换实现了将图像从空间域到频率域(也叫变换域)的转换,这种转换让我们得到了一个关于原图像灰度信息的频谱图,这个频谱图可以看做是图像梯度的分布图(图像梯度是两个点像素灰度的差值...

    2024-01-30 21:01:46
  • BZOJ2127Happiness

    题目描述高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。题解这道题相当于给了我们一堆二元关系。容易想到用二元关系最小割来解决。我们设...

    2024-01-30 21:01:39
  • appsettings.json reloadOnChange事件处理

    appsettings.json reloadOnChange事件处理 写作一直是我比较头疼的事,从事10多年软件开发工作,基本上没写过什么文章,.net core的出现让我终于看到了.net平台的曙光,很希望广大.net开发者共同努力让.net core尽...

    2024-01-30 21:01:31