【详识JAVA语言】String 类1

news2025/1/24 17:54:03

String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提 供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字 符串应用又非常广泛,因此Java语言专门提供了String类。

在开发和校招笔试中,字符串也是常客,比如:

字符串转整形数字

字符串相加

而且在面试中也频繁被问到,比如:String、StringBuff和StringBulider之间的区别等。

常用方法

字符串构造

String类提供的构造方式非常多,常用的就以下三种:

public static void main(String[] args) { 
// 使用常量串构造 

String s1 = "hello bit"; 

System.out.println(s1);

// 直接newString对象 

String s2 = new String("hello bit"); 

System.out.println(s1);

// 使用字符数组进行构造

char[] array = {'h','e','l','l','o','b','i','t'};

String s3 = new String(array); System.out.println(s1);

}

【注意】

1. String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类实例变量如下:

public static void main(String[] args) {

// s1和s2引用的是不同对象 s1和s3引用的是同一对象 

String s1 = new String("hello"); 

String s2 = new String("world"); 

String s3 = s1;

System.out.println(s1.length()); // 获取字符串长度---输出5 System.out.println(s1.isEmpty()); // 如果字符串长度为0,返回true,否则返回false

}

 2. 在Java中“”引起来的也是String类型对象。

// 打印"hello"字符串(String对象)的长度 
System.out.println("hello".length());

String对象的比较 

字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:

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

注意:对于内置类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址。

public static void main(String[] args) {

int a = 10;

int b = 20;

int c = 10;

// 对于基本类型变量,==比较两个变量中存储的值是否相同

System.out.println(a == b); // false

System.out.println(a == c); // true

// 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象

String s1 = new String("hello");

String s2 = new String("hello");

String s3 = new String("world");

String s4 = s1;

System.out.println(s1 == s2); // false

System.out.println(s2 == s3); // false

System.out.println(s1 == s4); // true

}

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

字典序:字符大小的顺序

String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较,比如:s1.equals(s2)

public boolean equals(Object anObject) {

// 1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回true

if (this == anObject) {

return true;

}

// 2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false

if (anObject instanceof String) {

// 将anObject向下转型为String类型对象

String anotherString = (String)anObject;

int n = value.length;

// 3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false if (n == anotherString.value.length) {

char v1[] = value; char v2[] = anotherString.value; int i = 0;

// 4. 按照字典序,从前往后逐个字符进行比较 while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++; } return true;

}

}

return false;

}
public static void main(String[] args) {

String s1 = new String("hello");

String s2 = new String("hello");

String s3 = new String("Hello");

// s1、s2、s3引用的是三个不同对象,因此==比较结果全部为false

System.out.println(s1 == s2); // false

System.out.println(s1 == s3); // false

// equals比较:String对象中的逐个字符

// 虽然s1与s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true

// s1与s3引用的不是同一个对象,而且两个对象中内容也不同,因此输出false System.out.println(s1.equals(s2)); // true

System.out.println(s1.equals(s3)); // false

}

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

与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值

2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值

public static void main(String[] args) {

String s1 = new String("abc");

String s2 = new String("ac");

String s3 = new String("abc");

String s4 = new String("abcdef");

System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1 System.out.println(s1.compareTo(s3)); // 相同输出 0

System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3

}

4. int compareToIgnoreCase(String str)方法:与compareTo方式相同,但是忽略大小写比较

public static void main(String[] args) {

String s1 = new String("abc");

String s2 = new String("ac");

String s3 = new String("ABc");

String s4 = new String("abcdef");

System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1 System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0 System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3

}

字符串查找

字符串查找也是字符串中非常常见的操作,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)

从后往前找,返回ch第一次出现的位置,没有返回-1

int lastIndexOf(int ch, int fromIndex)

从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返 回-1

int lastIndexOf(String str)

从后往前找,返回str第一次出现的位置,没有返回-1

int lastIndexOf(String str, int fromIndex)

从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返 回-1

public static void main(String[] args) {

String s = "aaabbbcccaaabbbccc";

System.out.println(s.charAt(3)); // 'b'

System.out.println(s.indexOf('c')); // 6

System.out.println(s.indexOf('c', 10));  // 15

System.out.println(s.indexOf("bbb"));  // 3

System.out.println(s.indexOf("bbb", 10)); // 12

System.out.println(s.lastIndexOf('c')); // 17

System.out.println(s.lastIndexOf('c', 10)); // 8

System.out.println(s.lastIndexOf("bbb")); // 12

System.out.println(s.lastIndexOf("bbb", 10)); // 3

注意:上述方法都是实例方法。

 转化

1. 数值和字符串转化

public static void main(String[] args) {

// 数字转字符串

String s1 = String.valueOf(1234);

String s2 = String.valueOf(12.34);

String s3 = String.valueOf(true);

String s4 = String.valueOf(new Student("Hanmeimei", 18));

System.out.println(s1);

System.out.println(s2);

System.out.println(s3);

System.out.println(s4);

System.out.println("=================================");

// 字符串转数字

// 注意:Integer、Double等是Java中的包装类型,这个后面会讲到

int data1 = Integer.parseInt("1234");

double data2 = Double.parseDouble("12.34");

System.out.println(data1);

System.out.println(data2);

}

2. 大小写转换

public static void main(String[] args) {

String s1 = "hello";

String s2 = "HELLO";

// 小写转大写

System.out.println(s1.toUpperCase()); /

/ 大写转小写

System.out.println(s2.toLowerCase());

}

3. 字符串转数组

public static void main(String[] args) {

String s = "hello";

// 字符串转数组

char[] ch = s.toCharArray();

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

System.out.print(ch[i]);

} System.out.println(); 

// 数组转字符串

String s2 = new String(ch);

System.out.println(s2);

}

