String类 ---java

news2025/1/4 16:07:28

目录

一. 常用的字符串的构造

 二. 字符串的源代码

三. 字符串比较  

1. ==  是不能比较字符串的值的

​编辑 2.比较两个字符串 --- compareTo()

 3. 忽略大小写比较 ---compareToIgnoreCase()

四. 字符串转化

1. 数字转字符串 valueOf()

2. 字符串转数字

3. 小写转大写  toUpperCase()

4. 大写转小写  toLowerCase()

5. 字符串转数组  .toCharArray() 

6. 数组转字符串 ---使用构造方法初始化

7. 格式化 

五. 字符串替换 

六. 字符串拆分

 七. 字符串截取

八. 其他操作方法

九. 字符串的修改

StringBuffer和StringBuilder


一. 常用的字符串的构造

1. 使用常量串构造

String s1 = "hello world" ;
System . out . println ( s1 );

2. 直接newString对象

String s2 = new String ( "hello world" );
System . out . println ( s2 );

 3. 使用字符数组

char [] array = { 'h' , 'e' , 'l' , 'l' , 'o' };
String s3 = new String ( array );
System . out . println ( s3 );

 注: Java中" "引起来的也是String类型对象。

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

 二. 字符串的源代码

我们可以看到,

1. String是引用类型,内部并不存储字符串本身字符串实际保存在字符数组中 

例如:

String s1 = new String ( "hello" );
String s2 = new String ( "world" );
String s3 = s1 ;
//这组代码表示是s1 s2 引用的不同的对象, s1 s3引用的是同一对象
简单画图理解一下:(省略了常量池)

2.String类被final修饰,表明该类不能被继承

3. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
public static void main ( String [] args ) {
final int array [] = { 1 , 2 , 3 , 4 , 5 };
array [ 0 ] = 100 ;//引用空间中的内容可以修改
// array = new int[]{4,5,6}; // 编译报错: Error:(19, 9) java: 无法为最终变量 array 分配值
}

 4.String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,  原因是因为字符串存储在字符数组中, 而数组是被private修饰的, 没有设置公开get或set方法, 所以不能修改!

三. 字符串比较  

1. ==  是不能比较字符串的值的

对于内置类型, == 比较的是变量中的值;
对于引用类型,    == 比较的是两个引用变量是否引用的是同一对象, 即比较的是地址
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

 观察下述代码:

 像上述这种初始化方法属于直接赋值, 通过直接赋值所创建的对象直接是方法区中的常量池中的字符串常量。在存放数据之前, 会检查是否已经有该值, 如果有就不再重复存放了. 

所以上述str1和str2 实际上指向的都是常量池中的"good", 是同一块地址

而像上述这样, 属于new对象, 是通过String类的构造方法对其进行初始化, 存放在java虚拟机的堆内存,堆内存里存放的是new对象的地址,字符串常量存放在方法区的常量池中 

构造方法:

我们画图理解一下: 

 2.比较字符串是否相等 --- equals() 

String 类重写了父类 Object equals 方法, Object equals 默认按照 == 比较

使用方法:

 返回类型是boolean类型

查看String类中equals()中的实现方法:

 2.比较两个字符串 --- compareTo()

equals 不同的是, equals 返回的是 boolean 类型,而 compareTo 返回的是 int 类型。具体比较方式:
1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值(ASCII码)
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 )); // 不同输出字符差值  b-c= -1
        System . out . println ( s1 . compareTo ( s3 )); // 相同输出 0
        System . out . println ( s1 . compareTo ( s4 )); // k 个字符完全相同,输出长度差值 -3
}

 3. 忽略大小写比较 ---compareToIgnoreCase()

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类提供的常用查找的方法:

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

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. 数字转字符串 valueOf()

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

2. 字符串转数字

// Integer Double 等是 Java 中的包装类型
int data1 = Integer . parseInt ( "1234" );
double data2 = Double . parseDouble ( "12.34" );
System . out . println ( data1 );
System . out . println ( data2 );

3. 小写转大写  toUpperCase()

public static void main ( String [] args ) {
        String s1 = "hello" ;
        String str = " hello%$$%@#$%world 哈哈哈 " ;
        System . out . println ( s1 . toUpperCase ());  
        System . out . println ( str . toUpperCase ());
}
注:只转字母

4. 大写转小写  toLowerCase()

