Java中String类常用方法

news2024/11/16 13:36:11

写笔记记录自己的学习记录以及巩固细节

目录

1.String类的常用方法

1.1 字符串构造

1.2 String对象的比较

1.2.1 比较两个字符串是否相等

 1.2.2 比较两个字符串的大小

1.3 字符串查找

1.4 字符串的转化

1.4.1 字符串转整数

1.4.2  字符串转数字

1.4.3 大小写的转换

 1.4.4 字符串与数组之间转换

 1.4.5 格式化输出

1.5 字符串的替换

1.6 字符串的拆分

1.7 字符串的截取

1.8 其他操作方法

1.8.1 trim()

1.8.2 contains() 

 1.8.3 endWith(),startsWith()

1.9 字符串常量池

1.10 字符串的不可变性

1.11 字符串的修改

2. StringBuilder和StringBuffer

2.1 StringBuilder介绍

2.2 两者的主要区别


1.String类的常用方法

1.1 字符串构造

//两种方法一样,常用第一种
String str1 = "hello";//直接指向常量池,常量池中的哈希值指向"hello"数组
String str2 = new String("abc");//凡是new的都是在堆上开辟空间,堆上的空间再指向String的地址

//字符数组
char[] chars = {'a', 'v', 's', 'd'};
String str3 = new String(chars);
System.out.println(str3);

str1 是在常量池中创建一个新的String对象

只要是引号引出来的值都会存放在常量池中

str2 是使用了new方法在堆上开辟了一个String大小的空间

chars 是一个字符数组,直接在堆上开辟空间

str3 在堆上new了一个String对象

所有String对象中都有一个value和hash,其中value指向一个字符数组

1.2 String对象的比较

1.2.1 比较两个字符串是否相等

s1.equals(s2)方法     判断s1,s2两字符串的值是否相等,返回boolean值

s1.equalsIgnoreCase(s2)    忽略字母的大小写进行比较,返回boolean值

 使用注意事项:最好把要比较的字符串放前面,可以避免空指针的风险

String string1 = new String("aaaaa");
//string1 = null;
//若使用空指针则不能 '.',会报错
System.out.println(string1.equals("aaaaa"));//若string1为null,则系统报错
//而使用"aaaaa"在前可以避免空指针异常的风险
System.out.println("aaaaa".equals(string1));

"=="比较的是两个字符串的地址是否相同

"equals"比较的是连个字符串的值是否相等

//利用new出来的字符串才算开辟新的空间
//但只要出现引号引起来的数据就会存放在在常量池中
String string1 = new String("aaaaa");
String string2 = new String("aaaaa");
//两个哈希地址一样,即都指向常量池同一个位置
System.out.println(string1.hashCode());//92567585
System.out.println(string2.hashCode());//92567585
//但 == 的结果为false,即在堆上的地址不同
System.out.println(string1 == string2);//false       == 比较的是两个变量的地址是否相等
System.out.println(string1.equals(string2));//true   equals比较的是具体值是否相等

有图可知,String虽然创建出了两个相同的值,但是在堆上开辟了两个不同地址的String对象,但两个String对象中的value指向的常量字符数组是同一个。

 1.2.2 比较两个字符串的大小

s1.compareTo(s2)      比较s1,s2的大小,若s1 > s2返回正值,反之返回负值,若相等返回0

s1.compareToIgnoreCase(s2)   忽略大小写进行比较,返回值和compareTo()一样

//比较字符串的大小
    public static void test2() {
        String s1 = new String("hello");
        String s2 = new String("Hello");

        int ret = s1.compareTo(s2);
        //忽略大小写进行比较
        ret = s1.compareToIgnoreCase(s2);
        if (ret > 0) {
            System.out.println("s1 > s2");
        } else if (ret < 0) {
            System.out.println("s1 < s2");
        } else {
            System.out.println("s1 == s2");
        }
    }

1.3 字符串查找

s1.charAt(i)   返回s1中下标为i的字符

s1.indexOf('ch')  从字符串第一个字符查找,返回第一次出现’ch'字符的下标,停止查找

s1.indexOf('ch',i)  从下标为i的位置开始往后查找,返回第一次出现’ch'字符的下标

s1.indexOf("String" )从头开始查找,返回第一次出现"String"的第一个字符的下标 

s1.indexOf("String",i)    同上

