【JAVA |String类】JAVA中的String类常见用法详解

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
🎈🎈作者主页: 🎈丠丠64-CSDN博客🎈


✨✨ 帅哥美女们,我们共同加油!一起进步!✨✨ 

目录

一、前言

二、字符串常量

三、String类型

四、字符串构造

1.使用常量串进行构造

2.使用new String对象

3.使用字符数组进行构造

四、String对象的比较

1.==比较是否引用同一对象

2.boolean equals(Object anObject) 方法:按照字典序比较

3.int compareTo(String s) 方法: 按照字典序进行比较

4.int compareToIgnoreCase(String str) 方法:忽略大小写

五、字符串查找

六、转换

1.数值和字符串转化

​编辑

2.大小写转换

3.字符串转数组

​编辑

4.去字符串中的左右空格

七、字符串替换

八、字符串拆分

九、字符串截取

​编辑

十、StringBuilder和StringBuffer


一、前言

在JAVA中的字符串存储是可以直接使用String这个引用数据类型,不像C语言表示字符串只能使用字符数组或者字符指针,使我们操作起来更方便,更符合不符合面相对象的思想。


二、字符串常量

String类对象的直接赋值: 将一个匿名对象设置一个具体的引用,相当于开辟一个栈内存,指向这个匿名对象,这个匿名对象是存在堆内存的。

String arr1 = "abcd";
String arr2 = "abcd";

所以相同的字符串常量可以有多个对象指向


三、String类型

String是引用类型,内部并不存储字符串本身,我们来看一下String类的实现源码,字符串实际保存在char类型的数组中,并且final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的

看这样一段代码,大家可能大家会想到这个是在arr1的自身增加了一段字符串
String arr1 = new String("abcd");
arr1 += "ooooo";
System.out.println(arr1);
但是他的实现过程却是新对象
所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象, 尽量避免直接对 String 类型对象进行修改,因为 String 类是不能修改的,所有的修改都会创建新对象,效率 非常低
如果要修改建议尽量使用StringBuffer 或者 StringBuilder

四、字符串构造

常用的构造方法下面三种构造方法


1.使用常量串进行构造

String arr1 = "abcdefg";
System.out.println("arr1 =" + arr1);


2.使用new String对象

String arr2 = new String("abcdefg");
System.out.println("arr2 =" + arr2);


3.使用字符数组进行构造

char[] ch = {'a','b','c','d','e','f','g'};
String arr3 = new String(ch);
System.out.println("arr3 =" + arr3);


四、String对象的比较

字符串的比较JAVA中提供了四种常见的方法


1.==比较是否引用同一对象

对于内置类型,==比较的是两个对象的值;但对引用类型,==对比的是两个对象的地址

        String arr1 = new String("abcd");
        String arr2 = new String("abcd");
        
        String arr3 = "abcd";
        String arr4 = "abcd";
        
        System.out.println(arr1 == arr2);
        System.out.println(arr3 == arr4);

理论上来说这四个字符串相等,应该都输出true

但是arr1跟arr2 为两个对象所以地址不同,而arr3和arr4指向同一字符串常量地址相同


2.boolean equals(Object anObject) 方法:按照字典序比较

String 类重写了父类 Object equals 方法,只比较字符串的内容,相同返回true,不同返回false
String arr1 = new String("abcd");
String arr2 = new String("abcd");
String arr3 = new String("oooo");

System.out.println(arr1.equals(arr2));
System.out.println(arr1.equals(arr3));


3.int compareTo(String s) 方法: 按照字典序进行比较

compareTo 返回的是 int 类型,大于返回一个大于0的数字,小于返回小于0的数字。相等返回0.
String arr1 = new String("abcd");
String arr2 = new String("abcd");
String arr3 = new String("oooo");

System.out.println(arr1.compareTo(arr2));
System.out.println(arr1.compareTo(arr3));
System.out.println(arr1.compareTo(arr3));


