前言

学习了前面的内容之后,我们知道了一些java中的常用类,比如Object和包装类等,但还有一个类用的更多,这就是String字符串类! 所以接下来我们会利用一些篇章,来给大家重点讲解一下String的用法,因为这个太常用,也太常考了。 虽然我们前面的代码案例中,已经多次使用过String字符串了,感觉也不难,但实际上String字符串的内容是比较多的,需要初学者进行专门的学习,尤其是它的一些底层原理更需要我们来了解。

全文大约 【5500】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考

一. String字符串简介

1. 概述

String是Java里的一个类,属于引用类型,遵循引用类型的基本规律和要求。但它也有自己的一些特点,比如可以直接用双引号"…"来表示一个字符串,所以凡是用双引号括起来的一串字符都是String对象,如“Hello”在编译后就会成为一个String对象。

而且String是final类,一旦创建了一个String对象,理论上就不能再被改变,当然我们可以使用其他变量重新赋值的方式进行更改。

另外从名字上我们也可以猜测出,字符串与字符有一定的关系。实际上,String字符串的内部是通过一个private final char[]数组来实现数据存储的,所以我们可以通过如下方式来表示一个字符串:

String str = new String(new char[] {'H', 'e', 'l', 'l', 'o', 'y', 'y', 'g'});

当然,以上这种字符串的表达方式太过麻烦,而且由于String太常用了,所以Java就提供了"…"这种极简的表达方式供我们使用。

我们要知道,Java字符串的一个重要特点就是字符串的不可变性。这种不可变主要是通过final修饰String类,private final char[]字段对数据的存储,且没有提供任何可以修改char[]字段的方法来实现的。

2. 与字符的区别

之前给大家讲过java里的8种基本数据类型,我们知道,其中有一种比较特殊的char字符类型,可以在单引号中存储单个的字符元素,比如’A’、‘9’、‘国’ 等。而我们今天要学习的String类,则是用双引号"…"来表达字符串的。作为初学者,我们一定要注意字符与字符串的区别:

● 字符只能表示单个字符元素,必须用单引号’‘把单个的字符元素括起来,如’A’、‘9’、‘国’ 等;

● 字符串可以表示单个或多个字符元素,必须用双引号把单个或多个字符元素括起来,如"A"、“Hi”、"中国"等;

● 字符是基本类型,其本质是一种数值;字符串是引用类型,其本质是一个java类。

3. 定义方式

String字符串的定义方式,常用的有如下两种:

  1. 通过构造方法创建字符串对象;

  2. 直接赋值。

我们在开发时,其实很少使用第一种方式,因为太过啰嗦,一般都是通过直接赋值的方式进行定义。

3.1 构造方法定义

Java为String类提供了11个构造方法创建String对象,这些方法提供了不同的参数来初始化字符串。当字符串变量被创建处理后,必须经过初始化才能使用。下面是通过构造方法定义String对象的几种方式,大家可以参考:

public class Demo01 {public static void main(String[] args) {//通过构造方法创建String对象//构造一个空字符串,相当于String s1="";String s1=new String();System.out.println("s1的长度="+s1.length()+",s1="+s1);//构造一个由内容的字符串,相当于String s1 = "一一哥";String s2 = new String("跟一一哥学Java"); System.out.println("s2的长度="+s2.length()+",s2="+s2);//通过字节数组构建字符串对象byte[] b = {97,98,99,100};String s3=new String(b);System.out.println("s3的长度="+s3.length()+",s3="+s3);//通过字节数组构建字符串对象//参数1:字节数组;参数2:起始下标;参数3:长度String s4 = new String(b, 0, b.length);System.out.println("s4的长度="+s4.length()+",s4="+s4);//通过字符数组创建字符串对象char[] c = {'一','一','哥'};String s5 = new String(c, 0, c.length);System.out.println("s5的长度="+s5.length()+",s5="+s5);}}

3.2 直接赋值定义

下面是通过直接赋值的方式来定义String对象的方式,大家可以参考:

public class Demo02 {public static void main(String[] args) {//直接赋值的方式创建String对象//注意:null表示String对象为空,而""表示是一个长度为零、内容为空的空字符串对象,但该对象不为空!//定义一个值为null的空字符串String s1=null;System.out.println("s1="+s1);//定义一个内容为空,长度为零的字符串String s2 = "";System.out.println("s2的长度="+s2.length()+",s22="+s2);//定义一个带有内容的字符串String s3 = "一一哥";System.out.println("s3的长度="+s3.length()+",s3="+s3);}}

我们要注意String s=null与String s=""的区别:

● String s=null表示String对象为空,即字符串对象的引用指向了null,还没有指向任何的内存空间;

● String s=““是声明了一个字符串类型的引用,其值为””,表示是一个长度为零、内容为空的空字符串对象,但该对象不为空!这个s对象的引用指向的是空字符串的内存空间。

以上内容,是对字符串定义和使用的常规操作,但实际上String字符串还有其他很多有用的方法,接下来我们就专门给大家介绍一下这些实用方法。

二. 字符串实用方法

1. 字符串的比较方法

在Java中,如果我们想比较两个字符串,其实主要是比较两个字符串的内容是否相同,所以应该使用equals()方法,而不要使用==进行比较。

public class Demo04 {public static void main(String[] args) {String s1 = "hello";String s2 = "hello";//==用于比较两个对象的地址System.out.println("s1==s2的结果:"+(s1 == s2));//equals()用于比较两个对象的内容System.out.println("s1.equals(s2)的结果:"+s1.equals(s2));}}

大家注意,在上面的案例中,虽然使用和equals()比较的结果都是true,但实际上这只是”凑巧“罢了。在本案例中,之所以使用”“进行比较的结果也是true,这是因为Java编译器在编译期,自动把所有相同内容的字符串当作一个对象放入到了字符串常量池。所以s1和s2都指向了同一个引用地址,结果自然就是相同的。但如果我们把上述案例换一种写法,再利用”==“进行比较就不是这样的结果。

public class Demo04 {public static void main(String[] args) {//新的写法String s3 = "yiyige";//将字符串转为小写String s4 = "YIYIGE".toLowerCase();//此时s3和s4是指向两个不同引用地址的对象System.out.println("s3==s4的结果:"+(s3 == s4));System.out.println("s3.equals(s4)的结果:"+s3.equals(s4));}}

从上面的案例中,我们可以得出一个结论,要想比较两个字符串,应该使用equals()方法,而不是"=="方法!

2. 判断字符串是否为空

另外在前面的代码案例中,我们还给大家介绍了两种定义String字符串对象的方式,并在第2种方式中给大家提到了null与"“两种为空的情况。而我们在实际开发中,判断一个字符串对象是null与”",其实是一种非常常见的操作,那么我们该怎么判断String对象是否是null或""呢?

public class Demo03 {public static void main(String[] args) {//判断字符串对象是否为null或""//注意:null表示String对象为空,而""表示是一个长度为零、内容为空的空字符串对象,但该对象不为空!//定义一个值为null的空字符串String s1=null;//判断方式1:判断对象是否为nullif(s1==null) {System.out.println("s1字符串对象为null,s1="+s1);}//定义一个内容为空,长度为零的字符串String s2 = "";//判断方式2:这种判断写法存在异常隐患,字符串对象s2有可能为null,如果s2.equals()调用时,s2可能为null,此时就会出现空指针异常if(s2.equals("")) {System.out.println("s2的长度="+s2.length()+",s2="+s2);}//判断方式3:对上面的判断方式进行改进,用以下方式进行判断,就会消除空指针异常的隐患if("".equals(s2)) {System.out.println("s2的长度="+s2.length()+",s2="+s2);}//判断方式4:判断一个空串的长度是否为0,这种判断字符串是否为空的方式效率更高if(s2.length()==0) {//我们也可以直接使用字符串的isEmpty()方法,其内部实现与此方式相同。System.out.println("s2的长度="+s2.length()+",s2="+s2);}//判断方式5:更全面严谨的判断。s==null一定要写在前面,因为如果s为null,先调用后面的s.length()就会出现空指针异常if(s2 == null || s2.length() == 0) {System.out.println("s2的长度="+s2.length()+",s2="+s2);}//判断方式6:或者我们直接使用字符串的isBlank()方法if(s2.isBlank()) {System.out.println("s2的长度="+s2.length()+",s2="+s2);}}}

在实际开发时,我们一般是采用第5种判断方式,这种判断方式更为严谨,能够把两种”为空“的情况都考虑到。当然,我们也可以直接使用字符串对象提供的isEmpty()或isBlank()方法,进行判空。另外我们要特别注意,防止出现空指针异常,并且也要考虑采用哪种方式判断为空的情况效率更高。

3. 判断相关的方法

String字符串中提供了几个与字符串判断相关的方法,可以对一个字符串进行各种判断,这几个方法如下:

● equals():判断两个字符串的内容是否相同;

● equalsIgnoreCase():判断两个字符串是否相等,忽略大小写;

● isEmpty():判断字符串是否为空串"",主要是判断字符串长度是否为0;

● isBlank():判断字符串是否为空串"",主要是判断字符串中是否包含空白字符;

● startsWith():判断字符串是否以指定的字符串开头;

● endsWith():判断字符串是否以指定的字符串结尾;

● contains():判断字符串中是否包含指定的字符串,参数是CharSequence类型,而不是String。

public class Demo05 {public static void main(String[] args) {String s1 = "yiyige"; //判断两个字符串的内容是否相同System.out.println("yiYige".equals(s1));//判断两个字符串是否相等,忽略大小写System.out.println("yiyige".equalsIgnoreCase(s1));//判断字符串是否为空,或是否有空白字符//长度为0,字符串为空String s2="";//长度不是0,字符串不为空String s3=" ";//长度不是0,字符串不为空String s4=" \n";//判断字符串是否为空串""System.out.println("s2为空吗?"+s2.isEmpty());//trueSystem.out.println("s3为空吗?"+s3.isEmpty());//falseSystem.out.println("s4为空吗?"+s4.isEmpty());//false//判断字符串是否是空串或有空白字符System.out.println("s2为空吗?"+s2.isBlank());//trueSystem.out.println("s3为空吗?"+s3.isBlank());//trueSystem.out.println("s4为空吗?"+s4.isBlank());//trueString s5 = "1234567890123";//判断字符串是否以指定的字符开头System.out.println(s5.startsWith("12"));//判断字符串是否以指定的字符串开头,并指定开始位置System.out.println(s5.startsWith("34", 2));//判断字符串是否以指定的字符串结尾System.out.println(s5.endsWith("23"));//判断字符串中是否包含指定的字符串System.out.println(s5.contains("SB"));}}

4. 获取相关的方法

String字符串中提供了几个与字符串获取相关的方法,这几个方法如下:

● charAt():获取指定下标位置上对应的字符,并返回char类型;

● indexOf():获取指定字符串在原字符串中的下标索引位置,如果不包含该字符串则返回-1;

● lastIndexOf():该方法与indexOf()类似,但该方法是从后往前找,找到指定字符最后出现的位置;

● length():该方法用于返回字符串对象中包含的字符数量,即可以获取字符串的长度。

public class Demo06 {public static void main(String[] args) {String s1 = "abcn12c3fcds";//charAt(index),获取指定下标位置上对应的字符,并返回char类型System.out.println("下标索引位置3上的字符是:"+s1.charAt(3));//indexOf("字符串"),获取指定字符串在原字符串中的下标位置,如果不包含该字符串则返回-1System.out.println("字符串的索引位置是:"+s1.indexOf("cn2"));//lastIndexOf("字符串"),与indexOf()方法类似,区别是该方法是从后往前找,找到指定字符最后出现的位置System.out.println("指定字符的索引为:"+s1.lastIndexOf("c"));//length(),获取字符串的长度System.out.println("字符串的长度是:"+s1.length());}}

5. 拼接、替换、截取、分割、去空格等方法

String字符串中提供了拼接、替换、截取、分割等方法,这几个方法如下:

● concat():将某个字符串连接到该字符串的结尾,并返回拼接后的字符串,相当于s1 = s1 + “world”;

● join():用指定的字符串连接字符串数组;

● replace():将字符串中指定的字符串替换成指定的字符串;

● replaceAll():利用正则表达式,将字符串中指定的字符串替换成指定的字符串;

● substring(start,end):字符串截取,从指定的下标索引开始和结束,范围是左闭右开,注意索引是从0开始;

● substring(index):字符串截取,从指定的索引下标开始一直截取到字符串的最后;

● split():字符串切割,按照指定的字符串对原字符串进行切割;

● trim():不改变原有字符串内容,只是去除字符串首尾的空白字符,包括空格、\t、\r、\n。

public class Demo07 {public static void main(String[] args) {//用指定的字符串连接字符串数组String[] arr = {"A", "B", "C"};String str = String.join("***", arr); // "A***B***C"System.out.println("新的字符串str="+str);String s1 = "hello,SB";//将字符串与指定的字符串进行拼接,相当于s1 = s1 + "world";s1 = s1.concat("world"); System.out.println("新的字符串="+s1);//字符串替换:将字符串中指定的字符串替换成指定的字符串s1 = s1.replace("SB", "**");System.out.println("新的字符串="+s1);String s2 = "A,,B;C ,D";//利用正则表达式,将字符串中指定的字符串替换成指定的字符串;//通过正则表达式,把匹配的子串统一替换为","s2 = s2.replaceAll("[\,\;\s]+", ","); // "A,B,C,D"System.out.println("新的字符串s2="+s2);//字符串截取,从指定的下标开始和结束,范围是左闭右开s1 = s1.substring(0, 5);System.out.println("新的字符串="+s1);//字符串截取,从指定的下标开始一直截取到字符串的最后。//注意:StringIndexOutOfBoundsExceptions1 = s1.substring(3);System.out.println("新的字符串="+s1);//字符串切割,按照指定的字符串对原字符串进行切割String s2 = "zhangsan-lisi-wangwu";//利用指定的分隔符进行分割String[] s = s2.split("-");System.out.println(Arrays.toString(s));//去除字符串前后的空格String s3 = "      你好,       哈哈      ";s3 = s3.trim();System.out.println("新的字符串s3="+s3);}}

6. 大小写转换的方法

String字符串中提供了将字符串转为小写、大写等方法,这几个方法如下:

● toUpperCase():将字符串中的字母都变成大写;

● toLowerCase():将字符串中的字母都变成小写。

public class Demo08 {public static void main(String[] args) {String s1 = "abcADC你好123";//将字符串中的字母变成大写System.out.println("转换后新的字符串="+s1.toUpperCase());//将字符串中的字母变成小写System.out.println("转换后新的字符串="+s1.toLowerCase());}}

7. 字符串转数组的方法

String字符串中提供了将字符串转为字节、字符数组的方法,这几个方法如下:

getBytes():将字符串转变成字节数组;

● toCharArray():将字符串变成字符数组。

public class Demo08 {public static void main(String[] args) {String s1 = "abcd你好";//将字符串转变成字节数组byte[] b = s1.getBytes();System.out.println(Arrays.toString(b));//将字符串变成字符数组char[] c = s1.toCharArray();System.out.println(Arrays.toString(c));}}

8. 其他类型转字符串的方式

我们可以利用如下几种方式将其他类型转为String字符串:

● 利用"+"号拼接:通过拼接得到一个新的字符串对象;

● valueOf()方法:将其他的类型的数据转换成String类型;

● 构造方法:也可以使用字符串对应的构造方法,将字节、字符数组类型转为字符串对象,效率较低。

public class Demo08 {public static void main(String[] args) {//其他类型转字符串的方式int i = 10;//方式1:利用+号进行转换String s1 = i+"";System.out.println("整形转字符串s1="+s1);//方式2:将其他的类型的数据转换成String类型String s2 = String.valueOf(i);System.out.println("整形转字符串s2="+s2);//方式3:将字节数组转为字符串byte[] nums= {97, 98, 99, 100};String s3=new String(nums);System.out.println("整形转字符串s3="+s3);}}

9. 格式化字符串的方法

除了以上这些方法之外,String还提供了几个可以用于格式化字符串的方法,如下:

● format():可以将字符串进行格式化操作。

public class Demo09 {public static void main(String[] args) {//实例方法:String对象.format()//%d、%s、%.2f都是占位符String s = "恭喜你,%s, 你的得分是:%d!";System.out.println(s.formatted("壹壹哥", 99));//静态方法:String类.format()System.out.println(String.format("恭喜你,%s, 你的成绩是:%.2f!", "一一哥2", 46.5));}}

在上面的案例中,涉及到了几个占位符,主要是配合参数进行格式化。当使用占位符时,就需要参数类型要和占位符要求的一致。常用的占位符含义如下:

● %s:表示字符串;

● %d:表示整数;

● %x:表示十六进制整数;

● %f:表示浮点数。

另外占位符还可以带格式,例如%.2f是表示显示两位小数。如果你不确定到底该用哪个占位符,可以选择使用%s,因为%s可以显示任何数据类型。

以上这些方法,就是String字符串中的一些常用方法,当然并不是全部的方法。
实际上,String中还有其他的一些方法,但由于篇幅限制,以后我们会在其他的案例中再给大家捎带着进行普及,这里就不再单独罗列了。


三. 结语

至此就把String字符串对象的定义方式,以及String类中常用的API方法给大家介绍完了,我们要掌握本文的重点内容,比如:

● 掌握String对象的定义方式;

● 掌握字符串对象的比较方式;

● 掌握字符串判空的方式及方法;

● 了解java中的常用占位符;

● 掌握其他重要方法。

54从零开始学Java54之String字符串很常用相关推荐