s1.lastIndexOf( )  从尾部开始往前查找,用法和前面一样

//字符串中查找字符
    public static void test3() {
        String s1 = new String("haekasdj");
        for (int i = 0; i < s1.length(); i++) {
            //charAt(i) 拿到某个位置的字符
            char ch = s1.charAt(i);
            System.out.println(ch);
        }
        //indexOf(),查找,若找到返回下标,找不到返回-1
        //indexOf('char') 从头开始找,遇到第一个查找的字符就结束,  返回找到字符的下标
        System.out.println(s1.indexOf('a'));
        //indexOf('char',i)从i下标开始找,找到第一个查找的字符就停止 ,返回该下标
        System.out.println(s1.indexOf('a', 3));
        //indexOf("String")从头开始找,找到第一个字符串第一个字符的下标
        System.out.println(s1.indexOf("abc"));// -1
        System.out.println(s1.indexOf("aek"));// 1
        //从下标3开始找,返回第一个找到的字符串第一个字符的下标
        System.out.println(s1.indexOf("asd",3));

        //lastIndexOf()从后往前找,和以上用法相同
        System.out.println(s1.lastIndexOf('a'));
    }

1.4 字符串的转化

1.4.1 字符串转整数

String.valueOf()

参数转字符串

s1 = String.valueOf()

参数可以是int,char,long,float,boolean,double一类的数字

也可以是类Object

字符串  char[]

//valueOf  把参数转化为字符串
String s1 = String.valueOf(1234);
System.out.println(s1);
String s2 = String.valueOf("alskdjlkajsd");
System.out.println(s2);
//转换类时,该类中必须重写ToString方法
String s3 = String.valueOf(new Student("xiaoli", 12));
System.out.println(s3);

 输出

1234
alskdjlkajsd
Student{name='xiaolei', age=12}

1.4.2  字符串转数字

Interger.parseInt() 

Double.parseDouble()   

//parseInt/parseDouble 字符串 转 整数
int a1 = Integer.parseInt("123123123");
System.out.println(a1);

double a3 = Double.parseDouble("12309.1203");
System.out.println(a3);

1.4.3 大小写的转换

toUpperCase()    //字符串中字母全部转大写

toLowerCase()    //字符串中字母全部转小写

//toUpperCase() 小写转大写 汉字不变
String s1 = "hellGtasT高";
String ret = s1.toUpperCase();
System.out.println(ret);

//toLowerCase() 大写转小写 汉字不变
ret = s1.toLowerCase();
System.out.println(ret);

 输出

HELLGTAST高
hellgtast高

 1.4.4 字符串与数组之间转换

toCharArray()

没有toIntArray(),因此不能用整数数组接收

 String s1 = "asdasd";
//字符串转数组
char[] ch = s1.toCharArray();
System.out.println(Arrays.toString(ch));

//数组转字符串
String s2 = new String(ch);
System.out.println(s2);
//不能将字符串转换成整数数组
//int[] arr = "123123".toCharArray();

 1.4.5 格式化输出

String.format()    可以像C语言那样控制格式输出

//格式化输出 String.format()
    public static void test1() {
        String s1 = String.format("%d,%d,%d", 2024, 4, 21);
        System.out.println(s1);//2024,4,21
    }

1.5 字符串的替换

s1.replace('oldChar', 'newChar')   将字符串的某个字符替换为新字符,返回一个新的字符串

s1.replace("String", "String")  将某个字符串替换为新的字符串,返回一个新的字符串

s1.replaceFirsrt()   将第一个old字符或字符串替换为新的

//将字符串中的某个字符替换,返回一个新的字符串
        String s1 = "asdasdasd";
        String ret = s1.replace('a', 'd');
        System.out.println(ret);//dsddsddsd

        //也可以将某段字符替换为任意字符串
        String s2 = "asdasdasdasd";
        String ret2 = s2.replace("asd", "qweqwe");
        System.out.println(ret2);//qweqweqweqweqweqweqweqwe

        //替换第一个字符串  或字符
        String s3 = "asdasdasd";
        String ret3 = s3.replaceFirst("asd", "asdfgdfgfgh");
        System.out.println(ret3);//asdfgdfgfghasdasd

1.6 字符串的拆分

s1.split(char)   以某个字符为分割符,返回一个字符串数组