4.int compareToIgnoreCase(String str) 方法:忽略大小写

忽略大小写的比较,大于返回一个大于0的数字,小于返回小于0的数字。相等返回0.

String arr1 = new String("abcd");
String arr2 = new String("ABcd");
String arr3 = new String("oood");

System.out.println(arr1.compareToIgnoreCase(arr2));
System.out.println(arr1.compareToIgnoreCase(arr3));
System.out.println(arr1.compareToIgnoreCase(arr3));


五、字符串查找

常见的String类提供的常用查找的方法有下面这些

方法功能
char charAt(int index)
返回 index 位置上字符,index为负数或越界,抛IndexOutOfBoundsException异常
int indexOf(int ch)
返回 ch 第一次出现的位置,没有返回 -1
int indexOf(int ch, int
fromIndex)
fromIndex 位置开始找 ch 第一次出现的位置,没有返回 -1
int indexOf(String str)
返回 str 第一次出现的位置,没有返回 -1
int indexOf(String str, int
fromIndex)
fromIndex 位置开始找 str 第一次出现的位置,没有返回 -1
int lastIndexOf(int ch, int  fromIndex)
fromIndex 位置开始找,从后往前找 ch 第一次出现的位置,没有返回-1
int lastIndexOf(int ch)
从后往前找,返回 ch 第一次出现的位置,没有返回 -1
int lastIndexOf(String str)
从后往前找,返回 str 第一次出现的位置,没有返回 -1
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找,从后往前找 str 第一次出现的位置,没有返
-1
 String arr1 = "abcda2bc1do1ab2oocdzbc2d";

System.out.println(arr1.charAt(3)); //下标为3的元素 -》d
System.out.println(arr1.indexOf('c')); //字符c,字符串中第一次出现的下标 -》2
System.out.println(arr1.indexOf('c',8)); //字符c,字符串中从下标八开始第一次出现的下标 -》17
System.out.println(arr1.indexOf("ab")); //字符串ab,字符串中第一次出现的下标 -》0
System.out.println(arr1.indexOf("ab",3)); //字符ab,字符串中从下标三开始第一次出现的下标 -》12
System.out.println(arr1.lastIndexOf('d')); //字符d,字符串中从最后开始倒着找第一次出现的下标 -》23
System.out.println(arr1.lastIndexOf('d',6)); //字符d,字符串中从下标6开始倒着找第一次出现的下标 -》3
System.out.println(arr1.lastIndexOf("cd")); //字符串cd,字符串中从最后开始倒着找第一次出现的下标 -》17
System.out.println(arr1.lastIndexOf("cd",6)); //字符串cd,字符串中从下标6开始倒着找第一次出现的下标 -》2


六、转换

1.数值和字符串转化

不光是整形,浮点跟布尔类型都可以转换为字符串

String arr1 = String.valueOf(123);
String arr2 = String.valueOf(12.3);
String arr3 = String.valueOf(true);

System.out.println(arr1);
System.out.println(arr2);
System.out.println(arr3);

字符串转其他类型需要用到包装类型

int num1 = Integer.parseInt("123");
double num2 = Double.parseDouble("123");

System.out.println(num1);
System.out.println(num2);


2.大小写转换

String arr1 = "aaa";
String arr2 = "BBB";

System.out.println(arr1.toUpperCase());//转大写
System.out.println(arr2.toLowerCase());//转小写


3.字符串转数组

字符串转数组

String arr1 = "abcd";
char[] ch = arr1.toCharArray();

for (int i = 0; i <ch.length ; i++) {
    System.out.println(ch[i]);
 }

数组转字符串

char[] ch = {'a','b','c','d'};
String arr2 = new String(ch);
System.out.println(ch);


4.去字符串中的左右空格

去掉字符串中的左右空格,保留中间空格

        String arr1 = "       abc def          ";
        
        System.out.println("[" + arr1 + "]");
        System.out.println("[" + arr1.trim() + "]");


