【Java】认识String类

文章目录

  • 一、String类的重要性
  • 二、String类中的常用方法
    • 1.字符串构造
    • 2.String对象的比较
    • 3.字符串查找
    • 4.转换
    • 5.字符串替换
    • 6.字符串拆分
    • 7.字符串截取
    • 8.其他操作方法
    • 9.字符串的不可变性
    • 10.字符串修改
  • 三、StringBuilder和StringBuffer


一、String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类

二、String类中的常用方法

1.字符串构造

String类提供的构造方式非常多,常用的有以下三种:

public class Test {public static void main(String[] args) {String s = "hello";System.out.println(s);String s1 = new String("hello");System.out.println(s1);char[] s3 = {'h','e','l','l','o'};System.out.println(s3);}
}

在这里插入图片描述
注意:
1.String类是引用类型,内部并不存储字符串本身
2.在Java中""引起来的也是String类型对象

2.String对象的比较

Java中提供了四种比较方式:
1.==比较是否引用同一对象

public class Test {public static void main(String[] args) {int a = 10;int b = 20;int c = 10;System.out.println(a==b);System.out.println(a==c);System.out.println("********");String s = new String("hello");String s1 = new String("hello");String s2 = new String("word");String s3 = s;System.out.println(s==s1);System.out.println(s1==s2);System.out.println(s==s3);}
}

在这里插入图片描述
注意: 对于内置类型,== 比较的是变量中的值;对于引用类型==比较的是引用中的地址

2.boolean equals(Object anObject) 方法:按照字典序比较
字典序:字符大小的顺序
String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较

public class Test {public static void main(String[] args) {String s = new String("hello");String s1 = new String("hello");String s2 = new String("Hello");// equals比较:String对象中的逐个字符// s与s2引用的不是同一个对象,而且两个对象中内容也不同,因此输出false// s与s1引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出trueSystem.out.println(s.equals(s2));System.out.println(s.equals(s1));}
}

在这里插入图片描述
3.int compareTo(String s) 方法: 按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
1.先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
2.如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值

public class Test {public static void main(String[] args) {String s = new String("abc");String s1 = new String("ac");String s2 = new String("abc");String s3 = new String("abcde");System.out.println(s.compareTo(s1));//不同输出字符的差值为-1System.out.println(s.compareTo(s2));//输出字符相同为0System.out.println(s.compareTo(s3));//前几个字符相同,输出长度差值为-2}
}    

在这里插入图片描述
4. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较

public class Test {public static void main(String[] args) {String s = new String("abc");String s1 = new String("ac");String s2 = new String("ABc");String s3 = new String("abcde");System.out.println(s.compareToIgnoreCase(s1));//不同输出字符的差值为-1System.out.println(s.compareToIgnoreCase(s2));//输出字符相同为0System.out.println(s.compareToIgnoreCase(s3));//前几个字符相同,输出长度差值为-2}
}    

在这里插入图片描述

3.字符串查找

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

方法功能
char charAt(int index)返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常
int indexOf(int ch)返回ch第一次出现的位置,没有返回-1
int indexOf(int ch, int fromIndex)从fromIndex位置开始找ch第一次出现的位置,没有返回-1
int indexOf(String str)返回str第一次出现的位置,没有返回-1
int indexOf(String str, int fromIndex)从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch)从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch, int fromIndex)从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
:int lastIndexOf(String str)从后往前找,返回str第一次出现的位置,没有返回-1:
int lastIndexOf(String str, int fromIndex)从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1
public class Test {public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3)); System.out.println(s.indexOf('c'));System.out.println(s.indexOf('c', 10));System.out.println(s.indexOf("bbb"));System.out.println(s.indexOf("bbb", 10));System.out.println(s.lastIndexOf('c'));System.out.println(s.lastIndexOf('c', 10));System.out.println(s.lastIndexOf("bbb"));System.out.println(s.lastIndexOf("bbb", 10));}
}

在这里插入图片描述

4.转换

1.数值和字符串转换化

public class Test {public static void main(String[] args) {String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);String s3 = String.valueOf(true);System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println("=================================");// 字符串转数字// 注意:Integer、Double等是Java中的包装类型int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");System.out.println(data1);System.out.println(data2);}
}