s1.split(char,int)   以某个字符串为分割符,限制分割为几个字符串,但不会平均分

//字符串拆分 split
    public static void test3() {
        //是该字符串根据某个字符分割开,返回一个字符串数组
        String s1 = "zhangsan wangwu 爱上了的骄傲 zhao2";
        String arr[] = s1.split(" ");
        System.out.println(arr.length);
        System.out.println(Arrays.toString(arr));
        //[zhangsan, wangwu, 爱上了的骄傲, zhao2]

        //多加一个limit参数,即控制分组的数量(但不会平分,会找打第一个分隔符进行分割)
        String arr_[] = s1.split(" ", 2);
        System.out.println(Arrays.toString(arr_));
        //[zhangsan, wangwu 爱上了的骄傲 zhao2]

        // '.' 和 '\'很特殊,需要\\进行转义
        String s2 = "2024.4.21";
        String arr2[] = s2.split("\\.");
        System.out.println(Arrays.toString(arr2));//[2024, 4, 21]
        String s3 = "2024\\4\\21";
        System.out.println(s3);//2024\4\21
        String arr3[] = s3.split("\\\\");//表示分隔符为"\\"
        System.out.println(Arrays.toString(arr3));//[2024, 4, 21]

        //多个分割符,用|来分割分隔符
        String s4 = "asd&gaf fdgg.asddsasd";
        String arr4[] = s4.split("&| |\\.");//表示三个分隔符 & 和 ' ' 和 '.'
        System.out.println(Arrays.toString(arr4));//[asd, gaf, fdgg, asddsasd]
    }

1.7 字符串的截取

s1.substring(int)    从下标int作为新字符串的头,从该下标开始到尾部截取原s1,返回新字符串

s1.substring(int m,int n)  截取s1的下标[m,n),返回新字符串   

//截取字符串 substring(int)
    public static void test4() {
        String s1 = "asddfgghjghj";
        //从某个下标开始往后作为一个新字符串的第一个字符[2,tail]
        String ret1 = s1.substring(2);
        System.out.println(ret1);//ddfgghjghj
        String ret2 = s1.substring(2, 5);//[2,5),即下标为2,3,4的字符作为新字符串
        System.out.println(ret2);//ddf
    }

1.8 其他操作方法

1.8.1 trim()

s1.trim()  除去s1两端的空格

//除去字符串左右两边的空格trim()
    public static void test5() {
        String s1 = "    asdjlkw   asd   ";
        System.out.print(s1);
        System.out.println("ppppppppppppppppppp");


        String s2 = "    asdwasd  fgdh   ";
        String ret2 = s2.trim();
        System.out.print(ret2);
        System.out.println("pppppppppppppppppp");
}

 输出

    asdjlkw   asd   ppppppppppppppppppp
asdwasd  fgdhpppppppppppppppppp

1.8.2 contains() 

s1.contains("String")   判断s1中是否有String片段  ,返回boolean值

//判断字符串中是否包含 某一段字符串contains,返回类型为boolean
    public static void test6() {
        String s1 = " hello  asdkhello";
        System.out.println(s1.contains("hello"));//true
    }

 1.8.3 endWith(),startsWith()

s1.endWith("String")  判断s1是否以String结尾

s1.startsWith("String") 判断s1是否以String开头    返回boolean值

//判断字符串是否是以某段字符串结尾 或开头的 返回boolean
    public static void test7() {
        String s1 = "asd sdfjlf kkk";
        System.out.println(s1.endsWith("kkk"));//true
        System.out.println(s1.startsWith("asd"));//true
    }

1.9 字符串常量池

凡是出现在双引号中的值,都会被保存在字符串常量池中。

凡是使用new关键字开辟的新空间都是在堆上。

如果没使用new开辟空间,那么对于常量池所存在的数据,有且只能有一个,也就是多个变量可以指向同一个空间

