Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)
Java---第八章
- 字符串
- String
- 字符串的常用方法
- StringBuilder和StringBuffer
- 常用方法
- 对比String 和StringBuilder 和 StringBuffer
字符串
String
特性:
- String 类位于java.lang包中,无需引入,可直接使用
- String 类是由final修饰的,表示String 类是一个最终类,不能被继承
- String 类构建的对象不可再被更改
package org.device.Device;public class DeviceTest {public static void main(String[] args) {//当使用一个字面量给字符串赋值的时候,首先会去字符串常量池里检测是否//存在其字面量,如果存在//则直接使用这个字面量的地址赋值即可,如果不存在,//则需要在字符串常量池中创建这个字面量,然后//再将地址赋值过去String s = "超用心";s += "在线学习";//这里的字符串拼接发生在堆内存上System.out.println(s);}
}
常见的构造方法:
public String(String original);public String(char value[]);public String(char value[],int offset,int count);public String(byte bytes[]);public String(byte bytes[].int offset,int length);public String(byte bytes[],Charset charset);//字符集
分别解释:
public String(String original);public static void main(String[] args) {String s = "超用心在线学习";System.out.println(s);//这里会创建两个对象,一个是字面量会在常量池中创建一个对象//另一个是new String()构造方法创建出来的对象String s1 = new String("超用心在线学习");System.out.println(s1);}
}
上面有String s = “超用心学习”,下面再创建就会先去常量池里查找,发现有一个,然后只创建一个堆内存对象
public String(char value[]);public String(char value[],int offset,int count);public static void main(String[] args) {char[] values = {'a','d','m','i','n'};String s2 = new String(values);System.out.println(s2);String s3 = new String(values,1,3);//跳过1个,再继续输出3个System.out.println(s3);}
输出:
admin
dmi
public String(byte bytes[]);public String(byte bytes[].int offset,int length);public static void main(String[] args) {byte[] bytes = {97,98,99,100,101,102};String s4 = new String(bytes);System.out.println(s4);String s5 = new String(bytes,2,3);System.out.println(s5);}
输出:
abcdef
cde
字节可以存储整数,字符也可以用整数表示,这个整数就是ASCII码对应的整数值
public String(byte bytes[],Charset charset);//字符集public static void main(String[] args) {byte[] bytes = {97,98,99,100,101,102};Charset charset= Charset.forName("UTF-8");String s6 = new String(bytes,charset);//bytes编码为UTF-8System.out.println(s6);}
字符串的常用方法
获取长度:
public int length();//获取字符串长度
举例:
public static void main(String[] args) {String s1 = "超用心学习";int length = s1.length();System.out.println(length);}
字符串比较:
public boolean equals(Object anObject);//比较两个字符串是否相等public boolean equalsIgnoreCase(String anotherString);
//忽略大小比较两个字符串是否相等
举例:
字符串之间比较时,首先会看两个字符串的长度是否相等,如果相等,再看其中每个字符是否相等
public static void main(String[] args) {String s2 = "abc";String s3 = "abc";String s4 = "ABC";System.out.println(s2.equals(s3));System.out.println(s2.equals(s4));System.out.println(s2.equalsIgnoreCase(s4));}
字符串大小写转换:
public String toLowerCase();//转换成小写public String toUpperCase();//转换成大写
举例:
public static void main(String[] args) {String s2 = "abc";String s4 = "ABC";String s5 = s2.toUpperCase();System.out.println(s5);String s6 = s4.toLowerCase();System.out.println(s6);}
获取字符在字符串中的下标:
public int indexof( int ch);//获取指定字符在字符串中第一次出现的下标public int lastIndexof(int ch);//获取指定字符在字符串中最后一次出现的下标
获取字符串在字符串中的下标:
public int indexof(String str);//获取指定字符串在字符串中第一次出现的下标public int lastIndexof(String str);//获取指定字符串在字符串中最后一次出现的下标
获取字符串中的指定下标的字符:
public char charAt(int index);
举例:
public static void main(String[] args) {String s = "kliy@aliyun.com";int index1 = s.indexOf("@");//打印该字符串中第一个@的下标System.out.println(index1);int index2 = s.lastIndexOf("@");//打印该字符串中最后一个@的下标System.out.println(index2);int index3 = s.indexOf(".");int index4 = s.lastIndexOf(".");boolean case1 = (index1 == index2);boolean case2 = (index3 == index4);boolean case3 = (index3 - index2 > 1);boolean case4 = (index1 > 0 && index4 < s.length());if(case1 && case2 && case3 && case4){System.out.println("字符串"+s+"是一个邮箱地址");}System.out.println(s.charAt(0));//k}
字符串截取:
public String substring(int beginIndex);//从指定开始位置截取字符串,直到字符串末尾public String substring(int beginIndex,int endIndex);
//从指定开始位置到指定结束位置截取字符串
示例:
字符串截取,截取时使用左闭右开区间 [0,4)
public static void main(String[] args) {String s = "Java是一门非常高深的语言";String sub1 = s.substring(0,4);System.out.println(sub1);String sub2 = s.substring(7);System.out.println( sub2);}
输出:
Java
非常高深的语言
字符串替换:
public String replace(char oldChar,char newChar);
//使用新的字符替换字符串中旧的字符public String replace(CharSequence target,CharSequence replacement);
//使用替换的字符串来替换字符串中的字符串public String replaceAll(String regex,String replacement);
//使用替换的字符串来替换字符串中满足正则表达式的字符串
示例:
public static void main(String[] args) {String s = "hello world";String s1 = s.replace('o','a');System.out.println(s1);String s2 = s.replace("o","a");System.out.println(s2);String info = "a1b2c3d4";//regular expresssion 正则表达式//三至五位数字的正则表达式//[1-9][0-9]{2,4}//英文字符串的正则表达式//[a-zA-Z]+//+ 表示任意长度String result = info.replaceAll("[0-9]","");//把其字符串中的数字替换成空}
获取字符数组:
public char[] toCharArray();
获取字节数组:
public byte[] getBytes();.//获取字节数组public byte[] getBytes(Charset cahrset);//获取指定编码下的字节数组
示例:
public static void main(String[] args) {String s = "my god";char[] values = s.toCharArray();for(int i=0;i<s.length();i++){System.out.println(values[i]);}byte[] bytes = s.getBytes();for(int i=0;i<bytes.length;i++){System.out.println(bytes[i]);}byte[] bytes1 = s.getBytes(Charset.forName("GB2312"));System.out.println(bytes1);}
字符串拼接:
public String concat(String str);//将字符串追加到末尾
去除字符串两端的空白字符:
public String trim();
示例:
public static void main(String[] args) {String s1 = "Hello";String s2 = "World";String s3 = s1 + s2;System.out.println(s3);String s4 = s1.concat(s2);System.out.println(s4);String s5 = " ab cd ";String s6 = s5.trim();//将字符串两端空格剪掉System.out.println(s6);}
字符串分割:
public String[] split(String regex);//将字符串按照匹配的正则表达式分割
字符串匹配正则表达式:
public boolean matches(String regex);//检测字符串是否匹配给定的正则表达式
示例:
public static void main(String[] args) {String s = "a1b2c3d4";String[] arr = s.split("[0-9]");for(int i=0;i<arr.length;i++){System.out.println(arr[i]);}String personInfo = "刘德华,男,53,很帅气";String[] arr1 = personInfo.split(",");for(int i=0;i<arr1.length;i++){System.out.println(arr1[i]);}String regex = "[a-z0-9]+";boolean match = s.matches(regex);System.out.println(match);}
不得不提到的intern()方法:
public native String intern();
示例:
public static void main(String[] args) {String s1 = "超用心";String s2 = "在线学习";String s3 = s1 + s2;String s4 = "超用心在线学习";System.out.println(s3 == s4);//false//将字符串s3放入常量池,放入时会先检测常量池中是否存在s3字符串,//如果s3已经存在了,s5就直接使用s3的字符串地址即可,//若不存在,就在常量池中创建字符串s3String s5 = s3.intern();System.out.println(s5 == s4);//true}
StringBuilder和StringBuffer
特性介绍:
- 位于Java.lang包中,无需引入,可以直接使用
- 是由final修饰的,表示一个最终类,不可以被继承
- 所构建的对象可以实现字符序列的追加,但不会产生新的对象,只是将这个字符序列保存在字符数组中
构造方法:
以StringBuilder为例,这两个都一样的
public StringBuilder();//构建一个StringBuilder对象,默认容量为16public StringBuilder(int capacity);//构建一个StringBuilder对象并指定初始化容量public StringBuilder(String str);
//构建一个StringBuilder对象,并将指定的字符串存储在其中
示例:
public static void main(String[] args) {StringBuilder sb1 = new StringBuilder();StringBuilder sb2 = new StringBuilder(1024);StringBuilder sb3 = new StringBuilder("超用心学习");}
常用方法
追加:
public StringBuilder append(String str);//将一个字符串添加到StringBuilder存储区public StringBuilder append(StringBuffer sb);
//将StringBuffer存储的内容添加到StringBuffer存储区中
示例:
public static void main(String[] args) {StringBuilder sb1 = new StringBuilder(1024);sb1.append("超用心学习");sb1.append(1);sb1.append(1.0);sb1.append(true);sb1.append('a');System.out.println(sb1);}
输出:
超用心学习11.0truea
删除指定区间存储的内容:
public StringBuilder delete (int start,int end);
//将StringBuilder存储区指定的开始位置到指定的结束位置直接的内容删除
删除存储区指定下标位置存储的字符:
public StringBuilder deleteCharAT(int index);
示例:
public static void main(String[] args) {StringBuilder builder = new StringBuilder("abcdefg");builder.delete(1,5);//区间(1,5),不包括1和5System.out.println(builder);//afgbuilder.deleteCharAt(0);System.out.println(builder);//fg}
在StringBuilder存储区指定偏移位置处插入指定的字符串:
public StringBuilder insert(int offset,String str);
将存储区的内容倒序:
public StringBuilder reverse();
示例:
public static void main(String[] args) {StringBuilder builder = new StringBuilder("admine");builder.reverse();System.out.println(builder);//enimdabuilder.insert(2,",");System.out.println(builder);//en,imda//需要注意的是:length()方法返回的是char[]中使用的数量System.out.println(builder.length());//6}
获取指定字符串在存储区中的位置:
public int indexof(String str);//获取指定字符串在存储区中第一次出现的位置public int lastIndexof(String str);//获取指定字符串在存储区中最后一次出现的位置
例题:
将从控制台输入的数字转换成财务数字(101,111,001.25)(使用StringBuilder完成)
public static void main(String[] args) {//将从控制台输入的数字转换成财务数字(101,111,001.25)//(使用StringBuilder完成)Scanner sc = new Scanner(System.in);System.out.println("请输入一串数字:");double money = sc.nextDouble();StringBuilder builder = new StringBuilder();builder.append(money);int index = builder.indexOf(".");//打印.的下标if(index>3){for (int i=index-3;i>0;i-=3){builder.insert(i,".");}}System.out.println(builder.toString());}
对比String 和StringBuilder 和 StringBuffer
都是用来处理字符串的,在处理少量字符串的时候,它们之间的处理效率几乎没有任何区别,但是处理大量字符串时,
由于String类的对象不可更改,因此在处理字符串会产生新的对象,对内存消耗较大。
StringBuilder和StringBuffer使用的是对字符串的字符数组内容进行拷贝,不会产生新的对象,因此效率较高。
而StringBuffer为了保证在多线程情况下字符数组中的内容正确使用,在每个成员方法上面加了锁,有锁就会增加消耗,因此StringBuffer在处理效率上低于StringBuilder
相关文章:

Java---第八章(字符串-----String,StringBuilder 和 StringBuffer)
Java---第八章 字符串String字符串的常用方法StringBuilder和StringBuffer常用方法 对比String 和StringBuilder 和 StringBuffer 字符串 String 特性: String 类位于java.lang包中,无需引入,可直接使用String 类是由final修饰的ÿ…...
k8s集群的部署
【1】安装docker systemctl enable docker所有节点均需要安装docker,并且使其开机自启,每个节点均部署镜像加速器 【2】配置k8s的yum文件 [rootk8s1 ~]# cd /etc/yum.repos.d/ [rootk8s1 yum.repos.d]# vim k8s.repo [rootk8s1 yum.repos.d]# cat k8s.repo [k8s…...

设计模式——观察者模式
文章目录 1 概述2 实现3 总结 1 概述 观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸&am…...

在Debian 12 上安装 PHP 5.6, 7.4
环境:Debian 12 Debian 12 默认的PHP版本为 8.2 如果直接安装php7.4就出现下面的报错: sudo apt-get install libapache2-mod-php7.4 php7.4 php7.4-gd php7.4-opcache php7.4-mbstring php7.4-xml php7.4-json php7.4-zip php7.4-curl php7.4-imap p…...

微服务——统一网关Getway
为什么需要网关? 网关的两种实现: 网关Getway——快速入门 步骤一 网关背身也是一个微服务,需要注册到nacos中去 步骤二 成功运行后 可以通过网关进行请求转发到对应服务。 流程如下: 路由断言工厂 网关路由可以配置的东西有如下。 spri…...

[ELK安装篇]:基于Docker虚拟容器化(主要LogStash)
文章目录 一:前置准备-(参考之前博客):1.1:准备Elasticsearch和Kibana环境:1.1.1:地址:https://blog.csdn.net/Abraxs/article/details/128517777 二:Docker安装LogStash(数据收集引擎ÿ…...

纪录片《打铁文艺社》:从全美高中生电影节到多项国际赞誉,聚焦城市公共艺术的蜕变之路
7月21日,在全美高中生电影节(All American High School Film Festival,AAHSFF)公布的入围名单中,一部取材于中国深圳的纪录片《打铁文艺社Datie: The Art Tribe of Tiegang》以其深刻的主题和精良的制作,引…...

VLAN---虚拟局域网
VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后,将原本的一个广播域逻辑上,拆 分为多个虚拟的广播域。 VLAN配置: 1.创建VLAN VID—VLAN ID------用来区分和…...

新的CoolSiC™槽沟MOSFET技术,用于低栅氧化物应力和高性能
标题:The new CoolSiC™ Trench MOSFET Technology for Low Gate Oxide Stress and High Performance UPS(Uninterruptible Power Supply)系统也称不间断电源系统,是一种能够提供电力备用的设备,当主电源出现故障或停…...

【开源项目】低代码数据可视化开发平台-Datav
Datav 基本介绍 Datav是一个Vue3搭建的低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可完成业务需求。 它的技术栈为:Vue3 TypeScript4 Vite2 ECharts5 Axios Pinia2 在线预览 账号: admin 密码: 123123预…...

【自动话化运维】Ansible常见模块的运用
目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1.command 模块3.2.shell 模块3.3.cron 模块3.4.user 模块3.5.group 模块3.6.copy 模块3.7.file 模块8ÿ…...
深入理解C语言中的字符指针初始化与用法
字符指针初始化 - C 语言详解 目录 1. 介绍 2. 字符指针初始化的基础 3. 使用 const 关键字的字符指针初始化 4. C 语言与 C 在字符指针初始化的差异 5. 常见陷阱与最佳实践 6. 进阶概念:指针算术与动态内存分配 7. 字符串函数与字符指针 8. 结论介绍 在 C 语言中…...

es添加索引命令行和浏览器添加索引--图文详解
一、添加索引 创建索引 curl -X PUT "localhost:9200/my-index-00001?pretty" 获取索引 curl -X GET "localhost:9200/my-index-000001?pretty" 获取全部的索引 curl -X GET "http://localhost:9200/_cat/indices?v" 获取索引映射 cur…...

Java 大数字运算之 BigDecimal 类
在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算,其中 BigInteger 类是针对整型大数字的处理类,而 BigDecimal 类是针对大小数的处理类。今天主要讲一下 BigDecimal 类 …...
MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)
文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-架构考点1:二进制日志文件(Binary log)MySQL二进制日志(Binary log)二进制日志文件的相关配置二进制日志文件的相关参数的说明二进制日志的格式设置二进制日志的格式 二进制…...
MY.CNF
# [client] port 3306 socket /var/lib/mysql/mysql.sock [mysql] prompt "\umysqldb \R:\m:\s [\d]> " no_auto_rehash loose-skip-binary-as-hex [mysqld] user mysql port 3306 #主从复制或MGR集群中,server_id记得要不同 #另外…...

SpringBoot IOC与AOP(一)
IOC AOP 一、 分层解耦 内聚: 软件中各个功能模块内部的功能联系 耦合: 衡量软件中各个层/模块之间的依赖、关联的程度 软件设计原则:高内聚、低耦合 控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到…...
JVM运行时数据区——方法区的垃圾回收
方法区的垃圾回收主要是两部分:运行时常量池中废弃的常量和不在使用的类。 类卸载(将不在使用的类回收)的条件: 该类的所有实例均被回收。 加载该类的类加载器被回收(一般很难满足)。 类对象不再引用,通过反射也获取不到。...

LeetCode213.House-Robber-II<打家劫舍II>
题目: 思路: 在版本一中增加了一个条件 那就是首尾相关联。那么只需要进行两次循环即可。 第一次是循环是偷第一家的 那么循环到n-1 截至 并且保存一个cmp 第二次循环是不偷第一家的 循环到n截至。然后比较cmp 与 dp [n] 的最大值即可。 代码是&#…...
订单系统问题汇总
1、项目启动失败 原因是pom中既配置了mybatis又配置了mybatis-plus 2、idea连接后提示缺少MySQL驱动,直接根据提示安装就好 3、解析请求得到的json为对象时候报错,待解析的对象是泛型对象 String regionsInfo OkHttpRequestUtils.sendGetRequest(new…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...