【详识JAVA语言】String 类1

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.mfbz.cn/a/434365.html

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

相关文章

SpringCloud微服务-RabbitMQ快速入门

文章目录 RabbitMQ快速入门1、什么是MQ&#xff1f;2、RabbitMQ概述3、RabbitMQ的结构和概念4、常见消息模型5、HelloWorld RabbitMQ快速入门 1、什么是MQ&#xff1f; MQ &#xff08;MessageQueue&#xff09;&#xff0c;中文是消息队列&#xff0c;字面来看就是存放消息的…

【知识整理】MySQL数据库开发设计规范

一、规范背景与目的 MySQL数据库与 Oracle、 SQL Server 等数据库相比&#xff0c;有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范&#xff0c;扬长避短。 本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理…

【LabVIEW FPGA】CIC滤波器

一、CIC滤波器应用概述 在通信数字信号上下变频时&#xff0c;经常会用到对数字信号的升采样和降采样&#xff0c;即通过CIC数字速率器实现变采样率。 二、滤波器IP 首先设置滤波器基本参数&#xff08;filter specification&#xff09; 滤波器类型&#xff08;Filter Type…

裸机编程的几种模式、架构、缺陷

目录 裸机编程模式/架构 1&#xff1a;初始化代码的编写 裸机编程模式/架构 2&#xff1a;轮询模式 裸机编程模式/架构 3&#xff1a;轮询加中断执行模式 裸机编程模式/架构 4&#xff1a;中断定时器主循环的前后台架构 裸机编程模式/架构 5&#xff1a;前后台 状态机架构…

Android开发技巧,最详细的解释小白也能听懂

今天&#xff0c;跟大家聊聊&#xff0c;Framework开发的那些事。 系统应用开发&#xff0c;现在来说&#xff0c;已经开始脱离系统&#xff0c;单独拿出来开发&#xff0c;系统定制接口&#xff0c;已提供给应用调用&#xff0c;用来增强功能。 原生的桌面&#xff0c;拨号&…

C++之获取Windows系统信息

目录 1. 操作系统版本 2. 获取CPU信息 3. 获取内存信息 4. 获取硬盘信息 5.获取网络接口信息 6.获取计算机名称、用户名 在C中&#xff0c;你可以使用Windows API函数来获取Windows系统的各种信息。以下是一些常见的API函数和示例代码&#xff0c;用于获取Windows系统信息…

深入了解 Android 中的 RelativeLayout 布局

RelativeLayout 是 Android 中常用的布局之一&#xff0c;它允许开发者基于子视图之间的相对位置来排列界面元素。在这篇博客中&#xff0c;我们将详细介绍 RelativeLayout 的各种属性&#xff0c;并提供代码示例和解释。 第一个示例 <RelativeLayoutandroid:layout_width…

腾讯云服务器99元一年是真的吗?只要61元!

腾讯云服务器99元一年是真的吗&#xff1f;假的&#xff0c;不要99&#xff0c;只要61元&#xff01;又降价了&#xff01;腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16…

数据分析-Pandas数据的直方图探查

数据分析-Pandas数据的直方图探查 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

网络编程 24/3/6 作业

1、数据库的增删改 #include <myhead.h> int main(int argc, const char *argv[]) {//定义数据库句柄指针sqlite3 *kdbNULL;//打开数据库&#xff0c;不存在则创建if(sqlite3_open("./my.db",&kdb)!SQLITE_OK){printf("sqlite3_open error\n");…

如何解决无法联网的IP代理问题

目录 前言 一、检查网络连接问题 二、检查IP代理配置问题 三、更换IP代理 四、使用IP池 总结 前言 在进行网络爬虫、数据采集等涉及到频繁请求的操作中&#xff0c;IP代理是一个必不可少的工具。通过使用IP代理&#xff0c;我们可以隐藏真实的IP地址&#xff0c;防止被目…

解决DBeaver执行脚本报错No active connection

解决DBeaver执行脚本报错No active connection 1、报错问腿 2、问题解决 2.1、右键点击该数据库&#xff0c;选择SQL编辑器&#xff0c;选择新建SQL编辑器&#xff0c;然后将sql语句复制过去。 或者左击选中数据库后直接使用快捷键 Ctrl] 2.2、在Project-General中找到Scr…

Nginx入门

Nginx入门 本章目标 Ninux简介 安装 Nginx配置 负载均衡 静态化处理 本章内容 一、什么是Nginx&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的http:/…

Claude3深夜震撼发布!模型特点分析,附使用教程

Claude3深夜震撼发布&#xff01;模型特点分析&#xff0c;附使用教程 引言 最新发布的Claude3引起了广泛关注&#xff0c;这次发布一举推出了三个不同类型的模型&#xff0c;分别是Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。每个模型都具有独特的特点和能力&#xff…

逆向案例五、爬取b站评论,表单MD5加密

1.便捷写爬虫网站&#xff1a; Convert curl commands to code 使用流程&#xff1a;又点击想要抓的包&#xff0c;复制URL&#xff08;base&#xff09;格式复制 在上面链接中粘贴即可 2.找到含有评论的包&#xff08;即main?oid)&#xff1a;观察表单发现两处参数在变化&…

protobuf 25.3在window的安装

1、下载地址 protobuf 25.3 下载完后&#xff0c;执行下面语句更新第三方库 git submodule update --init --recursive2、 cmake安装 注意&#xff1a;编译需要在vs2019及以上&#xff0c;因为abseil-cpp的编译需要是vs2019及以上

Nacos基础(注册中心和配置中心)

文章目录 参考文章一、 配置管理1、添加依赖2、添加配置信息3、创建例子4、在Nacos创建配置命名空间&#xff1a;配置集配置id配置组加载多配置文件 二、注册中心2.1、添加依赖2.2、添加项目Nacos配置2.3、添加服务发现注解这个时候你启动Nacos 如果遇到跳转链接失效请在评论区…

numpy——基础知识(创建/类型/形状/运算)(python)

简介 NumPy 是一个 Python 包。它代表 Numeric Python。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray &#xff0c;它拥有一些额外的功能。 2005年&#…

2024年腾讯云发红包了,可用于抵扣订单金额,你们领了吗?

在2024年腾讯云新春采购节优惠活动上&#xff0c;可以领取新年惊喜红包&#xff0c;打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口&#xff0c;如下图&#xff1a; 腾讯云2024新春采购节红包领取 如上图所示&#xff0c;点击“领”红包&#xff0c;每…

【DevSecOps】2024 年需要警惕的 10 大 Web 应用程序安全威胁

【DevSecOps】2024 年需要警惕的 10 大 Web 应用程序安全威胁 由于 2023 年出现了许多创新,我们之前所了解的许多内容都发生了巨大变化;随着其中一些重大变化,威胁格局也发生了转变,一些旧威胁减少了,一些新威胁增加了。 技术每天都在不断变化,当我们谈论技术和相关威胁…
最新文章