双引号中的数据  系统会先检查常量池中是否有该数据
如果有就直接引用  如果没有就会把该常量放进去
即在常量池中只会维护一个“abcd"对象
public static void test1() {
        //双引号中的数据  系统会先检查常量池中是否有该数据
        //如果有就直接引用  如果没有就会把该常量放进去
        //即在常量池中只会维护一个“aaaaa"对象
        String s1 = "aaaaa";
        String s2 = "aaaaa";

        //在堆上开辟空间 这个堆上的地址中的value指向的是常量池中的数据
        String s3 = new String("aaaaa");
        String s4 = new String("aaaaa");

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

        System.out.println(s3 == s4);//false   //堆上的地址不一样

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

1.10 字符串的不可变性

String类中的字符实际保存在内部维护的value字符数组中

1. String类被final修饰,表名该类不能被继承

2. value被final修饰,表示value自身的值不能改变,既不能引用其它字符数组,但是其引用空间的内容可以被修改

3. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

1.11 字符串的修改

字符串的修改实际上是创建了新的对象

在循环中进行字符串拼接时,String在每次拼接时都是创建新的对象,很费时间

//在循环中进行字符串拼接时,String在每次拼接时都是创建新的对象,很费时间
    //StringBuffer 和 StringBuilder是根据原来对象进行拼接
    //在循环拼接字符串最好使用StringBuffer 和 StringBuilder
    public static void test3() {
        long start = System.currentTimeMillis();
        String s = "";
        for (int i = 0; i < 100000; i++) {
            s += i;
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);//3019

        start = System.currentTimeMillis();
        StringBuffer s1 = new StringBuffer("");
        for (int i = 0; i < 100000; i++) {
            s1.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);//3


        start = System.currentTimeMillis();
        StringBuilder s2 = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            s2.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);//2
    }

2. StringBuilder和StringBuffer

2.1 StringBuilder介绍

//String拼接的实质
    public static void test4() {
        String s1 = "abcd";
        //循环内的相当于 s1 += i
        //即String的拼接每次都会 创建一个新的对象以及两次拼接和一次转换
        for (int i = 0; i < 100; i++) {
            StringBuilder sb = new StringBuilder();
            sb.append(s1);
            sb.append(i);
            s1 = sb.toString();//类型转换
        }
        System.out.println(s1);


        //以上代码可以简化为如下
        StringBuilder stringBuilder = new StringBuilder("abcd");
        for (int i = 0; i < 100; i++) {
            stringBuilder.append(i);
        }
        System.out.println(stringBuilder);
    }

2.2 两者的主要区别

//StringBuffer 和 StringBuilder
    public static void test5() {
        StringBuilder stringBuilder = new StringBuilder("asdfghjkl");
        //逆置字符串  String则没有这个方法
        stringBuilder.reverse();
        System.out.println(stringBuilder);
    }

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

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

相关文章

[Redis]使用和原理

Redis介绍 Redis 是⼀种基于键值对的 NoSQL 数据库&#xff0c; Redis 可以满足很多的应用场景&#xff0c;而且因为 Redis 会将所有数据都存放再内存中&#xff0c;所以它的读写性能非常惊人。不仅如此&#xff0c;Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上…

数据库的事务四大特性(ACID)以及详解隔离性以及隔离级别

目录 一、事务相关概念 1、事务 2、事务的本质 3、回滚 4、事务使用 5、事务的四大特性 1、原子性&#xff08;Atomicity&#xff09; 2、一致性&#xff08;Consistency&#xff09; 3、隔离性&#xff08;Isolation&#xff09; 4、持久性&#xff08;Durability&a…

专业级润滑油,一站式批发服务

要为机械设备提供持久稳定的动力保障吗&#xff1f;选择我们的专业级润滑油&#xff0c;让您的设备运转更顺畅&#xff0c;效率更高。 我们专业从事润滑油批发多年&#xff0c;以优质的产品、合理的价格和完善的服务赢得了广大客户的信赖。无论是汽车、机械还是工业设备&#x…

Python中动态调用C#的dll动态链接库中方法

在Python中调用C#的dll库_哔哩哔哩_bilibili 环境准备&#xff1a; 安装 pythonnet pip install pythonnet在Python中调用C#动态链接库&#xff08;DLL&#xff09;&#xff0c;可以使用pythonnet库&#xff0c;它允许直接使用 .NET 的程序集。以下是一个示例&#xff0c;…

话题:如何让大模型变得更聪明?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而&#xff0c;如何让大模型变得更聪明&#xff0c;进一步提升其性能和应用效果&a…