  1. 55从零开始学Java55之String字符串的编码

    前言 在上一篇文章中,给大家介绍了String字符串及其各种常用API方法,这些内容并没有什么特别难的地方.但因为String字符串很常用,所以我们在使用它的过程中,可能会面临各种问题,比如" ...

  2. 学python处理数据结构_从零开始学Python - 第009课:常用数据结构之字符串

    第二次世界大战促使了现代电子计算机的诞生,世界上的第一台通用电子计算机叫ENIAC(电子数值积分计算机),诞生于美国的宾夕法尼亚大学,占地167平米,重量27吨,每秒钟大约能够完成约5000次浮点运算 ...

  3. JAVA SE学习day_01:API、文档注释规范、String字符串的常用API

    一.JDK API 什么是 JDK API JDk中包含了大量的API类库,所谓API(Aplication Programming Interface,应用程序编程接口)就是一些已经写好的.可供直接 ...

  4. 从零开始学Python第13课:常用数据结构之字典

    迄今为止,我们已经为大家介绍了Python中的三种容器型数据类型(列表.元组.集合),但是这些数据类型仍然不足以帮助我们解决所有的问题.例如,我们需要一个变量来保存一个人的多项信息,包括:姓名.年龄. ...

  5. 从零开始学产品第七篇:常用的功能模块有哪些

