String、StringBufer、StringBuild类

news2025/1/18 4:31:39

文章目录

  • 1. String
    • 1.1 String的特性
    • 1.2 String的不可变的特性理解
    • 1.3 String不同实例化方式的对比
    • 1.4 *String中的常用方法
    • 1.5 String与其他类型之间的转换
      • 1.5.1 String与基本数据类型、包装类之间的转换
      • 1.5.2 String与字符数组(char[])之间的转换
  • 2. StringBuffer类
    • 2.1 String、StringBufer、StringBuild异同
    • 2.2 StringBuffer类的常用方法(StringBuild同)

1. String

1.1 String的特性

  • String类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。
  • String是一个final类,代表不可以被继承,是一个不可变的字符序列
  • 字符串是常量,用双引号引起来表示。它们的值在创建后不能更改。
  • String对象的字符内容是存储在一个char型数组value[]中的。
  • String实现了serializable接口:表示字符串是支持序列化的。
  • String实现了Comparable接口:表示String可以比较大小
private final char value[];

1.2 String的不可变的特性理解

String:代表不可变的字符序列。简称:不可变性。

体现:

  1. 当对字符串重新赋值时,需要重写指定内存区域赋值,不能对原有的value进行赋值
  2. 当对现有的字符串进行连接操作(s3 +=“def”)时,也需要重新指定内存区域赋值,不能d对原有的value进行赋值
  3. 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域,不能对原有的value进行赋值
    在这里插入图片描述
    理解1:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
    在这里插入图片描述
package junit;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.util.*;

public class Test01 {
    @Test
    public void test(){
        //通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
        //字符串常量池中是不会存储相同内容的字符串的。
        String s1 = "abc";//字面量的定义方式
        String s2 = "abc";
        System.out.println(s1 == s2);//true,比较的是s1和s1的地址值
        s1 = "hello";
        System.out.println(s1);//hello
        System.out.println(s2);//abc
        System.out.println("***********");
        String s3 = "abc";
        s3 += "def";
        System.out.println(s3);//abcdef
        String s4 = "abc";
        String s5 = s4.replace('a','m');
        System.out.println(s4);//abc
        System.out.println(s5);//mbc
    }
}

1.3 String不同实例化方式的对比

理解:

理解:
在这里插入图片描述
理解:
在这里插入图片描述
面试题:String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据: “abc”

理解:不同字符串的拼接操作
在这里插入图片描述

1.4 *String中的常用方法

使用高频:

  • int length():返回字符串的长度:return value.length
  • char charAt(int index):返回某索引处的字符return value[index]
  • boolean isEmpty(:判断是否是空字符串:return value.length == 0
  • String toLowerCase():使用默认语言环境,将 String中的所有字符转换为小写
  • String toUpperCase():使用默认语言环境,将String中的所有字符转换为大写
  • String trim():返回字符串的副本,忽略前导空白和尾部空白
  • boolean equals(Object obj):比较字符串的内容是否相同
  • boolean equalsIgnoreCase(String anotherString): 与jequals方法类似,忽略大小写
  • String concat(String str):将指定字符串连接到此字符串的结尾。等价于用“+”
  • int compareTo(String anotherString):比较两个字符串的大小(例:“abc”和“abe”比较结果为-2,是直接用ascii码减)),涉及到字符串排序,结果为正数则前面字符串大,结果为负数则后买你字符串大,结果为0则两个字符串相等
  • String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginlndex开始截取到最后的一个子字符串。
  • String substring(int beginIndex, int endIndex):返回一个新字符串,它是此符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

