JAVA篇08 —— String类

欢迎来到我的主页:【一只认真写代码的程序猿

本篇文章收录于专栏【小小爪哇

如果这篇文章对你有帮助,希望点赞收藏加关注啦~

目录

1 String概述

1.1 String特性

1.2 String常用方法

2 StringBuffer类

2.1 String与StringBuffer互转

2.2 StringBuffer常见方法

3 StringBuilder类

3.1 StringBuilder常用方法

3.2 三者使用比较


1 String概述

String对象用于保存字符串。

字符串常量对象用双引号括起来如"StringTest",Unicode编码,一个字符占两个字节。

常见构造器:new String();、new String(String original);、new String(char[] a);、new String(byte[] b)、new String(char[] a,int startIndex,int count);

    public static void main(String[] args) {String name = "jack";name = "jack1";final char[] value = {'j','a','k'};char[] v2 = {'j','a','c'};value[0] = 'a';//value = v2; 不可以修改 value 地址}

创建的两种方式:赋值和new String();

  • 赋值:先从常量池查看是否有"xxx"的数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
  • new:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间如果常量池没有"hsp",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。


1.1 String特性

String是final类,字符串是不可变的,一个字符串对象一旦被分配,是不能改变的。

String s1 = "abc";
s1="bcd";//先创建"abc"常量字符串,再创建一个"bcd"字符串,让s1指向"bcd";
String a = "ab";//创建常量ab
String b = "cd";//创建常量cd
String c = a+b;//创建常量abcd

1.2 String常用方法

String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此提供StringBuilder 和 StringBuffer 来增强String的功能并提高效率。

  1. equls:区分大小写,内容是否相等。
  2. equalsIgnoreCase:忽略大小写判断内容是否相同。
  3. length:长度
  4. indexOf:字符在串中第一次出现的索引,从0开始,没有就返回-1.
  5. lastIndexOf:最后一次的索引。
  6. substring:截取指定范围的子串。
  7. trim:去掉前后空格。
  8. charAt:获取某个索引处的字符,不能用str[index]。
    public static void main(String[] args) {String str1 = "hello";String str2 = "Hello";System.out.println("equals:" + str1.equals(str2));//falseSystem.out.println("equalsIgnoreCase:" + str1.equalsIgnoreCase(str2));//trueSystem.out.println("length:" + str1.length());//5System.out.println("indexOf(l):" + str1.indexOf('l'));//2System.out.println("lastIndexOf(l):" + str1.lastIndexOf('l'));//3System.out.println("substring(2):" + str1.substring(2));//lloSystem.out.println("substring(2,4):" + str1.substring(2, 4));//ll,是[2,4)}
  1. toUpperCase:全部转为大写
  2. toLowerCase:全部转为小写
  3. concat:字符串拼接,str1.concat(str2)
  4. replace:字符替换,str1.replace("orldStr","newStr");
  5. split:字符串切割,String strSplit [ ] = str.split(",");切割后是字符数组
  6. compareTo:字符串比较,str1比str2
  7. toCharArray:字符串转字符数组
  8. format:字符串格式化
    public static void main(String[] args) {//1. toUpperCase,转换成大写String str1 = "Hello";System.out.println(str1.toUpperCase());//HELLO//2. toLowerCase,转换成小写System.out.println(str1.toLowerCase());//hello//3. concat,拼接字符串String strConcat1 = "你好";String strConcat2 = ",我是xxx";System.out.println(strConcat1.concat(strConcat2));//你好,我是xxx//4. replace,替换字符//PS:replace方法返回的是替换后的字符串,原字符串不受影响。String strReplace = "你好,哈哈哈哈哈哈";String strRet = strReplace.replace("你好", "霓虹");System.out.println(strReplace);//你好,哈哈哈哈哈哈System.out.println(strRet);//霓虹,哈哈哈哈哈哈//5. split,对字符串进行分割,如果有特殊字符,需要加入转义字符“\”String poem = "床前明月光,疑是地上霜,举头望明月,低头思故乡";String splits[] = poem.split(",");for (String subStr : splits) {System.out.println(subStr);/*床前明月光疑是地上霜举头望明月低头思故乡*/}//特殊字符切割String local = "E:\\Test\\LocalCode\\result";//E:\Test\LocalCode\resultSystem.out.println(local);String localSplit[] = local.split("\\\\");//因为一个"\\"表示一个"\",这里需要两对"\\"for (String subStr : localSplit) {System.out.print(subStr + " ");//E: Test LocalCode result}//6. toCharArray,转换成字符数组String s = "hello";char[] chs = s.toCharArray();for (int i = 0; i < chs.length; i++) {System.out.print(chs[i] + " ");//h e l l o}//7. compareTo 比较两个字符串大小//先比较单个字符:return c1-c2; 如果前面部分的内容相同,则return str1.len-str2.lenString sct = "abcd";String sct2 = "accd";String sct3 = "abc";System.out.println(sct.compareTo(sct2));//b-c=-1System.out.println(sct.compareTo(sct3));//前面内容相同,返回len差是1/*8. format 格式字符串,类似于c语言输出占位符有:* %s 字符串 %c 字符 %d 整型 %.2f 浮点型*/String name = "小明";int age = 10;double score = 66.6;char gender = '男';String formatStr = "我的姓名是%s 年龄是%d, 成绩是%.2f 性别是%c.大家好!";String Info = String.format(formatStr, name, age, score, gender);System.out.println(Info);}

2 StringBuffer类

java.lang.StringBuffer打表可变的字符序列,可以对字符串内容进行增删。很多方法与String相同,但是StringBuffer是可变长度。StringBuffer是个容器。

1. StringBuffer的直接父类是 AbstractStringBuilder

2. StringBuffer实现了Serializable, 即StringBuffer的对象可以串行化
3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final,该value数组存放字符串内容,引出存放在堆中的。

4. StringBuffer是一个final类,不能被继承

5. 因为StringBuffer字符内容是存在 char[] value, 所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象),所以效率高于String

创建:StringBuffer stringBuffer = new StringBuffer("hello");


2.1 String与StringBuffer互转

    public static void main(String[] args) {//String转StringBufferString str = "hello nihao";//返回的才是 StringBuffer 对象, 对 str 本身没有影响//方法1:构造器StringBuffer stringBuffer = new StringBuffer(str);//hello nihaoSystem.out.println("str=" + str);System.out.println("strBuffer=" + stringBuffer);//方法2:append方法StringBuffer stringBuffer1 = new StringBuffer();System.out.println("strBuffer1=" + stringBuffer1);//空串stringBuffer1 = stringBuffer1.append(stringBuffer);//hello nihaoSystem.out.println("strBuffer1=" + stringBuffer1);//StringBuffer转StringStringBuffer stringBuffer2 = new StringBuffer("hello 111");//方法1:StringBuffer的toStringString string = stringBuffer2.toString();//方法2:构造器String string1 = new String(stringBuffer2);}

2.2 StringBuffer常见方法

  1. append( ):增。
  2. delete( ):删。
  3. replace( ):改。
  4. insert( ):插。
  5. indexOf( ):查。
public class StringBufferMethod {public static void main(String[] args) {StringBuffer s = new StringBuffer("hello");//增,appends.append(',');// "hello,"s.append("小明");//"hello,小明"s.append(",").append(100).append(true).append(10.5);System.out.println(s);//"hello,小明,100true10.5"//删//删除索引为>=start && <end 处的字符//删除 2~4 的字符 [2, 4)s.delete(2, 4);System.out.println(s);//"heo,小明,true10.5"//改//使用 王大大红 替换 索引 4-8 的字符 [4,8)s.replace(4, 8, "王大红");System.out.println(s);//"heo,王大红00true10.5"//插//在索引为 4 的位置插入 "小明和",原来索引为 4 的内容自动后移s.insert(4, "小明和");System.out.println(s);//"heo,小明和王大红00true10.5"//查//找指定的子串在字符串第一次出现的索引, 如果找不到返回-1int indexOf = s.indexOf("王大");System.out.println(indexOf);//4System.out.println("len=" + s.length());//20}
}

一些小源码:

/*** @ClassName StringBufferNullTest* @Description 一些StringBuffer的小案例* @Date 2024/12/1 10:32* @Version V1.0*/
public class StringBufferNullTest {public static void main(String[] args) {String str = null;StringBuffer sb = new StringBuffer();//'StringBuffer sb' may be declared as 'StringBuilder'/*底层源码:@IntrinsicCandidatepublic StringBuffer() {super(16);}super源码是:AbstractStringBuilder(int capacity) {if (COMPACT_STRINGS) {value = new byte[capacity];coder = LATIN1;} else {value = StringUTF16.newBytesFor(capacity);coder = UTF16;}}*/sb.append(str);System.out.println(sb.length());//4System.out.println(sb);//null//下面代码报异常://Cannot invoke "String.length()" because "str" is null//    AbstractStringBuilder(String str) {//        int length = str.length();但是null没有方法可以调用StringBuffer sb1 = new StringBuffer(str);//        System.out.println(sb1);}
}

一个小场景:

    public static void main(String[] args) {String price = "2746358998.98";StringBuffer sb = new StringBuffer(price);//将小数点前,每三位加一个逗号。如:2,746,358,998.98//1、找到小数点位置index,然后index-3for(int i=sb.lastIndexOf(".")-3;i>0;i-=3){sb=sb.insert(i,",");}System.out.println(sb);//2,746,358,998.98}

3 StringBuilder类

也是可变字符序列,提供了与StringBuffer兼容的API,答案是不保证同步(线程不安全),被设计为StringBuffer的简易替换,用在字符串缓冲区被单线程使用的时候。比StringBuffer要快。

主要操作是append和insert,可以重载以接收任意的数据类型。

1. StringBuilder 继承 AbstractStringBuilder 类 
2. 实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件) 3. StringBuilder 是 final 类, 不能被继承 
4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value; 因此, 字符序列是堆中 
5. StringBuilder 的方法, 没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用StringBuilder
6. StringBuilder stringBuilder = new StringBuilder();


3.1 StringBuilder常用方法

与StringBuffer一样,所以主要看看源码在干什么即可。


3.2 三者使用比较

StringBuffer和StingBuilder很类似,均是可变字符串,方法也一样。单线程用Builder。

String:不可变字符串,效率低,复用率高。

StringBuffer:可变字符串序列,效率较高,线程安全。

StingBuilder:可变字符串序列,效率最高但是线程不安全。

我们知道String的修改实际上是创建新的对象,导致产生大量的副本,性能低;所以,如果要对字符串做大量修改,不用String。

 效率比较:Builder > Buffer > String

package IntegerTest;/*** @ClassName Effective* @Description 三者效率比较,拼接5w次字符串* @Date 2024/12/1 11:18* @Version V1.0*/
public class Effective {public static void main(String[] args) {long starTime = 0L;long endTime = 0L;StringBuilder builder = new StringBuilder("");starTime = System.currentTimeMillis();for(int i=0;i<50000;i++){builder.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuilder拼接时间为:"+(endTime-starTime)+"ms");StringBuffer buffer = new StringBuffer("");starTime = System.currentTimeMillis();for(int i=0;i<50000;i++){buffer.append(String.valueOf(i));}endTime = System.currentTimeMillis();System.out.println("StringBuffer拼接时间为:"+(endTime-starTime)+"ms");starTime = System.currentTimeMillis();String string = "";for(int i=0;i<50000;i++){string+=i;}endTime = System.currentTimeMillis();System.out.println("String 拼接时间为:"+(endTime-starTime)+"ms");}
}

 结论:如果字符串需要多次修改,单线程用Builder,多线程用Buffer;很少修改,被多个对象引用用String,如配置文件。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…

LabVIEW将TXT文本转换为CSV格式(多行多列)

在LabVIEW中&#xff0c;将TXT格式的文本文件内容转换为Excel格式&#xff08;即CSV文件&#xff09;是一项常见的数据处理任务&#xff0c;适用于将以制表符、空格或其他分隔符分隔的数据格式化为可用于电子表格分析的形式。以下是将TXT文件转换为Excel&#xff08;CSV&#x…

CENet及多模态情感计算实战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

共享售卖机语音芯片方案选型:WTN6020引领智能化交互新风尚

在共享经济蓬勃发展的今天&#xff0c;共享售卖机作为便捷购物的新形式&#xff0c;正逐步渗透到人们生活的各个角落。为了提升用户体验&#xff0c;增强设备的智能化和互动性&#xff0c;增加共享售卖机的语音功能就显得尤为重要。 共享售卖机语音方案选型&#xff1a; WTN602…

云备份实战项目

文章目录 前言一、整体项目简介二、服务端环境及功能简介三、 客户端环境及功能简介四、服务端文件管理类的实现1. 获取文件大小&#xff0c;最后一次修改时间&#xff0c;最后一次访问时间&#xff0c;文件名称&#xff0c;以及文件内容的读写等功能2. 判断文件是否存在&#…

【Linux】死锁、读写锁、自旋锁

文章目录 1. 死锁1.1 概念1.2 死锁形成的四个必要条件1.3 避免死锁 2. 读者写者问题与读写锁2.1 读者写者问题2.2 读写锁的使用2.3 读写策略 3. 自旋锁3.1 概念3.2 原理3.3 自旋锁的使用3.4 优点与缺点 1. 死锁 1.1 概念 死锁是指在⼀组进程中的各个进程均占有不会释放的资源…

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注&#xff08;Sequence Tagging&#xff09;二、命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&#xff09;**命名实体识别的作用****命名实体识别的常见实体类别** &#xff1a; 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…

设计模式学习[10]---迪米特法则+外观模式

文章目录 前言1. 迪米特法则2. 外观模式2.1 原理阐述2.2 举例说明 总结 前言 之前有写到过 依赖倒置原则&#xff0c;这篇博客中涉及到的迪米特法则和外观模式更像是这个依赖倒置原则的一个拓展。 设计模式的原则嘛&#xff0c;总归还是高内聚低耦合&#xff0c;下面就来阐述…

JUnit介绍:单元测试

1、什么是单元测试 单元测试是针对最小的功能单元编写测试代码&#xff08;Java 程序最小的功能单元是方法&#xff09;单元测试就是针对单个Java方法的测试。 2、为什么要使用单元测试 确保单个方法运行正常&#xff1b; 如果修改了代码&#xff0c;只需要确保其对应的单元…

用Transformers和FastAPI快速搭建后端算法api

用Transformers和FastAPI快速搭建后端算法api 如果你对自然语言处理 (NLP, Natural Language Processing) 感兴趣&#xff0c;想要了解ChatGPT是怎么来的&#xff0c;想要搭建自己的聊天机器人&#xff0c;想要做分类、翻译、摘要等各种NLP任务&#xff0c;Huggingface的Trans…

架构师:Dubbo 服务请求失败处理的实践指南

1、简述 在分布式服务中,服务调用失败是不可避免的,可能由于网络抖动、服务不可用等原因导致。Dubbo 作为一款高性能的 RPC 框架,提供了多种机制来处理服务请求失败问题。本文将介绍如何在 Dubbo 中优雅地处理服务请求失败,并结合具体实践步骤进行讲解。 2、常见处理方式 …

shell语法(1)bash

shell是我们通过命令行与操作系统沟通的语言&#xff0c;是一种解释型语言 shell脚本可以直接在命令行中执行&#xff0c;也可以将一套逻辑组织成一个文件&#xff0c;方便复用 Linux系统中一般默认使用bash为脚本解释器 在Linux中创建一个.sh文件&#xff0c;例如vim test.sh…

探索文件系统,Python os库是你的瑞士军刀

文章目录 探索文件系统&#xff0c;Python os库是你的瑞士军刀第一部分&#xff1a;背景介绍第二部分&#xff1a;os库是什么&#xff1f;第三部分&#xff1a;如何安装os库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…

Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算

论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …

FTP介绍与配置

前言&#xff1a; FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 介绍 FTP的应用 在企业网络中部署一台FTP服务器&#xff0c;将网络设备配置为FTP客户端&#xff0c;则可以使用FTP来备份或更新VRP文件和配置文件…

DDD领域应用理论实践分析回顾

目录 一、DDD的重要性 &#xff08;一&#xff09;拥抱互联网黑话&#xff08;抓痛点、谈愿景、搞方法论&#xff09; &#xff08;二&#xff09;DDD真的重要吗&#xff1f; 二、领域驱动设计DDD在B端营销系统的实践 &#xff08;一&#xff09;设计落地步骤 &#xff0…

【聚类】K-Means 聚类(无监督)及K-Means ++

1. 原理 2. 算法步骤 3. 目标函数 4. 优缺点 import torch import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA import torch.nn as nn# 数据准备 # 生成数据&#xff1a;100 个张量&#xff0c…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题&#xff0c;一个对象或者变量没有初始状态&#xff0c;对其使用后果是未知&#xff0c;同样的使用完一个对象或者变量&#xff0c;没有及时清理&#xff0c;也会造成一定的安全问题 构造函数&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 &#xff08;一&#xff09;网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

【最新鸿蒙开发——应用导航设计】

大家好&#xff0c;我是小z&#xff0c;不知道大家在开发过程中有没有遇到模块间跳转的问题&#xff0c;今天给大家分享关于模块间跳转的三种方法 文章目录 1. 命名路由&#xff08;ohos.router)使用步骤 2. 使用navigation组件跳转。步骤缺点 3. 路由管理模块1. 路由管理模块…