public static void main ( String [] args ) {
        String s2 = "HELLO" ;
        String str = " HELLO%$$%@#$%WORLD  哈哈哈 " ;
        System . out . println ( s2 . toLowerCase ());
        System . out . println ( s tr. toLowerCase ());
}

5. 字符串转数组  .toCharArray() 

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

6. 数组转字符串 ---使用构造方法初始化

char [] array = { 'h' , 'e' , 'l' , 'l' , 'o' };
String s3 = new String ( array );
System . out . println ( s3 );

7. 格式化 

public static void main ( String [] args ) {
        String s = String . format ( "%d-%d-%d" , 2019 , 9 , 14 );
        System . out . println ( s );
}

 注:所有的对字符串的操作, 都是新创建了一个对象,不影响原来的字符串!!!

五. 字符串替换 

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
String str = "helloworld" ;
System . out . println ( str . replaceAll ( "l" , "_" ));
System . out . println ( str . replaceFirst ( "l" , "_" ));
//结果
he__owor_d
he_loworld

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

六. 字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。

//全部拆分
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 );
}

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

1. 字符 "|"  "*"  "+"  "." 都得加上转义字符,前面加上 "\\" .
 String str = "192.168.1.1" ;
String [] result = str . split ( "\\." ) ;
for ( String s : result ) {
        System . out . println ( s );
}
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用 "|" 作为连字符 .
String str1  = "name=zhangsan&age=18" ;
String [] result1 = str1 . split ( "&|=" ) ;
for ( String s : result1 ) {
        System . out . println ( s );
}

上述也可以写成多重拆分:

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 str = "helloworld" ;
System . out . println ( str . substring ( 5 ));
System . out . println ( str . substring ( 0 , 5 ));
注:
1. 索引从 0 开始
2. 注意前闭后开区间的写法 , substring(0, 5) 表示包含 0 号下标的字符 , 不包含 5 号下标  

八. 其他操作方法

去掉字符串中的左右空白字符(空格, 换行, 制表符等), 保留中间空格---trim()  

String str = " hello world " ;
System . out . println ( "[" + str + "]" );
System . out . println ( "[" + str . trim () + "]" );

九. 字符串的修改

public static void main ( String [] args ) {
String s = "hello" ;
s += " world" ;
System . out . println ( s ); // 输出: hello world
}

上述代码, 虽然实现了字符串的修改, 但是前面我们知道, 对字符串的操作都是创建了一个新的对象, 效率十分低下.  

所以我们要介绍下面两种类: StringBuffer和StringBuilder

StringBuffer和StringBuilder

由于 String 的不可更改特性,为了方便字符串的修改, Java 中又提供 StringBuilder StringBuffer 类。这两个类大部分功能是相同的,这里介绍 StringBuilder 常用的一些方法. 

 

举例:

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.  StringStringBuilder 类不能直接转换。如果要想互相转换,可以采用如下原则 :
    1. String 变为 StringBuilder:
    利用 StringBuilder 的构造方法
    利用 StringBuilder 的append()方法
    2. StringBuilder 变为 String:
    调用 toString() 方法
b. StringBuffer和StringBuilder不能直接赋值
面试题:
String StringBuffer StringBuilder 的区别:
1. String 的内容不可修改, StringBuffer StringBuilder 的内容可以修改 .
2. StringBuffer StringBuilder 大部分功能是相似的.
3. StringBuffer 采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作.

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

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

相关文章

【C指针】深入理解指针(最终篇)数组指针指针运算题解析(一)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

如何解决SSL证书部署后未生效或网站显示不安全

本文介绍SSL证书部署后未生效或网站显示不安全的排查方法。 浏览器提示“您与此网站建立的连接不安全” 浏览器提示“无法访问此页面” 浏览器提示“这可能是因为站点使用过期或者不全的TLS安全设置” 浏览器提示“此页面上部分内容不安全&#xff08;例如图像&#xff09;”…

LeetCode刷题---汉诺塔问题

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述题目会把讲解部分分为3个部分&#xff1a; 1、题目解析 2、算法原理思路讲解 …

c++ pcl出现LNK2019 宏定义 PCL_NO_PRECOMPILE

问题&#xff1a;c pcl使用拟合圆柱时出现LNK2019问题&#xff1b; 说明&#xff1a;lib等配置没有问题&#xff1b; 解决方案 在上述代码中添加如下代码即可 #define PCL_NO_PRECOMPILE 是 C 中的预处理器指令&#xff0c;用于在代码中定义一个宏。而 #undef PCL_NO_PRECOM…

【数电笔记】基本和复合逻辑运算