    一个系统中都有哪些模块组成,对于初学者来说,可能还不能够区分的很清楚. 但是仔细回想一下,是不是几乎所有的功能都有登录和注册的功能? 启动页,Banner,轮播,个人中心,关于我们,意见反馈,设置,忘 ...

  6. 关于String字符串的常用操作。(持续更新中)

    工作一年多了页面做了不少,js使用也很多,经常遇到和使用的东西没有整理分类,半个月后再用就只有模糊印象了,还是得总结记录啊QAQ. 案例一:字符串的截取. 项目开发时,同一项目不同分支运行在同一Tom ...

  7. python集合运算_从零开始学Python - 第014课:常用数据结构之集合

    在学习了列表和元组之后,我们再来学习一种容器型的数据类型,它的名字叫集合(set).说到集合这个词大家一定不会陌生,在数学课本上就有这个概念.通常我们对集合的定义是"把一定范围的.确定的.可 ...

  8. 【从零开始学c++】4.char数组和string的千丝万缕

    目录 1.char数组: char的赋值方法: char数组的赋值方法: ASCLL码: char类函数:需包含头文件 2.stirng: 3.对char数组的输入: 1.cin: 2.cin.etl ...

  9. 从零开始学 Python 之字符串

    从零开始学 Python 之字符串 前言 大家好,这里是「痴海」从零开始学习 Python 系列教程.此文首发于「痴海」公众号,欢迎大家去关注.学习一门语言最好的办法,就是教懂别人.在这公众号,我会从 ...

最新文章

