Java中的字符串String

目录

一、常用方法

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未采用同步处理,不属于线程安全操作。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盘点一下:为了考上本科,你需要放弃什么?

专转本除了胜利后喜悦&#xff0c;更多的则是过程的艰辛&#xff0c;为了专转本成功&#xff0c;我们放弃了自己的娱乐时间、放弃了自己的兴趣爱好。 专转本考试相当于人生第二次“高考”&#xff0c;在学历门槛的今天&#xff0c;越来越多的人都在通过各类途径提转个人学历。…

基准电压源的工作原理和作用是什么(高精度电压源)

基准电压源是一种能够提供固定、稳定的直流电压输出的电源设备。它广泛应用于精密仪器、测试设备、通信设备等领域&#xff0c;是实现精确电压测量和校准的重要工具。本文将为您介绍基准电压源的工作原理和作用。 一、基准电压源的工作原理 基准电压源采用了高精度的电路设计和…

【数据结构】深入浅出理解链表中二级指针的应用

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 &#x1f4cc;形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 &#x1f38f;传值…

【23真题】最后一套两电一邮,纸老虎偏多!

今天分享的是23年西安电子科技大学811的信号与系统试题及解析。更新完这套&#xff0c;两电一邮的全部23真题已更新完毕&#xff01; 本套试卷难度分析&#xff1a;22年西电811考研真题&#xff0c;我发布过&#xff0c;若有需要戳这里自取&#xff01;这里统计了811的上岸平均…

Linux本地MinIO存储服务远程调用上传文件

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. …

数据结构算法-贪心算法

引言 贪心&#xff1a;人只要有 “需求“ &#xff0c;都会有有点“贪“&#xff0c; 这种“贪“是一种选择&#xff0c;或者“”取舍“ RTS&#xff08;即时战略&#xff09;游戏&#xff1a; 帝国时代里 首先确保拥有足够的人口 足够的粮食&#xff0c;足够的战略资源 足够的…

【linux】服务器CPU占用50%,top/htop/ps却看不到异常进程?使用unhide可以查看!

问题描述 htop发现前32个核全被占满了&#xff0c;但是却找不到对应进程号 查杀 安装unhide查看隐藏进程 apt-get install unhideunhide使用 unhide proc果然发现了隐藏进程 杀死隐藏进程 kill -9 [pid]这么多pid号&#xff0c;我这边杀了其中一个&#xff0c;发现CPU…

Docker 安装 Apache

目录 拉取官方 Apache 镜像 查看本地镜像 列出正在运行的容器 运行 Apache 容器 创建一个 HTML 文件&#xff1a;index.html 访问 Apache 拉取官方 Apache 镜像 查找 Docker Hub 上的 httpd 镜像。 可以通过 Tags 查看其他版本的 httpd&#xff0c;默认是最新版本 httpd…

vue2.0+elementui集成file-loader之后图标失效问题

背景 跑vue2elementUI项目时&#xff0c;由于前端这边需要在本地存放xlsx模板文件&#xff0c;供用户下载模板文件&#xff0c;所以需要在webpack构建的时候增加file-loader进行解析xlsx文件打包。 vue版本2.x element-ui 版本 2.13.x 注意 npm i -D file-loader版本号给vue项…

史诗级云故障敲响警钟,应用保障不能没有“连续键”!

近日&#xff0c;知名云服务商出现一次史诗级的云故障&#xff1a;全球所有区域/所有服务同时异常&#xff0c;故障持续长达3小时之多&#xff0c;云上众多应用受到极大影响。 如今&#xff0c;在一个充满不确定性和复杂性的数字化时代&#xff0c;哪怕是顶级云服务商亦不能避…

3.7寸墨水屏蓝牙卡证

超薄机身&#xff0c;厚度不足一厘米&#xff0c;轻松佩戴无负重感。 无需基站&#xff0c;服务器&#xff0c;手机APP直接更新~ 独创快速扫描技术&#xff0c;智能感应标签 超长待机&#xff0c;超低功耗&#xff0c;Type C接口充电&#xff0c;一次充电可续航一年&#xf…

docker安装以及idea访问docker

其他目录&#xff1a; docker 安装环境&#xff08;有空更新&#xff09; url “” docker 打包java包&#xff0c;并运行&#xff08;有空更新&#xff09; url “” docker 打包vue &#xff08;有空更新&#xff09; url “” docker 多服务 &#xff08;有空更新&#xff…

PC8259(CC-CV控制)同步降压芯片5V/4.8A 输出频率可调 带电流限制 QFN20封装

概述 PC8259是一个同步降压转换器输出电流为4.8A在9V至36V。外部关闭功能可以由逻辑电平控制以下拉COMP/EN引脚&#xff0c;然后进入待机模式。外部补偿使反馈控制具有良好的线性以及具有灵活外部设计的负载调节。PC8259在CC&#xff08;恒定输出电流&#xff09;模式或CV&…

一篇文章,教你看懂加密工具The Enigma Protector

The Enigma Protector作为一款专业的软件授权和保护工具&#xff0c;一直以来深受开发者喜爱&#xff0c;此次携手慧都合作上线&#xff0c;更加方便了国内用户的购买和使用&#xff0c;一起来看看这款工具都有哪些值得期待的地方↓↓↓ The Enigma Protector 是一款专门设计用…

SSL证书对网站的作用及影响?

SSL证书作为当下互联网的重要安全件&#xff0c;包括搜索引擎的收录、网站是否具备信任的条件以及HTTP2.0传输协议的相互作用等&#xff0c;尤其是浏览器对古老的http协议警告提示不安全将直接影响到用户的信任度以及品牌形象&#xff0c;对于网站来说可谓是必不可少。 SSL证书…

ubuntu22.04安装wvp-gb28181-pro 2023-11-23最新版本(一键安装)

下载程序 输入下面命令&#xff0c;输入普通用户密码&#xff0c;切换到 root用户 sudo su git clone -b ubuntu_wvp_online_install_2023_0425 https://gitcode.net/zenglg/ubuntu_wvp_online_install.git 等待下载完成 安装 进入到克隆下来的路径中 cd /home/tuners/ub…

c++版本opencv计算灰度图像的轮廓点

代码 #include<iostream> #include<opencv.hpp>int main() {std::string imgPath("D:\\prostate_run\\result_US_20230804_141531\\mask\\us\\104.bmp");cv::Mat imgGray cv::imread(imgPath, 0);cv::Mat kernel cv::getStructuringElement(cv::MORPH…

从六个方面对比Go和Python的差异

您是否想过 Go 与 Python 之间的主要区别是什么&#xff1f;随着对软件开发人员的需求不断增加&#xff0c;选择哪种编码语言可能会很困难。 ​ 在此&#xff0c;我们将从六个方面对比Go和Python,探讨 Go 和 Python之间的差异。我们将讨论它们的特点、优缺点&#xff0c;以便…

2022-4-11 南科大现代控制与最优估计

CLEAR_LAB B站视频 矩阵的分块矩阵操作 diagonal 对角阵 identity matrix 单位矩阵 矩阵克罗内克积