说明&#xff1a; 笔记配套视频来源&#xff1a;B站 基本逻辑运算 1. 与运算 &#xff08;and gate&#xff09; 2. 或运算 &#xff08;or gate&#xff09; 3. 非运算 &#xff08;not gate &#xff09; 复合逻辑运算 1. 与非运算&#xff08;nand&#xff09; 2. 或非运…

LeetCode Hot100 287.寻找重复数

题目&#xff1a; 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修…

基于YOLOv8深度学习的钢材表面缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python中进行特征重要性分析的8个常用方法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在机器学习和数据科学领域&#xff0c;理解特征在模型中的重要性对于构建准确且可靠的预测模型至关重要。Python提供了多种强大的工具和技术&#xff0c;能够探索特征重要性的各个方面。 本文将详细介绍8种常用…

长沙上市公司董秘联谊会首次活动,到底讲了什么?

“首场活动就这么提振士气&#xff0c;一场干货满满的头脑风暴&#xff0c;真的太荣幸加入这个集体了。”这是可孚医疗科技股份有限公司副总裁、董秘薛小桥参加长沙上市公司董秘联谊会首次活动后的感慨。 11月29日&#xff0c;长沙上市公司董秘联谊会首场活动在爱尔眼科全球总…

【Excel】WPS快速按某列查重数据

查重值 excel列几条数据肉眼可见&#xff0c;如何千万级别数据查验呢&#xff1f;平时很少用&#xff0c;记录一下: 先框选列要验证的数据&#xff0c;然后&#xff1a;开始->条件格式->突出显示单元格规则->重复值 效果

Service的双向跨进程通信

一、客户端向服务端通信。 1、创建AIDL文件&#xff0c;用于生成跨进程通信代码。 // ITestService.aidl package com.example.servicetest;interface ITestService {void sayHello(); } 2、创建服务端Service&#xff0c;添加如下代码。 public class TestService extends…

基于springboot+vue的点餐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

java+springboot学生宿舍公寓管理系统xueshenggongy

经过查阅资料和调查统计发现&#xff0c;高校学生宿舍管理工作变得越来越繁重和琐碎&#xff0c;如在学生住宿安排&#xff08;特别是新生住宿安排&#xff09;、宿舍大幅调换、公共设施统计维护、宿舍杂费统计收取、宿舍卫生管理统计、出入登记记录等各个方法存在着大量问题和…

【Java8系列06】Java8数据计算

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

设计模式之美学习笔记-单例模式-为什么说支持懒加载的双重检测不比饿汉式更优?

单例设计模式&#xff1a;一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类&#xff0c;这种设计模式就叫作单例设计模式&#xff0c;简称单例模式。 实战案例一&#xff1a;处理资源访问冲突 我们先来看第一个例子。在这个例子…

近期知识点随笔

菜单查询&#xff08;编写权限时的细节&#xff09; 菜单查询list为了侧边框展示更完整&#xff08;不报空指针&#xff09; 登录时&#xff08;用户名&#xff09;查询出多个结果&#xff08;保证用户名唯一&#xff09; 文件上传 前端 对权限与菜单绑定的修改&#xff08;实…

LV.12 D21 PWM实验 学习笔记

一、PWD简介 1.1 蜂鸣器工作原理 有源蜂鸣器 有源蜂鸣器只要接上额定电源就可以发出声音 无源蜂鸣器 无源蜂鸣器利用电磁感应原理&#xff0c;为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声 1.2 使用GPIO控制 while(1) { GPX2.DATGPX2.D…

基于SSM实现的图书管理系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 借阅管理 04. 图书管理 05. 读者管理 06. 类型管理…

数据库-MySQL之数据库必知必会17-21章

第17章 组 合 查 询 创建组合查询 可用UNION操作符来组合数条SQL查询。利用UNION&#xff0c;可给出多条SELECT语句&#xff0c;将它们的结果组合成单个结果集。 **例子&#xff1a;**假如需要价格小于等于5的所有物品的一个列表&#xff0c;而且还想包括供应商1001和1002生产…

树莓派系列教程:单总线控制DS18B20

DS18B20是一个比较常用的温度传感器&#xff0c;采用单总线控制&#xff0c;以前用单片机编程控制时严格按照单总线的时序控制&#xff0c;今天来看看在linux系统下如何控制DS18B20,体验一下在linux世界&#xff0c;一切都是文件。 一、修改配置文件 1sudo vi /boot/config.tx…