Java中String类常用方法

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

目录

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"));// -1System.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)   以某个字符串为分割符,限制分割为几个字符串,但不会平均分

//字符串拆分 splitpublic 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\21String 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);//ddfgghjghjString 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,返回类型为booleanpublic 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值

//判断字符串是否是以某段字符串结尾 或开头的 返回booleanpublic static void test7() {String s1 = "asd sdfjlf kkk";System.out.println(s1.endsWith("kkk"));//trueSystem.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);//trueSystem.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 和 StringBuilderpublic 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);//3019start = System.currentTimeMillis();StringBuffer s1 = new StringBuffer("");for (int i = 0; i < 100000; i++) {s1.append(i);}end = System.currentTimeMillis();System.out.println(end - start);//3start = 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 和 StringBuilderpublic static void test5() {StringBuilder stringBuilder = new StringBuilder("asdfghjkl");//逆置字符串  String则没有这个方法stringBuilder.reverse();System.out.println(stringBuilder);}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IT革命浪潮:技术革新如何改变我们的生活与工作

一、技术革新与行业应用 当前的IT行业正处于前所未有的技术革新阶段。其中&#xff0c;量子计算和虚拟现实是两项引人注目的技术。 量子计算&#xff1a;量子计算以其超越传统计算的潜力&#xff0c;正在逐步从理论走向实践。在材料科学、药物研发和气候模型等复杂计算领域&a…

利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像

目录 环境准备 master&#xff08;2C/4G&#xff09; 192.168.88.3 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08;2C/2G&#xff09; 192.168.88.4 docker、kubeadm、kubelet、kubectl、flannel node02&#xff08;…

Ansible自动化运维中的file文件模块模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月21日15点21分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…

向npm发布自己写的vue组件,使用vite创建项目

向npm发布自己写的vue组件&#xff0c;使用vite创建项目 创建项目 pnpm create vite输入项目名称 由于我的组件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安装了下面4个。 然后执行 pnpm i安装依赖 vite.config.ts import { defineC…

linux系统——ps命令的两种参数模式

ps命令后面接参数时&#xff0c;有“—”符号与无此符号&#xff0c;在具体实现功能上有很大区别 能够清晰表达进程之间层级关系

前端菜鸡,对于35+程序员失业这个事有点麻了

“经常看到30岁程序员失业的新闻&#xff0c;说实话&#xff0c;有点麻。目前程序员供求关系并未失衡&#xff0c;哪怕是最基础的前端或者后台、甚至事务型的岗位也是足够的。 事实上&#xff0c;现在一个开出的岗位要找到一位尽职尽责能顺利完成工作的程序员并不是一件那么容…

从零到一:手把手教你将项目部署上线-环境准备

部署步骤 引言1.Java环境配置2.ngnix安装好书推荐 引言 将自己的项目从本地开发环境顺利部署上线&#xff0c;是每个开发者必经的里程碑。今天&#xff0c;我们就从零开始&#xff0c;一步一步教你如何将手中的项目部署到线上&#xff0c;让全世界见证你的创造力。 首先&#x…

必应bing国内广告开户首充和开户费是多少?

微软必应Bing作为国内领先的搜索引擎之一&#xff0c;其广告平台凭借其精准的投放、高效的数据分析和广泛的用户覆盖&#xff0c;已成为众多企业的首选。 根据最新政策&#xff0c;2024年必应Bing国内广告开户预充值金额设定为1万元人民币起。这一调整旨在确保广告主在账户初始…

计算机操作系统总结(1)

1操作系统的概念&#xff08;定义&#xff09;功能和目标 (1)什么是操作系统&#xff1f; &#xff08;2&#xff09;操作系统的功能和目标—作为系统资源的管理者 &#xff08;3&#xff09;操作系统的功能和目标—向上层提供方便易用的服务 &#xff08;4&#xff09;操作系…

vue从入门到精通(四):MVVM模型