4. 格式化

public static void main(String[] args) {

String s = String.format("%d-%d-%d", 2019, 9,14);

System.out.println(s);

}

字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

方法

功能

String replaceAll(String regex, String replacement)

替换所有的指定内容

String replaceFirst(String regex, String replacement)

替换收个内容

代码示例: 字符串的替换处理

String str = "helloworld" ;

System.out.println(str.replaceAll("l", "_"));

System.out.println(str.replaceFirst("l", "_"));

注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。 可用方法如下:

方法

功能

String[] split(String regex)

将字符串全部拆分

String[] split(String regex, int limit)

将字符串以指定的格式,拆分为limit组

代码示例: 实现字符串的拆分处理

String str = "hello world hello bit" ;

String[] result = str.split(" ") ; // 按照空格拆分

for(String s: result) {

System.out.println(s);

}

代码示例: 字符串的部分拆分

String str = "hello world hello bit" ;

String[] result = str.split(" ",2) ;

for(String s: result) {

System.out.println(s);

}

拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.

代码示例: 拆分IP地址

String str = "192.168.1.1" ;

String[] result = str.split("\\.") ;

for(String s: result) {

System.out.println(s);

}

注意事项:

1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .

2. 而如果是 "\" ,那么就得写成 "\\\\" .

3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

代码示例: 多次拆分

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]);

}

这种代码在以后的开发之中会经常出现

字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:

方法

功能

String substring(int beginIndex)

从指定索引截取到结尾

String substring(int beginIndex, int endIndex)

截取部分内容

代码示例: 观察字符串截取

String str = "helloworld" ;

System.out.println(str.substring(5));

System.out.println(str.substring(0, 5));

注意事项:

1. 索引从0开始

2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

其他操作方法

方法

功能

String trim()

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

String toUpperCase()

字符串转大写

String toLowerCase()

字符串转小写

代码示例: 观察trim()方法的使用

String str = " hello world " ;

System.out.println("["+str+"]");

System.out.println("["+str.trim()+"]");

trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等).

代码示例: 大小写转换

String str = " hello%$$%@#$%world 哈哈哈 " ;

System.out.println(str.toUpperCase());

System.out.println(str.toLowerCase());

这两个函数只转换字母。

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

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

相关文章

python之海龟绘图

海龟绘图&#xff08;turtle&#xff09;是一个Python内置的绘图库&#xff0c;也被称为“Turtle Graphics”或简称“Turtles”。它采用了一种有趣的绘图方式&#xff0c;模拟一只小海龟在屏幕上爬行&#xff0c;而小海龟爬行的路径就形成了绘制的图形。这种绘图方式最初源自20…

考研数学——高数:多元函数微分法及其应用

因为复习阶段全篇很细节的写下来一来比较费时间&#xff0c;二容易导致为了记笔记而记。 接下来的内容只会保留上课中比较有意义的地方&#xff0c;以及有自己助于理解的想法 全微分 助记&#xff1a; 证明是否可微&#xff0c;首先判断两个偏导数是否存在&#xff0c;不存在则…

插入排序和归并排序

插入排序&#xff0c;Insertion Sort. 给出伪代码 for i 1,2,...,n-1Insert A[i] into Sorted array A[0:i-1]by swaping down to the correct position. 冒泡排序 冒泡排序就是一种插入排序算法。 i ← 1 while i < length(A)j ← iwhile j > 0 and A[j-1] > A…

FlyClient SPV client轻量化

这篇文章主要是为了构建一种轻客户端的算法。 如果使用SPV 的方式验证交易&#xff0c;每个client上面需要存储非常多的header。使用 proofs of proof-of-work 的方式&#xff0c;使得请客户端仅仅下载少量的区块头就能验证这一条链的安全性&#xff0c;然后再对包含交易的区块…

【详识JAVA语言】String类2

常用方法 字符串的不可变性 String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改&#xff0c;是因为&#xff1a; 1. String类在设计时就是不可改变的&#xff0c;String类实现描述中已经说明了 以下来自JDK1.8中String类的部分实现&#xff1a; String类…

2D/3D相机手眼标定总结