  1. CountDownLatch 的使用 || enum 枚举使用的小技巧
  2. 【赠书】深入浅出embedding:原理解析与应用实践
  3. 【机器视觉】 close_measure算子
  4. Vue 路由模块化配置
  5. kali linux虚拟机密码,[Linux]安装kali虚拟机后忘记root密码
  6. 关于Synchornized,Lock,AtomicBoolean和volatile的区别介绍
  7. model存储 swift_使用Swift原生JSON-Model
  8. 减少工作时间更有利于百姓
  9. timestamp显示毫秒_TimeStamp 毫秒和纳秒
  10. 传统企业如何做数字化转型?弄懂这3大底层逻辑你就懂了
  11. TP6 微信小程序消息推送配置Token校验失败200302
  12. EasyExcel根据自定义模板导出Excel(包含图片、表格)
  13. qq大学认证如何修改随意修改认证内容
  14. 经典策略之一文读懂网格交易
  15. 焦距 对焦 变焦--摄影基础理论(3)
  16. 当渠道需要在Application中调用有参方法
  17. Navicat Premium 注册码
  18. 【Qt】 Fractal Designer 5.3 - Help(中文版)
  19. Android 学习之《第一行代码》第6章:adb调试:pemission denied以及模拟器不能获取root权限问题的解决
  20. 社区发现系列03-Louvain算法分辨率

热门文章

  1. CoInitialize()与COM
  2. d:/aaa下面有一个视频文件 复制到d:/bbb下面
  3. AtCoder Beginner Contest 238 ABC题解 数学函数 几何 数论数学
  4. 14.Java集合(1)
  5. Linux认证相关知识,RHCE认证考试具体知识详解
  6. mac小技巧:如何设置Mac快速锁屏
  7. yolov5打开本地摄像头实时检测方法
  8. 以前的灵敏度压不住枪?不存在的,和平精英SS1赛季最新灵敏度来了
  9. 2018双11手机购买推荐
  10. 华为android wear更新,华为Watch近期更新:获Android Wear 2.0