Java中的字符串String

news2024/9/30 3:19:12

目录

一、常用方法

1、字符串构造

2、String对象的比较

(1)、equals方法

(2)、compareTo方法

(3)、compareToIgnoreCase方法(忽略大小写进行比较)

3、字符串查找

4、转化

(1)数值和字符串转化

​编辑

(2)大小写转换

(3)字符串转数组

(4)格式化

5、字符串替换

6、字符串拆分

7、字符串截取

8、其他操作方法

二、String的不可变性

三、StringBuffer和StingBuilder

1、方法:

2、String、StringBuffer、StringBuilder的区别


一、常用方法

1、字符串构造

三种构造方法

(1)、直接赋值

String s1 = "hello world";
System.out.println(s1);

(2)、创建出新的对象

String s2 = new String("hello");
System.out.println(s2);

(3)、使用字符数组进行构造

char[] ch = {'h','e','l','l','o'};
String s3 = new String(ch);
System.out.println(s3);

三个输出效果如下:

2、String对象的比较

对于基本变量,可以直接用 “==, <,  >,  <=, >= ”来进行比较,但对于引用类型变量,不可以直接使用上面的表达式来比较,如图:

代码:

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);

s1和s2的内容都是一样的,为啥下面输出false呢?

原因是s1和s2是引用类型,使用上述表达式进行比较,比较的是两个对象的地址,两个对象是不同的,地址自然也是不同的。

那么怎么可以比较引用对象的内容呢?有以下方法:

(1)、equals方法

        按照字典序比较,字典序:字符大小。

Object的equals默认是按 “==” 进行比较的,如图:

所以类都默认继承Object类,String继承Object类,重写了equals方法,如图:

方法的使用:

代码:

        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1.equals(s2));

        String s3 = new String("Hello");
        System.out.println(s1.equals(s3));

执行效果:

(2)、compareTo方法

按照字典序比较,和equals方法不同的是:equals返回的是boolean类型,而compareTo返回的是int类型,具体比较方式:

        1、先按照字典序大小比较,如果出现不相等的字符,直接返回这两个字符的大小差值。

        2、如果前k个字符相同,返回两个字符串长度差值。

方法内部:

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

方法使用:

代码:

        String s1 = new String("ab");
        String s2 = new String("ac");
        String s3 = new String("ab");
        String s4 = new String("abcdef");
        System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1
        System.out.println(s1.compareTo(s3)); // 相同输出 0
        System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3

执行效果:

(3)、compareToIgnoreCase方法(忽略大小写进行比较)

与compareTo方法一样,不过忽略大小写

方法内部:

