Java奠基】玩转字符串从基础到高级的操作技巧

目录

初识String

StringBuilder

StringJoiner

字符串原理

综合练习


初识String

java.lang.String 类代表字符串,Java程序中的所有字符串文字(例如“abc”)都为此类的对象,例:

String name = "张三"

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在,如果不存在就创建,如果存在则复用原地址。

注意:字符串的内容是不会发生改变的,它的对象在创建后不能被更改。创建对象有两种方式,一种就是上面的直接赋值方式,另一种就是通过下面 new 的方式:

构造方法说明
public String()创建空白字符串,不含任何内容
public String(String original)根据传入的字符串,创建字符串对象
public String(char[] chs)根据字符数组,创建字符串对象
public String(byte[] chs)根据字节数组,创建字符串对象

字符串的创建:以下是通过new关键字创建字符串的相关方法:

public class StringDemo {public static void main(String[] args) {// 使用new的方式来获取一个字符串对象// 空参构造:可以获取一个空白的字符串对象String s1 = new String();System.out.println("@"+s1+"!"); // ""// 传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象String s2 = new String("abc");System.out.println(s2);// 传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象char[] chs = { 'a', 'b', 'c', 'd' };String s4 = new String(chs);System.out.println(s4);// 传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象byte[] bytes = { 97, 98, 99, 100 };String s5 = new String(bytes);System.out.println(s5); // 查找scall表中的数据}
}

字符串的比较:关于字符串的比较有以下两个注意点:

public class StringDemo {public static void main(String[] args) {// 基本数据类型比较的是数据值int a = 10;int b = 10;System.out.println(a == b); // true// 引用数据类型比较的是地址值String s1 = new String("abc");String s2 = new String("abc");String s3 = "abc";System.out.println(s1 == s2); // falseSystem.out.println(s1 == s3); // false}
}

关于字符串的比较这里也可以采用相应的API进行使用:

public class StringDemo {public static void main(String[] args) {// 创建两个字符串对象String s1 = new String("abc");String s2 = "abc";String s3 = "Abc";// 比较字符串对象中的内容是否相等boolean result1 = s1.equals(s2);System.out.println(result1); // true// 比较字符串中的内容是否相等,忽略大小写boolean result2 = s1.equalsIgnoreCase(s3);System.out.println(result2); // true}
}

这里我们通过如下的登录账号密码的案例加深对上面的理解学习:

public class StringDemo {public static void main(String[] args) {// 定义两个变量记录正确用户名和密码String rightUsername = "zhangsan";String rightPassword = "123456";// 键盘录入用户名和密码Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("请输入用户名:");String username = sc.next();System.out.println("请输入密码:");String password = sc.next();// 比较if (username.equals(rightUsername) && password.equals(rightPassword)) {System.out.println("用户登录成功!");break;} else {if (i == 2) {System.out.println("账号"+ username+"被锁定,请联系管理员");} else {System.out.println("用户登录失败,用户名或密码错误! 您还剩下"+(2 - i)+"次机会");}}}}
}

效果如下所示:

字符串的遍历:关于字符串的遍历可以通过如下的方式进行:

public class StringDemo {public static void main(String[] args) {// 键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();// 进行遍历for (int i = 0; i < str.length(); i++) {// i 依次表示字符串的每一个索引char c = str.charAt(i);System.out.println(c);}}
}

字符串统计:统计字符串中大小写字母字符数字字符出现的次数:

public class StringDemo {public static void main(String[] args) {// 键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();// 定义三个计数器int bigCount = 0;int smallCount = 0;int numberCount = 0;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (c >= 'a' && c <= 'z') { // char类型的变量参与计算的时候自动类型提升为int,查询ascii码表smallCount++;} else if (c >= 'A' && c <= 'Z') {bigCount++;} else if(c >= '0' && c <= '9') {numberCount++;}}// 输出打印System.out.println("小写字母有:" + smallCount + "个");System.out.println("大写字母有:" + bigCount + "个");System.out.println("数字字母有:" + numberCount + "个");}
}

字符串的拼接:可以通过如下案例操作实现字符串的拼接:

public class StringDemo {public static void main(String[] args) {int[] arr = {1, 2, 3};String str = arrToString(arr);System.out.println(str);}public static String arrToString(int[] arr) {if (arr == null) return "";if (arr.length == 0) return "[]";String result = "[";for (int i = 0; i < arr.length; i++) {if (i == arr.length - 1) {result = result + arr[i];} else {result = result + arr[i] + ", ";}}// 此时拼接右括号result = result + "]";return result;}
}

字符串的反转:关于字符串的反转,我们可以定义如下函数进行操作:

public class StringDemo {public static void main(String[] args) {String result = reverser("abc");System.out.println(result); // cba}public static String reverser(String str) {String result = "";for (int i = str.length() - 1; i >= 0; i--) {char c = str.charAt(i);result = result + c;}return result;}
}

下面是一个字符串相关转换拼接的案例:

import java.util.Scanner;public class StringDemo {public static void main(String[] args) {// 键盘录入一个金额Scanner sc = new Scanner(System.in);int money;while (true) {System.out.println("请输入一个金额");money = sc.nextInt();if (money >= 0 && money <= 9999999) {break;} else {System.out.println("金额无效");}}// 定义一个变量用来表示钱的大写String moneyStr = "";// 得到money中的每一位数字while (true) {// 从右往左获取数据,因为右侧是数据的个位int ge = money % 10;String capitalNUmber = getCapitalNumber(ge);// 把转换之后的大写拼接到moneyStr当中moneyStr = capitalNUmber + moneyStr;// 去掉刚刚获取到的数据money = money / 10;// 如果数字上的每一位都获取到了,那么money记录的就是0,此时循环结束if (money == 0) break;}// 在前面补0,补7位int count = 7 - moneyStr.length();for (int i = 0; i < count; i++) {moneyStr = "零" + moneyStr;}// 插入单位String[] arr = { "佰", "拾", "万","仟", "佰", "拾", "元" };// 遍历moneyStr,依次把插入单位插入到对应的moneyStr位置上String result = "";for (int i = 0; i < moneyStr.length(); i++) {char c = moneyStr.charAt(i);result = result + c + arr[i];}// 打印最终结果System.out.println(result);}// 定义一个方法把数字变成大写的中文public static String getCapitalNumber(int number) {// 定义数组,让数字跟大写的中文产生一个对应关系String[] arr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌" };// 返回结果return arr[number];}
}

StringBuilder

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的。作用是提高字符串的操作效率。因为StringBuilder是Java已经写好的类,java在底层对他做了一些特殊处理,打印对象不是地址值而是属性值。

以下是StringBuilder的构造方法:

方法名说明
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

以下是StringBuilder的成员方法:

通过如下的代码案例进行理解:

public class StringDemo {public static void main(String[] args) {// 创建对象StringBuilder str = new StringBuilder("abc");// 添加元素str.append(1);str.append(1.2);str.append(true);System.out.println(str);str.reverse(); // 反转System.out.println(str);// 使用完 StringBuilder 工具之后,再把StringBuilder变回字符串String Str = str.toString();System.out.println(Str);}
}

StringJoiner

StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。其作用是提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。在JDK8开始出现:

以下是StringJoiner的构造方法:

方法名说明
public StringJoiner (间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号

以下是StringJoiner的成员方法: 

方法名说明
public StringJoiner add (添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串 (该字符串就是拼接之后的结果)

通过如下的代码案例进行理解:

import java.util.StringJoiner;public class StringDemo {public static void main(String[] args) {// 创建一个对象,并指定中间的间隔符号StringJoiner sj = new StringJoiner("---", "[", "]");// 添加元素sj.add("aaa").add("bbb").add("ccc");// 打印结果System.out.println(sj);}
}

字符串原理

关于字符串的原理我们需要掌握以下几个概念:

字符串存储的内存原理

直接赋值会复用字符串常量池中的,而new出来不会复用,而是开辟一个新的空间

==号比较的到底是什么?

基本数据类型比较数据值,而引用数据类型比较地址值

字符串拼接的底层原理

拼接的时候没有变量,都是字符串;触发字符串的优化机制,在编译的时候就已经是最终的结果了。

在拼接的时候有变量,JDK8以前底层会使用StringBuilder,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。

StringBuilder提高效率原理图

字符串拼接的时候,如果有变量:

JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象。

JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。

综合练习

转换罗马数字:题目要求如下:

键盘录入一个字符串

要求1:长度为小于等于9

要求2:只能是数字将内容变成罗马数字下面是阿拉伯数字跟罗马数字的对比关系:

I-1、II-2、III-3、IV-4、V-5、VI-6、VIl-7、Vl-8、Ix-9

注意点:

罗马数字里面是没有0的,如果键盘录入的数字包含0,可以变成”"(长度为0的字符串)

import java.util.Scanner;public class StringDemo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str;while (true) {// 键盘录入一个字符串System.out.println("请输入一个字符串:");str = sc.next();// 校验字符串是否满足规则boolean flag = checkStr(str);if (flag) {break;} else {System.out.println("当前的字符串不符合规则,请重新输入!");continue;}}// 将内容变成罗马数字StringBuilder sb = new StringBuilder();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);int number = c - 48;String result = changeLuoMa(number);sb.append(result + ", ");}System.out.println(sb);}public static String changeLuoMa(int number) {// 定义一个数组,让索引跟罗马数字产生对应关系String[] arr = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VI", "IX" };return arr[number];}public static boolean checkStr(String str) {if (str.length() > 9) return false; // 长度小于9for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (c < '0' || c > '9') return false;}return true;}
}

调整字符串:题目要求如下:

给定两个字符串,A和 B。

A 的旋转操作就是将 A最左边的字符移动到最右边。

例如,若A='abcde',在移动一次之后结果就是'bcdea′。

如果在若干次调整操作之后,A能变成B,那么返回True,如果不能匹配成功,则返回false。

public class StringDemo {public static void main(String[] args) {// 定义两个字符串String strA = "abcde";String strB = "cdeab";// 调用方法进行比较boolean result = check(strA, strB);// 输出结果System.out.println(result);}public static boolean check(String strA, String strB) {for (int i = 0; i < strB.length(); i++) {strA = rotate(strA);if (strA.equals(strB)){return true;}}return false;}// 旋转字符串,把最左侧的字符,变成到最右侧// 形参是旋转前的字符串,返回值是旋转后的字符串public static String rotate(String str) {// 截取思路char first = str.charAt(0); // 获取最左侧字符String end = str.substring(1); // 获取剩余字符return end + first;}
}

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

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

相关文章

Atcoder ABC338 F - Negative Traveling Salesman

Negative Traveling Salesman&#xff08;消极的旅行推销员&#xff09; 时间限制&#xff1a;6s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】…

计算机网络——08应用层原理

应用层原理 创建一个新的网络 编程 在不同的端系统上运行通过网络基础设施提供的服务&#xff0c;应用进程批次通信如Web Web服务器软件与浏览器软件通信 网络核心中没有应用层软件 网络核心没有应用层功能网络应用只能在端系统上存在 快速网络应用开发和部署 网络应用…

lv15 平台总线框架及案例 2

一、总线、设备、驱动 硬编码式的驱动开发带来的问题&#xff1a; 垃圾代码太多 结构不清晰 一些统一设备功能难以支持 开发效率低下 1.1 初期解决思路&#xff1a;设备和驱动分离 struct device来表示一个具体设备&#xff0c;主要提供具体设备相关的资源&#xff08;如…

Python爬虫之文件存储#5

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 文件存储形式多种多样&#xff0c;比如可以保存成 TXT 纯文本形式&#xff0c;也可以保存为 JSON 格式、CSV 格式等&#xff0c;本节就来了解一下文本文件的存储方式。 TXT 文本存储 将数据保存到 TXT 文本的操作非常简单&am…

Python基于大数据的电影预测分析系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

多尺度神经网络新一代创新!精度与速度完美平衡,实现多领域应用落地

多尺度神经网络的设计通常基于对频率原则的理解&#xff0c;目的是为了解决高频成分学习慢的问题。这些网络通过特殊设计&#xff0c;比如给高频成分加更多的权重或者将高频成分平移到低频&#xff0c;来提高学习效率。 为了满足在不同层次上理解和处理数据的需求&#xff0c;…

【Java程序设计】【C00254】基于Springboot的java学习平台(有论文)

基于Springboot的java学习平台&#xff08;有论文&#xff09;&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的学习平台 本系统分为系统功能模块、管理员功能模块、教师功能模块以及学生功能模块。 系统功能模块&#xff1a;在平台…

GEE:梯度提升树(Gradient Boosting Tree)回归教程(样本点、特征添加、训练、精度、参数优化)

作者:CSDN @ _养乐多_ 对于分类问题,这个输出通常是一个类别标签 ,而对于回归问题,输出通常是一个连续的数值。回归可以应用于多种场景,包括预测土壤PH值、土壤有机碳、土壤水分、碳密度、生物量、气温、海冰厚度、不透水面积百分比、植被覆盖度等。 本文将介绍在Google…

【Linux学习】线程互斥与同步

目录 二十.线程互斥 20.1 什么是线程互斥&#xff1f; 20.2 为什么需要线程互斥? 20.3 互斥锁mutex 20.4 互斥量的接口 20.4.1 互斥量初始 20.4.2 互斥量销毁 20.4.3 互斥量加锁 20.4.4 互斥量解锁 20.4.5 互斥量的基本原理 20.4.6 带上互斥锁后的抢票程序 20.5 死锁问题 死锁…

React18原理: 核心包结构与两大工作循环

React核心包结构 1 ) react react基础包&#xff0c;只提供定义 react组件(ReactElement)的必要函数一般来说需要和渲染器(react-dom,react-native)一同使用在编写react应用的代码时, 大部分都是调用此包的api比如, 我们定义组件的时候&#xff0c;就是它提供的class Demo ext…

[VulnHub靶机渗透] Nyx

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

2月3日作业

1.编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删 尾插/头插&#xff0c;头删&#xff0c;尾删&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H_ #define __HEAD_H_#include<stdio.h> #include<string.h> #include<stdlib.h>enum {FALSE-1,SU…

Spring Cloud Gateway 网关路由

一、路由断言 路由断言就是判断路由转发的规则 二、路由过滤器 1. 路由过滤器可以实现对网关请求的处理&#xff0c;可以使用 Gateway 提供的&#xff0c;也可以自定义过滤器 2. 路由过滤器 GatewayFilter&#xff08;默认不生效&#xff0c;只有配置到路由后才会生效&#x…

浅谈进制的转换

本文创作灵感来自CSDN咸鱼WCY 的 咸鱼小白学嵌入式之C语言&#xff08;2.进制&#xff09; 博主更完就没更了&#xff0c;决定书接上回&#xff08;喜 进制是个啥 要理解进制&#xff0c;首先哈&#xff0c;咱得知道不同进制的含义 说到底&#xff0c;各个进制其实有点像在…

学生公寓|基于Springboot的学生公寓管理系统设计与实现(源码+数据库+文档)

学生公寓管理系统目录 目录 基于Springboot的学生公寓管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、宿舍列表 2、宿舍公告信息管理 3、宿舍公告类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

学生成绩管理系统|基于Springboot的学生成绩管理系统设计与实现(源码+数据库+文档)

学生成绩管理系统目录 目录 基于Springboot的学生成绩管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能模块 2、学生功能模块 3、教师功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…

AI引领低代码革命:未来应用开发的新主流

距离ChatGPT发布已经过去快一年时间。 在这一年里&#xff0c;以ChatGPT为代表的自然语言处理领域的重大进步&#xff0c;为我们的对话系统和语言交流提供了更加智能和自然的体验。随着ChatGPT的应用不断扩大&#xff0c;人们开始认识到人工智能&#xff08;AI&#xff09;技术…

elasticsearch增删改查

一、数据类型 1、字符串类型 &#xff08;1&#xff09;text &#xff08;2&#xff09;keyword 2、数值类型 &#xff08;1&#xff09;long、integer、short、byte、float、double 3、日期类型 &#xff08;1&#xff09;date 4、布尔类型 &#xff08;1&#xff0…

【AI绘图】初见·小白入门stable diffusion的初体验

首先&#xff0c;感谢赛博菩萨秋葉aaaki的整合包 上手 stable diffusion还是挺好上手的&#xff08;如果使用整合包的话&#xff09;&#xff0c;看看界面功能介绍简单写几个prompt就能生成图片了。 尝试 我在网上找了一张赛博朋克边缘行者Lucy的cos图&#xff0c;可能会侵…

开发自定义标记应用程序

开发自定义标记应用程序 问题陈述 Larry Williams 是ABC Inc.公司的CEO,他希望公司能够拥有一个交互式网站以向访问网站的用户表示问候并显示当前时间。他还希望最终用户能够指定主页的背景颜色。您是公司的网站管理员。Larry要您修改网站的主页,以便向最终用户显示自定义问…