Softing工业推出新品edgeGate:一款用于工业边缘和云应用的硬件网关

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing工业自动化在2024年汉诺威工业博览会上首次展示了新品edgeGate。该产品是一个无需维护的硬件物联网网关解决方案&#xff0c;可将生产数据从PLC和数控机床控制器传输至工业边缘及物联网云平台。 &#xff08;edge…

重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一种方式_继承extends Thread方法 1.定义一个类,继承Thread 2.重写run方法,在run方法中设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码) 3.创建自定义线程…

光伏企业都在用的户用光伏管理软件——鹧鸪云

随着全球对可再生能源和清洁能源的需求日益增长&#xff0c;光伏产业作为其中的佼佼者&#xff0c;正迎来前所未有的发展机遇。然而&#xff0c;随着光伏电站规模的扩大和分布范围的增加&#xff0c;如何高效、智能地管理这些电站&#xff0c;确保它们稳定、安全地运行&#xf…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说&#xff0c;资源条件总是有限的&#xff0c;为了实现战略目标&#xff0c;则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点&#xff0c;如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

java如何获取IP和IP的归属地?

在Java中&#xff0c;获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式&#xff08;如HTTP请求&#xff09;获取的远程IP地址。代码案例如下: 而要获取IP的归属地&#xff08;地理位置信息&#xff09;&#xff0c;则通常需要使用第三方IP地址查询服务&#xff0c;我…

【JAVA |再谈接口、Object、内部类】Object类中子类重写,Cloneable 接口、比较器、内部类

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

element-plus:踩坑日记

el-table Q&#xff1a;有fixed属性时&#xff0c;无数据时&#xff0c;可能出现底部边框消失的bug 现象&#xff1a; 解决方法&#xff1a; .el-table__empty-block {border-bottom: 1px solid var(--el-table-border-color); } el-collapse 折叠面板 Q&#xff1a;标题上…

Java操作Word文档,根据模板生成文件

Java操作Word文档 poi-tl介绍 官方文档&#xff1a;https://deepoove.com/poi-tl/ poi-tl&#xff08;poi template language&#xff09;是Word模板引擎&#xff0c;使用模板和数据创建很棒的Word文档。 在文档的任何地方做任何事情&#xff08;Do Anything Anywhere&#…

在全志H616核桃派开发板上配置I2C引脚并读取温度数据

配置引脚 找到板子上的i2c引脚 为了方便查找&#xff0c;我们加入了一个显示功能引脚位置的功能&#xff0c;运行以下命令&#xff0c;查看板子的40pin引脚上有几个可用i2c gpio pin i2c启用i2c 我们使用set-device指令来使能/关闭指定设备的底层驱动&#xff0c;使能后&am…

视频汇聚/云存储/安防监控EasyCVR接入GB28181设备未回复ack信息的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 用户反馈&#xff0c;设备通过国标GB28181注…

Docker 容器间通讯

1、虚拟ip/访问 同一网络 安装docker时&#xff0c;docker会默认创建一个内部的桥接网络docker0&#xff0c;每创建一个容器分配一个虚拟网卡&#xff0c;容器之间(包括宿主机)可以根据分配的ip互相访问(ps:其他主机(包括其他主机的容器)无法ping通docker容器ip无法访问&#…

RepOptimizer原理与代码解析(ICLR 2023)

paper&#xff1a;Re-parameterizing Your Optimizers rather than Architectures offcial implementation&#xff1a;https://github.com/dingxiaoh/repoptimizers 背景 神经网络的结构设计是将先验知识融入模型中。例如将特征转换建模成残差相加的形式&#xff08;\(yf(x…

Zoho CRM怎么样?云衔科技为企业提供采购优惠!

企业对于客户关系管理&#xff08;CRM&#xff09;系统的需求日益增加&#xff0c;Zoho CRM作为一款备受赞誉的国际CRM服务提供商&#xff0c;凭借其全面的功能、出色的用户体验和卓越的性价比&#xff0c;成为了众多企业数字化转型的得力助手。 Zoho CRM是一款覆盖客户全生命…

Vue状态管理深度剖析:Vuex vs Pinia —— 从原理到实践的全面对比

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f44b; 引言&#x1f4cc; Vuex 基础知识核心构成要素示例代码 &#x1f4cc; Pinia 基础知识核心构成要素示例代码 &#x1f4cc; Vuex与Pinia的区别&#x1f4cc; 使用示例与对比&#x1f4cc; 总结 &#x1f44b;…