public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                         = new CaseInsensitiveComparator();
    private static class CaseInsensitiveComparator
            implements Comparator<String>, java.io.Serializable {
        // use serialVersionUID from JDK 1.2.2 for interoperability
        private static final long serialVersionUID = 8575799808933029326L;

        public int compare(String s1, String s2) {
            int n1 = s1.length();
            int n2 = s2.length();
            int min = Math.min(n1, n2);
            for (int i = 0; i < min; i++) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);
                if (c1 != c2) {
                    c1 = Character.toUpperCase(c1);
                    c2 = Character.toUpperCase(c2);
                    if (c1 != c2) {
                        c1 = Character.toLowerCase(c1);
                        c2 = Character.toLowerCase(c2);
                        if (c1 != c2) {
                            // No overflow because of numeric promotion
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }

方法的使用:

代码:

String s1 = new String("hello");
        String s2 = new String("Hello");
        System.out.println(s1.compareToIgnoreCase(s2));

执行效果:

3、字符串查找

方法功能
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

4、转化

(1)数值和字符串转化

数值转字符串:

        String s1 = String.valueOf(1234);
        String s2 = String.valueOf(12.34);
        System.out.println(s1);
        System.out.println(s2);

        System.out.println("==============");

        String s3 = String.valueOf(true);
        String s4 = String.valueOf(new Student("Hanmeimei", 18));
        System.out.println(s3);
        System.out.println(s4);

整型转换为字符串型的内部代码:

    public static String valueOf(int i) {
        return Integer.toString(i);
    }

double类型转换为字符串型代码:

    public static String valueOf(double d) {
        return Double.toString(d);
    }

boolean转换为字符串的内部代码:

    public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }

引用类型转换为字符串型的内部代码:

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

字符串转换为整型 / double类型:

代码:

int data1 = Integer.parseInt("1234");
Double data2 = Double.parseDouble("12.34");

如图,执行效果:


(2)大小写转换

代码:

        String s1 = "hello";
        String s2 = "HELLO";
        //小写转大写
        System.out.println(s1.toUpperCase());
        //大写转小写
        System.out.println(s2.toLowerCase());

执行效果:

(3)字符串转数组

代码:

//字符串转数组
char[] ch = s1.toCharArray();
//数组转字符串
String s2 = new String(ch);

执行效果

(4)格式化

代码:

String s = String.format("%d-%d-%d", 2023, 11, 21);

执行效果:

5、字符串替换

使用一个新的字符串替换旧的字符串,方法如下:

方法功能
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容

代码:

String str = "hello world";
System.out.println(str.replaceAll("l", "-"));
System.out.println(str.replaceFirst("l", "-"));

执行效果:

6、字符串拆分

可以将一个完整的字符串按照指定的分隔符划分成若干个字符子串

方法功能
String[] split(String regex)将字符串全部拆分
String[] split(String regex, int limit)将字符串以指定的格式,拆分为limit组

代码:

        String s1 = "hello world hello bit";
        String[] result = s1.split(" ");
        for(String x : result) {
            System.out.println(x);
        }

执行效果:

字符串的部分拆分代码:
 

        String s1 = "hello world hello bit";
        String[] result = s1.split(" ", 2);
        for(String x : result) {
            System.out.println(x);
        }

拆分IP地址:
 

        String s1 = "192.168.1.1";
        String[] result = s1.split("\\.");
        for(String x : result) {
            System.out.println(x);
        }

执行效果:

注意:要写划分ip地址,在字符串里写进转义字符,在字符串里,两个 “ \\ ” 代表一个 “ \ ” 

1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

如下:

        String s1 = "192.16-8.1.1";
        String[] result = s1.split("\\.|-");
        for(String x : result) {
            System.out.println(x);
        }

代码示例: 多次拆分
 

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}

7、字符串截取

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

方法功能
String substring(int beginIndex)从指定索引截取到结尾
String substring(int beginIndex, int endIndex)截取部分内容

代码:

        String s = "helloworld";
        System.out.println(s.substring(5));
        System.out.println(s.substring(0, 5));

执行效果:

注意:区间是是前闭后开的规则,上面的第二个substring语句,是 [0,5)。所以不包含5下标。

8、其他操作方法

方法功能
String trim()去掉字符串中的左右空格,保留中间空格
String toUpperCase()字符串转大写
String toLowerCase()字符串转小写

trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等).
后面两个函数只转换字母


二、String的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1. String类在设计时就是不可改变的,String类实现描述中已经说明了

String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:
1. String类被final修饰,表明该类不能被继承。
2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
比如 replace 方法:

原因不是final,

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的
代码验证如下:

final int array[] = {1,2,3,4,5};
array[0] = 100;
System.out.println(Arrays.toString(array));
//array = new int[]{4,5,6}; //java: 无法为最终变量array分配值

执行效果:

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下,尽量避免对String的直接修改,如果要修改建议尽量使用StringBuffer或者StringBuilder。


三、StringBuffer和StingBuilder

1、方法:

方法说明
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的内容可以修改。

和StringBuffer的区别也是。频繁修改字符串的情况考虑使用StringBuilder / StringBuffer

2、String、StringBuffer、StringBuilder的区别

(1)String的内容不可修改,StringBuffer和StringBuilder的内容可修改。