普通:

  • boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
  • boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
  • boolean startsWith(String prefix,int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
String s1 = "hello";
System.out.println(s1.startsWith("ll",2));//true
  • boolean contains(CharSequence s):当且仅当此字符串包含指定的char值序时,返回true
  • int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
  • int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
  • int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
  • int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
    注: indexOf和lastIndexOf方法如果未找到都是返回-1
  • String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。
  • String replace(CharSequence target,CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
  • String replaceAll(String regex,String replacement):使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
  • String replaceFirst(String regex,String replacement):使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串。
  • boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
  • Stringsplt(String regex):根据给定正则表达式的匹配拆分此字符串。
  • Stringsplit(String regex,int limit):根据匹配给定的正则表达式来拆分此·字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

1.5 String与其他类型之间的转换

1.5.1 String与基本数据类型、包装类之间的转换

package junit;
import org.junit.jupiter.api.Test;

public class Test01 {
    @Test
    public void test(){
        String s1 = "123";
        //String -->基本数据类型、包装类:调用包装类的静态方法: parseXxx( str)
        int a = Integer.parseInt(s1);
        System.out.println(s1);
        System.out.println(a);
        //基本数据类型、包装类--> string: 调用String重载的valueof(xxx)
        String s2 = String.valueOf(a);
        //法2:将基本数据类型与空字符串相加
        String s3 = a + "";
    }
}

1.5.2 String与字符数组(char[])之间的转换

public class Test01 {
    @Test
    public void test(){
        String str1 = "123";
        //string --> char[]:调用String的toCharArray()
        char[] c = str1.toCharArray();

        //char[] --> String :调用String的构造器
        char[] c1 = new char[]{'h','e','l','l','o'};
        String str2 = new String(c1);
        //或String的valueOf();
        for (int i = 0; i < c1.length; i++) {
            String s3 = String.valueOf(c1[i]);
            System.out.print(s3);
        }

    }
}

2. StringBuffer类

2.1 String、StringBufer、StringBuild异同

  • java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
  • 很多方法与String相同。
  • 作为参数传递时,方法内部可以改变值。

String. stringBuffer. stringBuilder三者的异同?
String:不可变的字符序列;底层使用char型数组(char[])存储
stringBuffer:可变的字符序列;线程安全的,效率低;底层使用char型数组(char[])存储
StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
三者的效率排列:StringBuild > StringBuffer > String

从源码看不同:

package junit;
import org.junit.jupiter.api.Test;

public class Test01 {
    @Test
    public void test(){
        String str = new String();//调用空惨构造器new :char[] value = new char[0];
        String str1 = new String( "abc" );//调用带参构造器new:char[] value = new char[]{ 'a','b','c' };
        StringBuffer sb1 = new StringBuffer(); //调用空惨构造器new: char[] value = new char[16];底层创建了一个长度为16的数组
        sb1.append('a');//value[0] = 'a';
        sb1.append('b');//value[1] = 'b';
        StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length +16]
    }
}
/问题1System.out.printLn( sb2.length());//3
//问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍再+2,同时将原有数组中的元素复制到新的数组中。

2.2 StringBuffer类的常用方法(StringBuild同)

  • 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和linsert时,如果原来value数组长度不够,可扩容。
    如上这些方法支持方法链操作。
  • public int indexof(String str):返回指定子字符串在此字符串中第一次出现处的索引
  • public string substring(int start,int end):返回一个从start开始到end结束的左闭右开区间的字符串
  • public int length()//返回字符串的长度
  • public char charAt(int n) //返回某索引处的字符
  • public void setCharAt(int n,char ch)//将指定位置的字符改为新的字符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何从菜鸟变成大佬:提升写文案的技巧

其实很多人都不知道文案是什么&#xff1f; 他们分不清文案和日常的写作之间的区别。 其实&#xff0c;文案和日常的写作的最大区别就是是否能够产生销售力。 比如你平时写作文、写博客、写情感文章、写政府报告&#xff0c;公文、写书之类的&#xff0c;都不属于文案的范畴…

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展&#xff0c;互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务&#xff0c;然后有了“考研信息平台”&#xff0c;这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计&#xff0c;大多采用java技…

Ae:绘画面板

Ae菜单&#xff1a;窗口/绘画 Paint 快捷键&#xff1a;Ctrl 8 绘画工具&#xff08;画笔工具、仿制图章工具及橡皮擦工具&#xff09;仅能工作在图层面板上。在使用绘画工具之前&#xff0c;建议先在绘画 Paint面板中查看或进行相关设置。 说明&#xff1a; 如果要在绘画描边…

尝试通过俄罗斯方块解释程序员这个职业

每到毕业季和高考季&#xff0c;总会有相关的职业前景咨询环节等待着我&#xff0c;不管我愿不愿意~~。 每次我都会变着法向众人解释程序员这个职业&#xff0c;声泪俱下地描述互联网各种血泪史&#xff0c;先去考公不要进坑云云。可是效果非常不好&#xff0c;7、8月份这群人…

使用docker compose 安装最新版neo4j

一、Neo4j和图数据库简介 neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。图形数据库也被称为图形数据库管理系统或GDBMS。 Neo4j的是一种流行的图形数据库。 其他的图形数据库是Oracle NoSQL数据库&#xff0c;OrientDB&#xff0c;HypherGraphDB&am…

AIGC周报|下一个裁谁?老板:问问AI;OpenAI推出Shap·E;库克:AI仍有不少问题要解决

AIGC&#xff08;AI Generated Content&#xff09;即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT&#xff0c;以及 DallE 2、Stable Diffusion 等文生图模型&#xff0c;都属于 AIGC 的典型案例&#xff0c;它们通过借鉴现有的、人类创造的内容来快速完成内容创作。 …

网络基础之应用层协议,组织方式,自定义协议和http协议https协议简单介绍

网络基础之应用层协议 应用层介绍应用层是什么 组织方式序列化反序列化常见的自定义序列化方式 HTTP协议——超文本传输协议&#xff08;最早就是用来传输web网页传输的&#xff09;HTTP协议的特性HTTP协议的格式&#xff1a; HTTP 请求请求行HTTP常见HeaderHTTP常见状态码 HTT…

asp.net+C#公交线路换乘查询系统

系统功能结构图 (1)用户查询模块 在用户查询模块中&#xff0c;主要是查询出用户自己所需要的线路信息&#xff0c;这也是整个系统最主要的功能模块。主要包括&#xff1a; ①查询车次信息&#xff1a;输入要查询的车次进行搜索&#xff0c;可以查询出于它相应的站点名和站点描…

unity航点寻径

一、游戏框架&#xff1a;设置了六个路标&#xff0c;角色会在这六个路标之间一次移动&#xff0c;当移动到第六个路标后又会返回第一个路标&#xff0c;继续依次移动。 road&#xff1a; 道路&#xff0c;由五个立方体组成 sign&#xff1a;路标&#xff0c;由六个胶囊组成 …

系统集成项目管理工程师 下午 真题 及考点(2020年下半年)

文章目录 2020年下半年试题一&#xff1a;第10章 项目质量管理&#xff0c;规划质量管理过程的输入试题二&#xff1a;第9章 项目成本管理&#xff0c;典型&#xff1a;EAC ACETC AC&#xff08;BAC-EV&#xff09;/CPI BAC/CPI试题三&#xff1a;第18章 项目风险管理&#x…

Grafana 系列-统一展示-3-Prometheus 仪表板

系列文章 Grafana 系列文章 知识储备 Prometheus Template Variables 你可以使用变量来代替硬编码的细节&#xff0c;如 server、app 和 pod_name 在 metric 查询中。Grafana 在仪表盘顶部的下拉选择框中列出这些变量&#xff0c;帮助你改变仪表盘中显示的数据。Grafana 将…

【Java EE】-Servlet(四) Cookie和Session

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 寂寞会发慌&#xff0c;孤独是饱满的。——史铁生《命若琴弦》 主要内容&#xff1a;Cookie的理解&#xff0c;Cookie是什么&#xff1f;Cookie从哪里来&#x…

【消息中间件】kafka高性能设计之内存池

文章目录 前言实现创建内存池分配内存释放内存 总结 前言 Kafka的内存池是一个用于管理内存分配的缓存区域。它通过在内存上保留一块固定大小的内存池&#xff0c;用于分配消息缓存、批处理缓存等对象&#xff0c;以减少频繁调用内存分配函数的开销。 Kafka内存池的实现利用了…

怎么在本地运行umi框架的生产模式

怎么在本地运行umi框架的生产模式 第一种 先使用build进行编译构建, 在webstorm软件上可以在package.json文件上点击运行;或者直接在命令行上敲max build进行构建, 构建好后就会多个dist目录&#xff0c;里面就是编译好的静态文件。 然后在package.json中添加 "serve&qu…

UDP通信机制详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Helm常用命令记录

问: 到哪里去搜索helm package? 答: artifacthub.io helm versionhelm repo add bitnami https://charts.bitnami.com/bitnamihelm install my-release bitnmai/mysqlkubectl get po --all-namespaceshelm uninstall my-release 安装monitoring,推荐kube-prometheus-stack&am…

【SWAT水文模型】SWAT水文模型建立及应用第三期:基于世界土壤数据库HWSD建立土壤库

SWAT水文模型建立及应用&#xff1a;土壤库建立 1 简介2 土壤数据下载2.1 数据下载方式2.1.1 世界土壤数据库HWSD数据2.1.2 中国土壤数据库 2.2 数据下载 3 土壤数据的准备3.1 SWAT土壤数据库参数3.2 提取HWSD中土壤参数3.3 土壤类型分布图的处理3.4 土壤质地转化3.5 土壤参数的…

人工智能浪潮中,AI如何为企业降本增效?

人工智能浪潮下&#xff0c;企业应如何抓住机遇&#xff0c;用AI降本增效&#xff1f;如何选择适合自身产业的人工智能服务&#xff1f;如果你想了解更多&#xff0c;本文或许能给你提供一点思路。 一、企业如何利用AI降本增效 在人工智能浪潮下&#xff0c;已有多款AI产品问世…

京东APP百亿级商品与车关系数据检索实践 | 京东云技术团队

导读 本文主要讲解了京东百亿级商品车型适配数据存储结构设计以及怎样实现适配接口的高性能查询。通过京东百亿级数据缓存架构设计实践案例&#xff0c;简单剖析了jimdb的位图(bitmap)函数和lua脚本应用在高性能场景。希望通过本文&#xff0c;读者可以对缓存的内部结构知识有…

一文带你写好:项目说明文档README.md

1、前言 公开项目中&#xff0c;一个好的 README 能帮助我们的公开项目&#xff0c;在 GitHub 上的众多项目和开发人员中脱颖而出&#xff1b;商业项目中&#xff0c;一个好的 README 能帮助部门同事更好理解用途和项目进展。下面我们一起讨论什么是 README 自述文件以及如何编…