1. 九点标定 九点标定法的本质&#xff1a; 无需进行相机内参标定&#xff0c;只能识别x&#xff0c;y坐标&#xff0c;属于2D平面标定&#xff0c;在标定过程中z是未知的。 该算法的核心是仿射变换&#xff0c;即图像坐标系到机器人坐标系的2D仿射变换&#xff08;注意这里并不…

【python--比对两个列表获取列表中出现频率最高的词及频率】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; python练习题 完整代码 完整代码 from collections import Counter from data_keywords import extract_…

【Linux】文件传输工具lrzsz的安装与使用

目录 一、关于lrzsz 二、安装lrzsz 三、lrzsz的说明及使用 1、上传命令rz 2、下载命令sz 一、关于lrzsz 在开发的过程中&#xff0c;经常遇到 需要在 Linux 和 Windows 之间上传下载文件的情况 这时&#xff0c;一般都是使用 FTP 或者 WinSCP 工具进行上传下载, 虽然也能…

SRIO—IP讲解及说明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、SRIO IP 概述1.1 逻辑层1.1.1 I/O 端口(I/O Port)1.1.2 消息端口(Messaing Port)1.1.3 用户自定义端口(User-Defined Port)1.1.4 维护端口(Maintenance Port)1.2 缓冲层1.3 物理层…

python+django+vue房屋租赁系统 8gwmf

房屋租赁系统在设计与实施时&#xff0c;采取了模块性的设计理念&#xff0c;把相似的系统的功能整合到一个模组中&#xff0c;以增强内部的功能&#xff0c;减少各组件之间的联系&#xff0c;从而达到减少相互影响的目的。如房源信息、预约信息、求租信息模块等[12]。 管理员后…

java工程师面试简历模板,2024谈一下当下最合适的Java架构

前言 这些算法&#xff0c;都是小编一点一点看的大佬们的方法&#xff0c;自己积累的. 如果有什么描述的不对的地方还望大佬赐教 多交流才能进步&#xff0c;加油&#xff0c;冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、冒泡排序 二、选择排序 三、插入排序 四、快速…

Redis中的RDB和AOF持久化机制(一)

Redis持久化 RDB快照(snapshot). 在默认情况下&#xff0c;Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中.Redis可以进行设置,让它在"N秒内数据集至少有M个改动"这一条件被满足时&#xff0c;自动保存一次数据集。比如说&#xff0c;以下设置会让Redis…

软件测试需求分析如何编写?为什么要进行测试需求分析?

在软件开发的过程中&#xff0c;软件测试需求分析是至关重要的一个环节。测试需求分析是指对待测软件的需求进行全面细致的分析&#xff0c;明确软件测试的目标和范围&#xff0c;为测试活动的进行提供指导。通过对软件需求的详细分析&#xff0c;可以确保测试人员清楚了解软件…

配置与管理防火墙

配置与管理防火墙 1&#xff0c;概念&#xff1a;设置在不同网络或网络安全域之间的一系列部件的组合。 2&#xff0c;功能&#xff1a;保护内网中易手攻击的服务&#xff1b;控制内外网之间网络系统的访问&#xff1b;隐藏内网的IP地址及结构的细节&#xff0c;提高网络保护…

3月每日一题笔记

感谢我的好朋友的鼓励 3月4日 两种等价方式&#xff1f;都是错误的 ->加减中不能使用等价无穷小&#xff1f; ->不全面。 两项无穷小相减, 那么两项无穷小比值的极限不等于 1 时, 或者两项无穷小相加时, 其比值极限不等于 −1 时, 代数和差各项可以用等价无穷小替换 等…

基于springboot的海滨体育馆管理系统的设计与实现论文

摘 要 本基于Spring Boot的海滨体育馆管理系统设计目标是实现海滨体育馆的信息化管理&#xff0c;提高管理效率&#xff0c;使得海滨体育馆管理工作规范化、高效化。 本文重点阐述了海滨体育馆管理系统的开发过程&#xff0c;以实际运用为开发背景&#xff0c;基于Spring Boot…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型&#xff0c;是一个“Bidirectional Encoder Representations fromTransformers”的缩写&#xff0c;是一个语言预训练模型&#xff0c;通过随机掩盖一些词&#xff0c;然后预测这些被遮盖的词来训练双向语言模型&#xff08;编码器…

7.使用os.Args或flag解析命令行参数

文章目录 一、os.Args二、flag包基本使用 Go语言内置的flag包实现了命令行参数的解析&#xff0c;flag包使得开发命令行工具更为简单。 一、os.Args 如果你只是简单的想要获取命令行参数&#xff0c;可以像下面的代码示例一样使用os.Args来获取命令行参数。 package mainimp…

彻底解析:企业为何必须采用CRM系统以及其五大作用

相关数据显示&#xff0c;CRM系统在欧美发达国家的普及程度高&#xff0c;超出80%的企业部署了CRM管理系统。然而在国内这个比例依然很小只有10几%&#xff0c;为什么企业需要CRM系统&#xff1f;因为CRM可以为公司实现线索管理、绩效管理、销售流程管理、市场营销管理以及数据…