(2)StringBuffer和StringBuilder的大部分功能一样。

(3)StringBuffer采用同步处理,属于线程安全操作,StringBuilder未采用同步处理,不属于线程安全操作。


都看到这了,点个赞再走吧,谢谢谢谢谢!!

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

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

相关文章

云端导览,数字互动 | 拓世法宝AI数字人一体机助力全新旅游时代

《中国旅行消费趋势洞察白皮书&#xff08;2023版&#xff09;》显示&#xff0c;消费者旅行习惯已从“到此一游”变为“深度在地”&#xff0c;更强调在旅游中充实自我、学习新知识。 &#xff08;《中国旅行消费趋势洞察白皮书&#xff08;2023版》截图&#xff09; 从这些资…

从入门到精通!Python数据分析畅销书《利用Python进行数据分析》第三版中文版助你成为数据分析师!

Python数据分析畅销书《利用Python进行数据分析》第三版中文版助你成为数据分析师&#xff01; 个人简介什么是数据分析如何自学数据分析书籍推荐作译者简介作者简介译者简介 主要变动导读视频&#xff1a;购书链接&#xff1a;参与方式往期赠书回顾 个人简介 &#x1f3d8;️&…

RTS 客户端-服务器网络

Stone Monarch 从一开始就支持多人游戏&#xff0c;但随着时间的推移&#xff0c;网络模型经历了多次迭代。我最初基于这篇著名的帝国时代文章实现了点对点锁步模型。 点对点锁定步骤有一些众所周知的问题。点对点方面使玩家很难相互连接&#xff0c;并增加了每个新玩家的网络…

2024年跨境电商黄金赛道预测来了!跨境电商首选平台和品类有哪些?

跨境电商作为外贸新常态&#xff0c;在2023年已逐渐进入稳定增长的发展阶段&#xff0c;想必2024年跨境电商也会是一个向好的发展趋势&#xff0c;2024年做跨境电商&#xff0c;找准适合自己的电商平台和产品是成功的关键&#xff0c;今天东哥就对2024年的跨境电商黄金赛道做一…

【OpenAI】经营权争夺战关系图

《OpenAI新模型曝重大飞跃&#xff1a;AGI雏形或威胁人类&#xff0c;也成Altman被解雇导火索&#xff01;》摘要如下: [一句话总结] OpenAI的Q*项目取得突破&#xff0c;解决了以前未见过的数学问题&#xff0c;为AI发展带来重要的技术里程碑。 [文章概览要点] OpenAI内部研…

小程序逆向工具 | 3秒抓取微信小程序源码

目录 一、工具准备 二、解密小程序 1、找到小程序包 2、解密小程序包 三、反编译小程序 1、安装依赖 2、执行反编译 四、完成 想成为一名微信小程序的开发者&#xff0c;前端思路的学习和安全意识是非常有必要的&#xff0c;故务必掌握小程序反编译技能。 这里用到了2…

【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型

1、阻塞队列(BlockingDeque) 首先我们来认识一下什么是堵塞队列 阻塞队列即实现了线程安全和阻塞的队列。在队列为空时&#xff0c;获取元素的线程会等待队列存放元素变为非空&#xff1b;在队列满时&#xff0c;存放元素的线程会等待队列取出元素变为不满。 阻塞队列常应用于生…

微信小程序实现类似Vue中的computed、watch功能

微信小程序实现类似Vue中的computed、watch功能 构建npm使用 构建npm 创建包管理器 进入小程序后&#xff0c;打开终端&#xff0c;点击顶部“视图” - “终端” 新建终端 使用 npm init -y初始化包管理器&#xff0c;生成一个package.json文件 安装 npm 包 npm install --…

【nlp】3.2 Transformer论文复现:1. 输入部分(文本嵌入层和位置编码器)

