认识Java中的String类

前言

大家好呀,本期将要带大家认识一下Java中的String类,本期注意带大家认识一些String类常用方法,和区分StringBuffer和StringBuilder感谢大家收看

一,String对象构造方法与原理

String类为我们提供了非常多的重载的构造方法让我们构造字符对象,感兴趣可以点开源码看看,下面介绍常用四种以及使用场景

1.常量池直接构造:最简便的构造方式,栈中创建的对象的引用指向常量池中的对象,如下图str

2.使用new构造:在堆区中开辟一片空间存放字符对象,如下图str1

3.字符数组构造:New的String对象传入一个字符数组构造字符对象,如下图str2

4.字节数组构造:利用字节数组构造,此时需注意字节数组中存放字母的ACCII码值,构造时需选择编码格式,一般使用UTF-8编码格式进行编码如下图str3

public class Test {public static void main(String[] args) throws UnsupportedEncodingException {String str="helloWorld";//直接构造String str1=new String("helloWorld");//new出对象char[] ch={'h','e','l','l','o','W','o','r','l','d'};String str2=new String(ch);//字符数组构造byte[] bytes = {104, 101, 108, 108, 111}; // 字节数组,对应ASCII "hello"String str3 = new String(bytes, "UTF-8"); // 使用UTF-8编码构造字符串System.out.println(str+"\n"+str1+"\n"+str2+"\n"+str3);}
}

值得一提利用字符数组和字节数组有常见的构造方法

表示截取var1字数数组中从var2到var3的字符构造字符串,截取的区间左闭右闭,例如

二,String对象的不可变性

String对象一经创建,便不可更改,更改的话,只会在创建一个新的对象,把更改过后的内容放进去,这个就是String对象的不可变性,String的这个特性使的对String对象的操作相对低效,于是StringBuilder类就可以提高我们的效率。后面介绍StringBuilder类时会详细说明

三,String类中的常用方法

1,字符串转换

(1)大小写转换

java中使用toUpperCase和toLowercase对字符串进行大小写转换,注意这个方法不会改变原来字符串,而是返回一个新的字符串

public class Test1 {public static void main(String[] args) {String str="HELLO";String str1=str.toLowerCase();System.out.println(str1);String str2="hello";String str3=str2.toUpperCase();System.out.println(str3);}
}
(2)字符串和数值转换

Java中,如果想把一个子符转成数值需要用到它们对应类型的包装类,同样,把任意类型对象转成字符串需要用到String的valueOf方法,如下

public class Test1 {public static void main(String[] args) {String s="1234";System.out.println(Integer.parseInt(s));int i=1234;System.out.println(String.valueOf(i));}
}
(3)字符串转数组

字符串对象调用toCharArray方法,返回一个字符数组,可以得到字符串中每个字符,然后,我们可以遍历这个数组打印观察其中的字符

public class Test1 {public static void main(String[] args) {String str="hello";char[] ch=str.toCharArray();for (int i=0;i<ch.length;i++){System.out.println(ch[i]);}}
}

(4)格式化

String类调用format方法,优点在于可以更方便地创建复杂的输出字符串,特别是在需要格式化输出的时候,学过C语言的小伙伴们应该不陌生,例如

public class Test1 {public static void main(String[] args) {String str="hello";String str1="World";int i=10;System.out.println(String.format("%s %s %d", str, str1,i));}
}

2,寻找字符

(1)寻找某个下表对应字符--charAt

String对象调用charAt(in i)方法,传入一个字符串对应字符的下标,返回对应下标的字符,源码如下

顺带一提如果字符由数字组成也返回一个数字字符

public class Test1 {public static void main(String[] args) {String str="hello";String str1="World";String str3="16774";char ch=str3.charAt(1);char ch1=str1.charAt(0);System.out.println(ch);System.out.println(ch1);}
}
(2)寻找某个字符首次出现位置--indexOf

String对象调用Indexof方法传入一个字符,返回对应字符首次出现的下标值,它还可以在传入一个int值表示从这个int值对应的下表开始找对应字符,没找到返回-1。

public class Test1 {public static void main(String[] args) {String str="Hello World";System.out.println(str.indexOf("l"));System.out.println(str.indexOf("l",5));//只传入一个数,表示从5下标一直找到结尾}
}

(3)从字符串末尾开始向前找字符--lastIndexof

与indexof用法类似,不过这次是从后向前找字符,没找到则返回-1

public class Test1 {public static void main(String[] args) {String str="Hello World";System.out.println(str.lastIndexOf("l"));System.out.println(str.lastIndexOf("l",5));//传入一个数,表示从5一直向前找}
}

3,字符串比较

(1)==

实质上是比较字符串的地址,同一地址返回true否则返回false

public class Test1 {public static void main(String[] args) {String str="Hello";String str1=new String("Hello");String str2="Hello";String str3=new String("Hello");System.out.println(str==str1);//前面已经讲过字符串的构造,很明显地址不同System.out.println(str==str2);//都在常量池中地址相同System.out.println(str1==str3);//每次new都会在堆区开辟空间,二者地址不同}
}
(2)equals

只比较字符串内容,与地址无关(String内部重写了这个方法)

public class Test1 {public static void main(String[] args) {String str = "Hello";String str1 = new String("Hello");String str2 = "Hello";System.out.println(str.equals(str1));System.out.println(str.equals(str2));System.out.println(str1.equals(str2));}
}

(3)compareTo

这部分内容我们在接口部分讲过,主要是我们重写Comparable接口中的compareTo方法来比较两个字符类型的大小。注意String类是重写了compareTo这个方法的,我们直接使用即可,它会根据比较字符的大小返回一个整型值,对这部分内容感兴趣的朋友们可以看看CSDN这篇文章,下面说明String对象如何调用这个方法

public class Test {public static void main(String[] args) {String s="hello";String s1="world";System.out.println(s.compareTo(s1));//s小于s1,返回一个小于0的数System.out.println(s1.compareTo(s));//s1大于s,返回一个大于0的数System.out.println(s.compareTo(s));//相同字符串返回0}
}

4,字符串操作

(1)替换操作--replace

使用replace方法可以把字符串中特定的所有字符替换成指定字符

public class Test {public static void main(String[] args) {String s = "hello,world";String s1 = s.replace("l", "s");System.out.println(s+"\n"+s1);}
}

当然,这个方法会返回一个新对象,不会对原来字符串做任何修改

(2)分裂操作--split

Java中有将字符串根据指定字符拆分成几个子字符串的方法

由源码可以看出,这个方法传入一个字符,返回一个String类型的数组,我们可以通过遍历得到这个数组每个元素

public class Test {public static void main(String[] args) {String s = "hello,world";String[] str=s.split("l");for (int i = 0; i <str.length; i++) {System.out.println(str[i]);}}
}

当然也可以传入一个字符串

public class Test {public static void main(String[] args) {String s = "hello,world";String[] str=s.split("ll");for (int i = 0; i <str.length ; i++) {System.out.println(str[i]);}}
}

当然,要是没有这个字符那么这个字符串就不会被分割

public class Test {public static void main(String[] args) {String s = "hello,world";String[] str=s.split("k");for (int i = 0; i <str.length ; i++) {System.out.println(str[i]);}}
}

四,StringBuffer与StringBuilder应用与区分

StringBuffer与StringBuilder用法和功能都是类似的,区别就在于StringBuilder对字符串的操作都是在原字符之上修改,并不会创建新的对象,这就使得StringBuiler效率优于String类,举个例子,StringBuilder类有一个append的拼接字符串的方法,这个方法就会比String类通过+=拼接效率更高

import java.util.Timer;public class Test {public static void main(String[] args) {String s = "hello";StringBuilder s1 = new StringBuilder("hello");Long time1=System.currentTimeMillis();//记录当前时间for (int i = 0; i <10000 ; i++) {s+="i";}Long time2=System.currentTimeMillis();for (int i = 0; i < 10000; i++) {s1.append("i");}Long time3=System.currentTimeMillis();System.out.println(time2-time1);System.out.println(time3-time2);}
}

另外,StringBuilder对象可以通过toString方法转化成String对象

public class Test1 {public static void main(String[] args) {StringBuilder s1 = new StringBuilder("hello");String s=s1.toString();}
}

StringBuffer类于他们只有一个区别,StringBuffer类的操作属于线程安全操作,它的大部分方法都加上了

 synchronized关键字,如下

线程安全操作简单理解就是指在多线程情况下,这个方法会被执行完才会让出cpu资源,执行后面代码,这保证了代码逻辑的正确性,当然,与之相对效率差一点点,所以在单线程情况下还是常用另外两个方法。

本期博客就到到这里啦,记录个人学习欢迎大家指正错误哦,谢谢大家,我们下期见

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

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

相关文章

计算机网络基础-VRRP原理与配置

目录 一、了解VRRP 1、VRRP的基本概述 2、VRRP的作用 二、VRRP的基本原理 1、VRRP的基本结构图 2、设备类型&#xff08;Master&#xff0c;Backup&#xff09; 3、VRRP抢占功能 3.1&#xff1a;抢占模式 3.2、非抢占模式 4、VRRP设备的优先级 5、VRRP工作原理 三…

React基础教程:react脚手架

1、create-react-app 全局安装create-react-app npm install -g create-react-app安装成功之后&#xff0c;通过命令create-react-app -V检查是否安装成功 创建一个项目 create-react-app my-app如果不想全局安装&#xff0c;可以直接使用npx&#xff0c;也可以实现相同的效…

小主机折腾记25

10.买了惠普光驱&#xff0c;想给880g5twr安装上&#xff0c;结果发现卡扣不对 880g5twr的卡扣更长一些&#xff0c;比光驱本身长一些&#xff0c;各位如果想买的注意擦亮眼睛&#xff0c;看看卡扣跟你的主机一致与否 后续在闲鱼上买了个卡扣&#xff0c;加邮费12块钱…… 1…

转让闲置商标别中了残标,与驰名商标近似被驳回!

前几天有个人说要购买一个闲置的已注册商标&#xff0c;普推商标知产老杨帮忙去联系了一下&#xff0c;发现这个商标是残标用不成&#xff0c;他是要买回来的做化妆品的&#xff0c;但是在3类化妆品里面化妆品的小类并没有通过初审下证。 大家转让闲置商标就要注意了&#xff0…

链表的中间结点

一、题目链接 https://leetcode.cn/problems/middle-of-the-linked-list/submissions/538121725、 二、思路 定义快慢指针&#xff0c;快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;最后慢指针的位置就是中间结点的位置 三、题解代码 //快慢指针&#xff0c;快…

带你学习Mybatis之逆向工程

逆向工程 可以针对单表自动生成MyBatis执行所需要的代码&#xff0c;包括&#xff1a;Mapper.java&#xff0c;Mapper.xml&#xff0c;实体类&#xff0c;这样可以减少重复代码的编写 <dependency> <groupId>org.mybatis.generator</groupId> …

【计算机视觉(9)】

基于Python的OpenCV基础入门——形态学操作 形态学操作腐蚀膨胀开运算闭运算梯度运算顶帽黑帽 形态学操作代码实现以及效果图 形态学操作 形态学操作是数字图像处理中的一种方法&#xff0c;用于改变和提取图像中的结构和形状信息。它基于图像的形状和大小特征&#xff0c;通过…

基于SpringBoot+Vue单位考勤系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

2024上海初中生古诗文大会倒计时4个多月:单选题真题和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

STM32F103C8移植uCOSIII并以不同周期点亮两个LED灯(HAL库方式)【uCOS】【STM32开发板】【STM32CubeMX】

STM32F103C8移植uC/OSIII并以不同周期点亮两个LED灯&#xff08;HAL库方式&#xff09;【uC/OS】【STM32开发板】【STM32CubeMX】 实验说明 将嵌入式操作系统uC/OSIII移植到STM32F103C8上&#xff0c;构建两个任务&#xff0c;两个任务分别以1s和3s周期对LED进行点亮—熄灭的…

前端渲染大量数据思路【虚拟列表】【异步机制】

当浏览器遇到性能瓶颈导致页面卡顿时&#xff0c;你会怎么处理&#xff1f;如何查找问题的原因&#xff1f; 浏览器本身自带性能检测工具&#xff0c;通常我们分析由脚本导致的页面卡顿会选择 性能&#xff08;performance&#xff09; 选项卡&#xff0c;在其中我们可以找到导…

3D Gaussian Splatting for Real-Time Radiance Field Rendering

辐射场方法最近在基于多张照片或视频进行新视角合成方面取得了革命性进展。然而&#xff0c;实现高视觉质量仍然需要耗时且计算成本高的神经网络&#xff0c;而最近的快速方法不可避免地在速度和质量之间进行了权衡。对于无界和完整的场景&#xff08;而不是孤立的物体&#xf…

【Vue】vuex 的使用 - 创建仓库

通用的地方我们一般会称之为仓库 1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex32.新建 store/index.js 专门存放 vuex ​ 为了维护项目…

【排序算法】总结篇

✨✨这些 排序算法都是指的 需要进行比较的排序算法 ✨✨下面都是略微讲解一下思路&#xff0c;如果需要详细了解哪一个排序&#xff0c;点击&#x1f449;链接即可 ✨✨对于时间、空间复杂度、稳定性&#xff0c;希望你&#x1f9d1;‍&#x1f393;能够理解记忆&#x1f9d1;…

Science刊发!乌普萨拉大学最新神经形态触觉人造皮肤可快速精准识别物体

当前&#xff0c;人形机器人使用的传统电子皮肤在处理触觉感知信息方面的能力并不强&#xff0c;尤其是在时间信息编码和快速特征提取方面存在一定的局限性。简单来说就是机器人无法完成在接触到物品的瞬间&#xff0c;判断用怎样的力度去对该物品做出反应。尽管多模态大模型和…

手搓文件格式转换

最初目标&#xff1a; 自己搞一个免费的pdf文件转换 根据现有的开源jar 项目实现思路&#xff1a; 1. 项目原因a. 我想转换文件b. wps 文件转换 2. 最初的状态a. jar运行的b. main,输入文件路径c. 一定的编程能力的人才能得 3. 开始构思项目a. 网页版本b. 想着大家一起用 4. …

MyBatis二级缓存开启条件

MyBatis缓存为俩层体系。分为一级缓存和二级缓存。 一级缓存&#xff1a; 一级缓存默认开启&#xff0c;一级缓存的作用域是SqlSession级别的&#xff0c;这意味着当你更换SqlSession之后就不能再利用原来的SqlSession的一级缓存了。不同的SqlSession之间的一级缓存是隔离的。…

Django更改超级用户密码

Django更改超级用户密码 1、打开shell 在工程文件目录下敲入&#xff1a; python manage.py shell再在python交互界面输入&#xff1a; from django.contrib.auth.models import User user User.objects.get(username root) user.set_password(123456) user.save()其中ro…

递归【2】(组合回溯(生成括号)、子集回溯(背包问题))

括号对 &#xff08;组合型回溯&#xff09; 分解成子问题&#xff0c;每一次添加括号分两步&#xff1a; if左括号小于n&#xff0c;加左括号&#xff0c;然后k(index1), if左括号大于有括号&#xff0c;加右括号&#xff0c;k(index1),然后收尾括号单独考虑&#xff0c;到…

【Ardiuno】实验使用ESP32连接Wifi(图文)

ESP32最为精华和有特色的地方当然是wifi连接&#xff0c;这里我们就写程序实验一下适使用ESP32主板连接wifi&#xff0c;为了简化实验我们这里只做了连接部分&#xff0c;其他实验在后续再继续。 由于本实验只要在串口监视器中查看结果状态即可&#xff0c;因此电路板上无需连…