在这里插入图片描述
2.大小写转换

public class Test {public static void main(String[] args) {String s = "hello";String s1 = "HELLO";System.out.println(s.toUpperCase());//小写转大写System.out.println(s1.toLowerCase());//大写转小写}
}    

在这里插入图片描述
这两个函数只转换字母
3.字符串转数组

public class Test {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]);}System.out.println();// 数组转字符串String s2 = new String(ch);System.out.println(s2);}
}

在这里插入图片描述
4.格式化

public class Test {public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9,14);System.out.println(s);}
}

在这里插入图片描述

5.字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

方法功能
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换收个内容
public class Test {public static void main(String[] args) {String s = "hellohello";System.out.println(s.replaceAll("l", "z"));System.out.println(s.replaceFirst("l", "z"));}
}    

在这里插入图片描述
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串

6.字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串
方法如下:

方法功能
String[] split(String regex)将字符串全部拆分
String[] split(String regex, int limit)将字符串以指定的格式,拆分为limit组
public class Test {public static void main(String[] args) {String str = "hello word is you";String[] s = str.split(" ");//按照空格拆分for (int i = 0; i < s.length; i++) {System.out.println(s[i]);}}
}

在这里插入图片描述

public class Test {public static void main(String[] args) {String str = "hello word is you";String[] s = str.split(" ",2);//按照空格拆分成两份for (int i = 0; i < s.length; i++) {System.out.println(s[i]);}}
}    

在这里插入图片描述
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义
注意事项:
1.字符"|“,”*“,”+“都得加上转义字符,前面加上 “\”
2.而如果是 “” ,那么就得写成 “\\”
3.如果一个字符串中有多个分隔符,可以用”|"作为连字符
多次拆分:

public class Test {public static void main(String[] args) {String str = "name=zhagnsan&age=10";String[] s = str.split("&");for (String ss:s) {String[] ret = ss.split("=");for (String sss:ret) {System.out.println(sss);}}}
}

在这里插入图片描述

7.字符串截取

从一个完整的字符串之中截取出部分内容
方法如下:

方法功能
String substring(int beginIndex)从指定索引截取到结尾
String substring(int beginIndex, int endIndex)截取部分内容
public class Test {public static void main(String[] args) {String str = "helloword";System.out.println(str.substring(5));System.out.println(str.substring(0, 5));}
}    

在这里插入图片描述
注意事项
1.索引从0开始
2.注意前闭后开区间的写法,substring(0,5)表示包含0下标的字符,不包含5下标的字符

8.其他操作方法

方法功能
String trim()去掉字符串中的左右空格,保留中间空格
String toUpperCase()字符串转大写
String toLowerCase()字符串转小写
public class Test {public static void main(String[] args) {String str = " hello word ";System.out.println(str.trim());}
}    

在这里插入图片描述
trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等)

9.字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1.String类在设计时就是不可改变的,String类实现描述中已经说明了
在这里插入图片描述
String类中的字符实际保存在内部维护的value字符数组中,从上图中可以看出:
1.String类被final修饰,表示该类不能被继承
2.value被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改
2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的

10.字符串修改

注意: 尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下

三、StringBuilder和StringBuffer

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的

方法功能
StringBuff append(String str)在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
char charAt(int index)获取index位置的字符
int length()获取字符串的长度
int capacity()获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)扩容
void setCharAt(int index,char ch)将index位置的字符设置为ch
int indexOf(String str)返回str第一次出现的位置
int indexOf(String str, int fromIndex)从fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str)返回最后一次出现str的位置
int lastIndexOf(String str,int fromIndex)从fromIndex位置开始找str最后一次出现的位置
StringBuff insert(int offset, String str)在offset位置插入:八种基类类型 & String类型 & Object类型数据
StringBuffer deleteCharAt(int index)删除index位置字符
StringBuffer delete(int start, int end)删除[start, end)区间内的字符
StringBuffer replace(int start, int end, String str)将[start, end)位置的字符替换为str
String substring(int start)从start开始一直到末尾的字符以String的方式返回
String substring(int start,int end)将[start, end)范围内的字符以String的方式返回
StringBuffer reverse()反转字符串
String toString()将所有字符按照String的方式返回

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder
注意: String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
1.String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2.StringBuilder变为String: 调用toString()方法