七、字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,替换不修改当前字符串 , 而是产生一个新的字符串
System.out.println(arr1.replace('a','o')); //将所有的字符a替换为o
System.out.println(arr1.replaceAll("aa","oo"));//将所有的字符串aa替换为oo
System.out.println(arr1.replaceFirst("aa","oo"));//将第一个字符串aa替换为oo

八、字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串,以字符串数组形式存储
String arr1 = "aaaa bbbb cccc";
String[] arrrs1 = arr1.split(" ");    //将字符串用空格分割

for (int i = 0; i < arrrs1.length; i++) {
    System.out.println(arrrs1[i]);
}


String[] arrrs2 = arr1.split(" ",2);    //将字符串用空格分割为2组
for (int i = 0; i < arrrs2.length; i++) {
    System.out.println(arrrs2[i]);
}

值得注意的是

  • 字符"|","*","+"都得加上转义字符,前面加上 "\\" 
  • 而如果是 "\" ,那么就得写成 "\\\\"
  • 如果一个字符串中有多个分隔符,可以用"|"作为连字符
String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;    //第一次拿&分割

for (int i = 0; i < result.length; i++) {

String[] temp = result[i].split("=") ;    //第一次拿=分割
System.out.println(temp[0]+" = "+temp[1]);

}

九、字符串截取

从一个完整的字符串之中截取出部分内容
        System.out.println(arr1.substring(2));  //截取下标2到结尾范围的字符串
        System.out.println(arr1.substring(0,4));  //截取下标[0,4)范围的字符串


十、StringBuilder和StringBuffer

由于 String 的不可更改特性,为了方便字符串的修改, Java 中又提供 StringBuilder StringBuffer 类。
方法说明
StringBuff append(String str)
在尾部追加,相当于 String += ,可以追加: boolean char char[]
double float int long Object String StringBuff 的变量
char charAt(int index)
获取 index 位置的字符
int length()
获取字符串的长度
int capacity()
获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)

扩容

void setCharAt(int index, char ch)
index 位置的字符设置为 ch
int indexOf(String str)
返回 str 第一次出现的位置
int indexOf(String str, int fromIndex)
fromIndex 位置开始查找 str 第一次出现的位置
int lastIndexOf(String str)
返回最后一次出现 str 的位置
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找 str 最后一次出现的位置
StringBuff insert(int offset, String str)
offset 位置插入:八种基类类型 & String 类型 & Object类型数据         
StringBuffer deleteCharAt(int index)
删除 index 位置字符
StringBuffer delete(int start, int end)
删除 [start, end) 区间内的字符
StringBuffer replace(int start, int end, String str)
[start, end) 位置的字符替换为 str
String substring(int start)
start 开始一直到末尾的字符以 String 的方式返回
String substring(int
start int end)
[start, end) 范围内的字符以 String 的方式返回
StringBuffer reverse()
反转字符串
String toString()
将所有字符按照 String 的方式返回
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = sb1;// 追加:即尾插-->字符、字符串、整形数字
sb1.append(' '); // hello
sb1.append("world"); // hello world
sb1.append(123); // hello world123
System.out.println(sb1); // hello world123
System.out.println(sb1 == sb2); // true
System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
System.out.println(sb1.length()); // 获取字符串的有效长度14
System.out.println(sb1.capacity()); // 获取底层数组的总大小
sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
System.out.println(sb1);
System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
sb1.deleteCharAt(0); // 删除首字符
sb1.delete(0,5); // 删除[0, 5)范围内的字符
String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
System.out.println(str);
sb1.reverse(); // 字符串逆转
str = sb1.toString(); // 将StringBuffer以String的方式返回
System.out.println(str);
}
String StringBuilder 最大的区别在于 String 的内容无法修改,而 StringBuilder 的内容可
以修改 。频繁修改字符串的情况考虑使用 StringBuilder

希望对你有帮助

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

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