Transformer论文复现:输入部分(文本嵌入层和位置编码器) 1 输入复现1.1 文本嵌入层1.1.1 文本嵌入层的作用1.1.2 文本嵌入层的代码实现1.1.3 文本嵌入层中的注意事项1.2 位置编码器1.2.1 位置编码器的作用1.2.2 位置编码器的代码实现1.2.3 位置编码器中的注意事项1 输入复现…

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间&#xff0c;因为不仅要解决多业务系统数据质量标准不一问题&#xff0c;还需要进行大量的公式计算、报表设计与制作。但那是以前&#xff0c;在大数据分析工具强势崛起的当下&#xff0c;这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…

配电室智慧运维

配电室智慧运维是一种基于先进技术和智能化管理理念的配电室运维模式。依托电易云-智慧电力物联网&#xff0c;它结合云计算、物联网、大数据等技术&#xff0c;对配电室进行全方位的智能化管理和运维&#xff0c;旨在提高配电室的运行效率、安全性和可靠性。 配电室智慧运维的…

求臻医学六周年,我们的故事值得被记录

6载光阴求臻医学持续以科技创新推动产业升级在肿瘤精准诊疗领域持续深耕致力于为肿瘤患者生命续航每一位求臻人都是我们前进的力量也是我们不断创新的源泉我们不拘泥于一种声音以多元化的视角探索前行

发挥云计算潜力:Amazon Lightsail 与 Amazon EC2 的综述

文章作者&#xff1a;Libai 欢迎来到云计算世界&#xff0c;这里有无数的机会和无限的应用程序增长。 在当今的数字时代&#xff0c;企业可能会发现管理基础架构和扩展应用程序具有挑战性。 传统的本地解决方案需要大量的硬件、软件和维护前期投资。 要满足不断增长的需求&…

小型内衣裤洗衣机哪个牌子好?性价比小型洗衣机推荐

内衣内裤应该如何清洗才能实现在不伤衣的同时有能够洗干净呢&#xff1f;其实除了使用温水搭配手洗以外&#xff0c;还有一些清洗方式&#xff0c;那就是选择一台专门为内衣定制的内衣洗衣机。目前内衣洗衣机由于精致小巧&#xff0c;方便安装&#xff0c;方便使用&#xff0c;…

一元三次方程求解——浮点数二分

题目描述 思路 根与根之差的绝对值>1。可以得出距离为1的区间最多只有一个根若存在2个数x1和x2&#xff0c;且x1 < x2&#xff0c;f(x1) x f(x2) < 0&#xff0c;则(x1, x2)之间一定有一个根我们可以遍历每一个区间为1的范围&#xff0c;先判断左端点是否是根&#x…

python数据结构与算法-14_树与二叉树

树和二叉树 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序&#xff0c;堆排序先就此打住&#xff0c;因为涉及到树的概念&#xff0c;所以我们先来讲讲树。 讲完了树之后后面我们开始介绍一种有用的数据结构堆(heap)&#xff0c; 以及借助堆来实现的堆排序…

Hook+jsdom 解决cookie逆向

前言 记录下如何破cookie逆向 目标 目标网址:https://q.10jqka.com.cn/ 目标接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 对抗:cookie反爬虫处理,关键字v,如图 解决步骤 1、JS中关键字查找 如上,我们找到了关键字 v,…

Webstorm 插件文件目录颜色分析——白蓝绿红黄灰

Webstorm 插件文件目录【白色、蓝色、绿色、红色、黄色、灰色】对应当前文件发生什么了&#xff0c;即文件夹当前状态。 WebStrom配置好git或SVN后文件颜色代表的含义&#xff1a; 白色&#xff1a;本地无修改内容 蓝色&#xff1a;文件内容有修改&#xff0c;暂未提交到git…

Re51:读论文 Language Models as Knowledge Bases?

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Language Models as Knowledge Bases? ArXiv网址&#xff1a;https://arxiv.org/abs/1909.01066 官方GitHub项目&#xff1a;https://github.com/facebookresearch/LAMA 本文是2019年…

深度学习之基于Tensorflow卷积神经网络鸟类目标识别检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;在鸟类目标识…