String、StringBuffer、StringBuilder的区别
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2.StringBuffer与StringBuilder大部分功能是相似的
3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

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

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

相关文章

leetcode (力扣) 97. 交错字符串(动态规划)

文章目录 题目描述思路分析完整代码 题目描述 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 … sn t …

tp8 使用rabbitMQ(1)简单队列

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 代码中的消息持久化的说明 RabbitMQ 消息持…

登陆页面模板

简单好看的登陆页面 vue项目代码 可忽略js部分 先来个效果图 <template><div class"login"><div class"content"><p >账户密码登录</p><div class"unit"><label class"label">用户名</…

Linux-权限

1.Shell命令以及运行原理 Linux 严格意义上说的是一个操作系统&#xff0c;我们称之为 “ 核心&#xff08; kernel &#xff09; “ &#xff0c;但我们一般用户&#xff0c;不能直接使用 kernel 。而是通过kernel 的 “ 外壳 ” 程序&#xff0c;也就是所谓的 shell &#x…

DLL劫持漏洞

以下是自己学习时做的一些笔记&#xff0c;希望对各位有所帮助 DLL劫持漏洞 为什么程序中会有dll的存在 对于 Windows 操作系统&#xff0c;操作系统的大部分功能都由 DLL 提供。 另外&#xff0c;当您在这些 Windows 操作系统之一上运行某一程序时&#xff0c;该程序的很多…

Python语言:猜数字游戏案例讲解

猜数字游戏题目要求如下&#xff1a;该程序随机生成一个1到100之间的整数&#xff0c;然后要求玩家在有限的次数内猜出这个数字。如果玩家猜对了&#xff0c;游戏结束并显示成功信息&#xff1b;如果玩家猜错了&#xff0c;程序会提示玩家猜的数字是偏大还是偏小&#xff0c;并…

最新版灵沐V3.3微信资源类小程序源码支持流量主

源码简介 最新版灵沐V3.3微信资源类小程序源码支持流量主&#xff0c;一套不错的流量主变现资源下载小程序&#xff0c;它支持在微信、QQ和抖音平台上运行。这次更新主要集中在全局UI设计的升级&#xff0c;并依然注重资源下载和激励视频变现的功能。另外&#xff0c;还新增了…

如何利用Python进行数据归一化?

1. 知识简介 数据归一化是数据预处理的一项重要步骤&#xff0c;它对于提高模型性能、加速模型训练、避免数值计算问题以及提高模型的泛化能力都具有重要作用。进行数据归一化可以起到以下作用&#xff1a;消除量纲影响&#xff0c;加速模型收敛&#xff0c;提高模型性能&…

每日汇评:黄金测试2000美元水平遭到拒绝,为下跌留下了空间

黄金在心理关键的2000美元水平失去了上升动力&#xff1b; 美元指数上涨持续&#xff0c;同时国债收益率反弹&#xff0c;都对黄金价格的上涨构成压力&#xff1b; 美国即将迎来感恩节假期&#xff0c;意味着明天和周五流动性较低&#xff1b; 黄金价格继续在每盎司2000美元以上…

【Linux】 id命令使用

id id命令来显示用户的UID、组GID。 著者 由阿诺德罗宾斯和大卫麦肯齐撰写。 语法 id [参数] [用户名] id命令 -Linux手册页 命令选项及作用 执行令 id --help 执行命令结果 参数 -g 或 --group  显示用户所属群组的ID。-G 或 --groups  显示用户所属附加群组的ID。…

Thread类常用成员方法

点击链接返回标题-> Java线程的学习-CSDN博客 目录 前言 有关线程名字的成员方法&#xff1a; String getName() void setName(String name) Thread(String name) 获取线程对象的成员方法&#xff1a; static Thread currentThread() 让线程睡眠的成员方法&#xff1…

JAVA实现flappy bird游戏

图片素材 实现代码 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Date; import java.text.SimpleDateFormat; i…