相关文章

500元以内的蓝牙耳机哪个牌子好?首推四大热门品牌盘点

在500元以内的预算范围内&#xff0c;蓝牙耳机试市场上还是有很多可以选择的&#xff0c;它们以出色的音质、舒适的佩戴体验和稳定的连接性能赢得了消费者的青睐&#xff0c;作为一个蓝牙耳机的重度使用者&#xff0c;下也用过不少的500元以内的蓝牙耳机&#xff0c;下面就给大…

小白跟做江科大32单片机之光敏传感器控制蜂鸣器

代码部分 1.思路 通过光敏电阻&#xff0c;控制蜂鸣器的发声 2.butter.h代码 #ifndef _BUTTER__H #define _BUTTER__H void butter_Init(void); void butter_on(void); void butter_off(void); #endif 3.butter.c代码 #include "stm32f10x.h" void butter…

React-组件通信

组件通信 概念&#xff1a;组件通信就是组件之间的数据传递&#xff0c;根据组件嵌套关系的不同&#xff0c;有不同的通信方法 父传子 基础实现 实现步骤&#xff1a; 1.父组件传递数据-在子组件标签上绑定属性 2.子组件接收数据-子组件通过props参数接收数据 props说明 1.…

【C++题解】1446. 人口增长问题

问题&#xff1a;1446. 人口增长问题 类型&#xff1a;循环应用 题目描述&#xff1a; 我国现有 x 亿人口&#xff0c;按照每年 0.1% 的增长速度&#xff0c;n 年后将有多少人&#xff1f; 输入&#xff1a; 一行&#xff0c;包含两个整数 x 和 n &#xff0c;分别是人口基…

Centos 7下的VulFocus靶场搭建详细教程

一、靶场介绍 自带 Flag 功能&#xff1a;每次启动 flag 都会自动更新&#xff0c;明确漏洞是否利用成功。带有计分功能。兼容 Vulhub、Vulapps 中所有漏洞镜像。 二、下载安装 下载 VMware 软件下载 centos镜像 三、Docker知识 学习链接&#xff1a;https://www.runoob.c…

lynis安全漏洞扫描工具

Lynis是一款Unix系统的安全审计以及加固工具&#xff0c;能够进行深层次的安全扫描&#xff0c;其目的是检测潜在的时间并对未来的系统加固提供建议。这款软件会扫描一般系统信息&#xff0c;脆弱软件包以及潜在的错误配置。 安装 方式1 git下载使用git clone https://github…

宏集JMobile Studio—实现HMI界面高自由度设计

一、简介 物联网HMI的组态软件是数据可视化的重要工具&#xff0c;工程师可以通过图形化界面来配置、监控和管理现场采集的数据。目前&#xff0c;市面上大多数的组态软件里的可视化控件库都由设计师预先部署&#xff0c;用户只能调用而不能完全自定义控件&#xff0c;导致可视…

Java时间类--JDK8

为什么JDK8会又新增时间相关类呢&#xff1f; ① JDK7的时间对象如果需要比较大小的话&#xff0c;必须都先转换成毫秒值&#xff1b;JDK8则不需要&#xff0c;可以直接比较。 ② JDK7的时间对象可以修改&#xff0c;在多线程环境下就会导致数据不安全&#xff1b;JDK8不能修改…

【哈希】用哈希桶封装unordered_map unordered_set

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 用哈希桶封装 unordered_map & unordered_set 的相关内容。 如…

【成品设计】基于STM32单片机的便携式防丢失设备

《基于STM32单片机的便携式防丢失设备》 所需器件&#xff1a; STM32最小系统板。角度传感器&#xff1a;做为运动检测模块。距离传感器&#xff1a;作为与监测物品(人)保持的距离监测。按键&#xff1a;短按切换模块&#xff0c;长按解除报警。红色LED灯蜂鸣器&#xff1a;作…

渗透课程第二阶段--Part1--信息收集