一,MVVM MVVM&#xff08;Model–view–viewmodel&#xff09;是一种软件架构模式。MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑&#xff08;数据模型&#xff09;的开发分离开来。详见MVVM 二,Vue中的MVVM Vue虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设…

Xcode代码格式化SwiftFormat安装使用,以及不生效问题

官方仓库地址&#xff1a;GitHub - nicklockwood/SwiftFormat: A command-line tool and Xcode Extension for formatting Swift code 安装SwiftFormat 有两种安装方式&#xff0c;两种方式都可以&#xff0c;二选一即可&#xff1a; 第一种使用brew&#xff0c;如果已经使用…

启动docker报错:Failed to listen on Docker Socket for the API.

说明&#xff1a; 1、安装部署docker完成后&#xff0c;启动docker报错&#xff1a;Failed to listen on Docker Socket for the API&#xff0c;如下图所示&#xff1a; 2、将SocketGroupdocker更改成&#xff1a;SocketGrouproot即可 一、解决方法&#xff1a; 1、执行命令…

文件传输服务应用1——java集成smb2/3实现文件共享方案详细教程和windows共享服务使用配置

在实际项目开发过程中&#xff0c;读取网络资源或者局域网内主机的文件是必要的操作和需求。而FTP&#xff08;文件传输协议&#xff09;和SMB&#xff08;服务器消息块&#xff09;是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点&#xff0c;但同…

MySQL进阶 日志结尾以及8.0新特性

日志结尾 前面我们聊了mysql的undo日志,redo日志,binlog等等,也从一条update语句来分析了一下日志的执行思路以及版本控制是怎么回事,四大特性是怎么实现的等等 今天我们来说说最后一个错误日志 其实用处不大 因为对我们开发人员来说基本上是没有权限来查看错误日志的 一般…

vlan综合实验

一&#xff0c;实验拓扑&#xff1a; 二&#xff0c;实验需求&#xff1a; 1、pc1和pc3所在接口为access;属于vlan 2;P可以骄问pcepces不的一段;其中pc2可以访问pc4/pc5/pc6; 2、pc1/pc3与pc2/pc4/pc5/pc6不在同一网段; 3、所有pc通过DHCP获取Ip地址&#xff0c;且pc1/pc3可以…

BGP选路规则实验

实验拓扑及要求如下 注意&#xff1a; 在完成要求时&#xff0c;默认区域内IGP搭建完成&#xff0c;IBGP和EBGP的对等体关系建立完成 结果演示如下 IBGP内部搭建&#xff1a;使用OSPF IBGP与EBGP对等体建立 要求一&#xff1a;PreVal策略 PV属性默认值为0&#xff0c;规则是…

Vue学习穿梭框Transfer组件

Vue学习Transfer组件 一、前言1、案例一2、案例二 一、前言 在 Vue 3 中使用 el-transfer 组件可以帮助你实现数据的穿梭功能&#xff0c;让用户可以将数据从一个列表转移到另一个列表。下面是一个简单示例&#xff0c;演示如何在 Vue 3 中使用 el-transfer 组件&#xff1a; …

【加密与解密(第四版)】第二十二章笔记

第二十二章 补丁技术 补丁&#xff1a;文件补丁&#xff08;修改文件本身的某个数据&#xff09;和内存补丁&#xff08;对正在运行的程序的数据进行修改&#xff0c;以达到某种效果&#xff09; 22.1 文件补丁 文件补丁直接修改可执行文件或某功能模块的二进制代码。 22.2 内…

小而美:两步完成从源码到应用的极简交付

作者&#xff1a;花三&#xff08;王俊&#xff09; Serverless 应用引擎 SAE 是阿里云推出的一款零代码改造、极简易用、自适应弹性的容器化应用托管平台&#xff0c;面市以来为几万家企业客户提供服务&#xff0c;运行稳定&#xff0c;广受好评。 SAE 的出现解决了众多企业…

黑马点评1——短信篇(基于session)

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…