String类 ---java

目录

一. 常用的字符串的构造

 二. 字符串的源代码

三. 字符串比较  

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未采用同步处理,属于线程不安全操作.

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

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

相关文章

树莓派多串口通信

树莓派多串口通信 串口配置串口通信函数分析串口通信示例代码 参考博文1&#xff1a;树莓派 4 UART 多串口配置通信参考博文2&#xff1a;树莓派wiringPi库详解关于树莓派相关其他环境配置可参考&#xff1a;快速上手树莓派关于wiringPi库初始化与IO口开发可参考&#xff1a;树…

OpenLayer库的学习入门总结

前言&#xff1a; 作者跟随视频学习ol库的调用与功能实现&#xff0c;进行初步总结与回顾。 声明&#xff1a;参考新中地的文档&#xff0c;进行作者日后复习再次学习的简化。 1、WebGIS简介 GIS的核心概念 GIS&#xff08;Geographic Information System&#xff09;是一…

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…

中断方式的数据接收2

Echo实验 回忆之前的实验因为数据处理的过程可以瞬间完成所以可以把数据处理的操作放在中断服务函数中执行 但是数据处理要是时间过长就将数据缓存处理 当使用中断方式接收数据的时候 一般有两种方式 数据处理的时间较短可放在中断服务函数内处理&#xff08;就地处理&#…

【Linux--进程】

目录 一、基本概念1.1描述进程-PCB1.2task_struct中内容分类 二、了解进程2.1查看进程2.2通过系统调用获取进程标识符 三、fork创建进程3.1fork()函数3.2写时拷贝 四、进程的状态4.1操作系统学科里的进程状态&#xff08;运行、阻塞、挂起&#xff09;4.具体的Linux状态是如何维…

LinuxBasicsForHackers笔记 --常用Linux命令

在终端中修改用户密码命令&#xff1a;passwd Linux的文件系统是逻辑文件系统。 Linux基本命令 pwd – print working directory. 返回你当前所在目录结构中的位置。 whoami – 查看您当前登录的用户身份。 cd – change directory. 从终端更改目录。 cd / – 移动到根目录…

大数据实战项目_电商推荐系统

一、 项目介绍 HadoopSpark (Python)Scala SparkSQLSparkStreaming MongoDB Redis Kafka Flume ( SpringMVC vue) 1 项目介绍 1.1 项目系统架构 项目以推荐系统建设领域知名的经过修改过的中文亚马逊电商数据集作为依托&#xff0c;以某电商网站真实业务数据架构为基…

openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数

文章目录 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数139.1 操作步骤139.2 异常处理 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数 如果应用程序与数据库的连接数超过最大值&#xff0c;则新的连接无法建立。建议每天检查连…

淘宝商家店铺注册流程

如果本身已经有淘宝账号了&#xff0c;直接从第三步骤&#xff1a;创建店铺开始就可以了。一、注册淘宝账号、支付宝账号 首先,如果你有买家账号,是可以直接拿来开店的&#xff0c;不用单独在注册淘宝账号开店。 注意事项: 1:淘宝账号注册后,不能修改,如果会员名有写错情况&a…

【多线程】-- 10线程同步synchronized方法/块

多线程 6 线程同步 同步方法 由于我们可以通过private关键字来保证数据对象只能被方法访问&#xff0c;所以我们只需要针对方法提出一套机制&#xff0c;这套机制就是synchronized关键字&#xff0c;它包括以下两种用法&#xff1a; ​ synchronized方法和synchronized块 …

初始化 Clouder Manager 数据库报错Unable to find JDBC driver for database type: MySQL

CDH部署初始化 Clouder Manager 数据库报错。 解决方法&#xff1a; 把mysql驱动放到 /usr/share/java/目录下面(没有的新建&#xff09;&#xff0c;驱动名称也要修改为mysql-connector-java.jar 再次执行后成功&#xff1a; sudo /opt/cloudera/cm/schema/scm_prepare_data…

javaweb mybatis(手动jar包)

基础&#xff1a;https://blog.csdn.net/qq_67832732/article/details/134764134 条件查询 在映射文件的SQL配置中配置参数 使用parameterType来指定参数类型 使用#{参数名}来接收参数的值 parameterType"string" 表示sql语句需要一个参数&#xff0c;类型为字符…

串行口的工作原理及应用

前言 对最近串行口的学习进行一下总结。 参考链接 【51单片机】串口通信 - 知乎 (zhihu.com) LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;_proteus数码管显示-CSDN博客 定时器/计数器的应用-CSDN博客 74ls164_百度百科 (baidu.com) 74ls165中文资…

Kafka 的特点和优势

Apache Kafka 作为一款分布式流处理平台&#xff0c;以其独特的特点和卓越的优势成为实时数据处理领域的瑰宝。本文将深入研究 Kafka 的各项特点和优势&#xff0c;并通过详实的示例代码展示其在不同场景下的强大应用。 高吞吐量和水平扩展 Kafka 的设计注重高吞吐量和水平扩…

使用外部编辑器编辑执行MAXScript代码的方法

如何使用外部编辑器编辑执行MAXScript代码&#xff1f;这里我们要借助一个3dMax插件程序MXSCOM&#xff0c;MXSCOM允许从外部代码编辑器编辑和执行3ds Max MaxScript和Python文件。 2005年&#xff0c;Simon Feltman发布了第一个MXSCOM&#xff0c;这是一个小型的Visual Basic …

【Delphi】实现彩色日志显示框

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…

根据关键词写作文章的软件,根据标题写作文章的工具

在当今信息化时代&#xff0c;人工智能技术的飞速发展&#xff0c;智能AI写作工具逐渐成为文案创作者的得力助手。这些工具不仅能够根据标题迅速生成文章&#xff0c;而且在提高创作效率的同时&#xff0c;也为我们节省了大量时间和精力。 人工智能的基本原理&#xff1a;人工智…

Python遥感开发之快速判断TIF数据为空

Python遥感开发之快速判断TIF数据为空 前言&#xff1a;介绍一下如何使用python下的gdal读取tif数据的时候&#xff0c;快速判断该tif数据是否为空&#xff0c;如果为空的话就把当前的tif删掉。 如图所示&#xff0c;通过arcgis查看箭头指向的为空值。 仅通过文件的大小无法判…

java 工具类: CompareUtils(比较对象字段值变化)

一、前言 我们在工作中&#xff0c;可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面&#xff0c;记录每次修改的变化。我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化, 这样我们就可以知道数据做了哪些改变. 二、条件限制 在写这个通用…

【Leetcode题单】(01 数组篇)刷题关键点总结01【数组的遍历】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结01【数组的遍历】&#xff08;4题&#xff09; Easy数组的遍历485. 最大连续 1 的个数 Easy495. 提莫攻击 Easy414. 第三大的数 Easy628. 三个数的最大乘积 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系…