目录 一. 为什么要做信息收集&#xff1f; 渗透测试的流程 信息收集包括的内容 学习框架&#xff1a; 二. 分类 1. 域名相关信息 域名&#xff08;Domain Name&#xff09;是什么 域名的分类 域名联系人信息 子域名信息 域名DNS信息 2. IP相关信息 ping/nslookup …

网络安全||信息加解密技术以及密钥管理技术

一、信息加解密技术 对称加密 对称加密&#xff08;又称为私人密钥加密/共享密钥加密&#xff09;&#xff1a;加密与解密使用同一密钥。特点&#xff1a;加密强度不高&#xff0c;但效率高&#xff1b;密钥分发困难。&#xff08;大量明文为了保证加密效率一般使用对称加密&…

香橙派OriengePi AiPro 华为昇腾芯片开发板开箱测评

香橙派OriengePi AiPro 华为昇腾芯片开发板开箱测评 文章目录 前言OrangePi AIpro硬件相关及配置外观接口配置虚拟桌面网络配置拓展swap内存 软件相关及配置docker基础镜像搭建pytorch安装及匹配 软件测试使用yolo v8测试使用模型转换 总结 前言 博主有幸受邀CSDN测评香橙派与…

第三讲:Keil编译器如何压缩51单片机移植RA8889的代码

本章介绍使用Keil编译器时如何压缩51单片机移植RA8889的代码。 瑞佑(RAIO)科技所推出的RA8889是一颗图形控制芯片&#xff0c;具有相当多的图形显示功能&#xff0c;包括绘图、文字显示、DMA、JPG解码、AVI解码等&#xff0c;因此API函数十分丰富&#xff0c;也就造成代码庞大…

vm-bhyve:bhyve虚拟机的管理系统@FreeBSD

先说情况&#xff0c;当前创建虚拟机后网络没有调通....不明白是最近自己点背&#xff0c;还是确实有难度... 缘起&#xff1a; 前段时间学习bhyve虚拟机&#xff0c;发现bvm这个虚拟机管理系统&#xff0c;但是实践下来发现网络方面好像有问题&#xff0c;至少我花了两天时间…

Java | Leetcode Java题解之第122题买卖股票的最佳时机II

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int ans 0;int n prices.length;for (int i 1; i < n; i) {ans Math.max(0, prices[i] - prices[i - 1]);}return ans;} }

【排序】冒泡排序

在我们的生活中&#xff0c;到处都离不开排序的作用&#xff0c;考试分数要排序&#xff0c;商场购物要排序&#xff0c;可以说排序对我们来说处处存在&#xff0c;那么从本章开始&#xff0c;我将要依次分享一些排序方法&#xff0c;从易到难&#xff0c;包括冒泡&#xff0c;…

线上 | OpenSergo - [规范]

INDEX 1 参考资料2 OpenSergo 与 Sentinel 关系3 规范体系3.1 服务元数据ReportMetadataRequest 信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ffba569841ae4668b4cff74e4d41d21f.png)##### ReportMetadataReply 信息![在这里插入图片描述](https://img-blog…

探索文档解析技术,推动大模型训练与应用

探索文档解析技术&#xff0c;推动大模型训练与应用 0. 前言1. CCIG 20241.1 会议简介1.2 大模型技术及其前沿应用论坛1.3 走进合合信息 2. 大模型时代2.1 大模型的发展与应用2.2 大模型面临的挑战 3. 文档解析技术3.1 文档解析技术难点3.2 TextIn 文档解析算法流程 4. 大模型时…

Linux CFS调度器简介

文章目录 前言一、概要二、实现2.1 简介2.2 算法实现2.3 内核源码 三、特点四、调度策略五、调度类参考资料 前言 早期的Linux调度器采用了简化的设计&#xff0c;显然并不针对具有许多处理器甚至超线程的大规模架构。Linux 1.2调度器使用循环队列对可运行任务进行管理&#x…