java-字符串

news2024/11/15 13:32:08

一、String概述

java.lang.String类代表字符串,java中所有字符串文字都是该类的对象

字符串的内容是不会发生变化的,它的对象在创建之后就不能被更改

二、创建String对象

1、直接赋值

语法:

String 变量名=内容;

2、使用构造方法

语法1:

String 变量名=new String();

语法2:

String 变量名=new String(字符串);

语法3:

String 变量名=new String(字符数组);

语法4:

String 变量名=new String(字节数组);

public class StringDemo {
    public static void main(String[] args) {
        // 1.直接创建
        String s1="你好java";
        System.out.println(s1);

        // 2.使用new的方式来获取一个字符串
        // 使用空参构造方法创建空字符串
        String s2=new String();
        System.out.println("x"+s2+"!"); // s2是一个空白字符串

        // 传递一个字符串 使用非空参构造创建字符串
        // 这种方法与直接创建效果一样 没有必要用
        String s3=new String("abc");
        System.out.println(s3);  // s3: abc

        // 传递一个数组 根据数组的内容进行拼接再创建一个字符串
        char [] chs={'a','b','c'};
        String s4=new String(chs);
        System.out.println(chs); // s4:abc

        // 传递一个字节数组 根据数组内容再创建一个新的字符串对象
        // 字符串的内容是由数组内容对应在ascii码值的字符组成
        // 在本例中ascii码值为97对应的字符为a 98为b 99为c
        byte [] bytes={97,98,99};
        String s5=new String(bytes);
        System.out.println(s5); // s5: abc
    }
}

三、串池

当使用双引号直接赋值时,系统会检测字符串在串池中是否存在,如果不存在,则创建新的字符串,如果存在则复用该字符串

因此直接赋值比new更能节省空间

四、字符串的比较

实现字符串内容的比较:

1、boolean equals(要比较的字符串)

语法:字符串1.equals(字符串2)

完全一样的结果才是true ,否则为false

2、boolean equalslgnorecase(要比较的字符串)

语法:字符串1.equalsIgnoreCase(字符串2)

忽略大小写的比较(忽略的是英文状态下的大小写 中文状态下的大小写不能忽略 e.g:一 壹 不能认为相同)

public class 字符串的比较 {
    public static void main(String[] args) {
        String s1=new String("abc");
        String s2="abc";
        System.out.println(s1==s2);
        boolean result1=s1.equals(s2);
        System.out.println("s1.equals(s2)的结果是"+result1);
        boolean result2=s1.equalsIgnoreCase(s2);
        System.out.println("s1.equalsIgnoreCase(s2)的结果是"+result2);
    }
}
// 输出结果:
// false
// s1.equals(s2)的结果是true
// s1.equalsIgnoreCase(s2)的结果是true
import java.util.Scanner;

public class 字符串的比较 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in); //创建Scanner类对象sc
        String s1=sc.next(); // 从键盘录入的字符串 也是new出来的
        String s2="abc";     // 直接赋值的字符串
        System.out.println(s1==s2); // 因此两者的地址是不一样的
    }
}

五、字符串的遍历

1、字符串长度:字符串对象.length()

注意区分 数组的长度是:数组名.length

2、获取索引对应的字符:字符串对象.charAt(索引)


public class 遍历字符串 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String s=sc.next();
        // for循环的简便写法:s.length().fori
        for (int i = 0; i < s.length(); i++) {
            // 获取i索引对应的字符
            System.out.println(s.charAt(i));
        }
    }
}

六、字符串的截取

截取多个字符用字符串.substring,截取一个字符用字符串.charAt

1、字符串.substring(int beginindex ,int endindex)

beginindex索引开始截取到endindex结束,不包含endindex

2、字符串.substring(int beginindex)

从beginindex索引开始一直截取到末尾

public class test {
    public static void main(String[] args) {
        // 1.字符串.substring(int beginindex ,int endindex)
        // 其返回值是截取之后的字符串
        // 注意:被截取的字符串不会发生变化 因为字符串是不可变的
        String phonenumber="19173239796";
        String phonenumber1=phonenumber.substring(0,3); // 从索引0开始截取一直到索引3 不包括索引3
        System.out.println(phonenumber);// 19173239796
        System.out.println(phonenumber1);// 191

        // 2.字符串.substring(int beginindex)
        String phonenumber2=phonenumber.substring(7);
        System.out.println(phonenumber);// 19173239796
        System.out.println(phonenumber2);// 9796
    }
}

七、字符转化为数字、字符串转为字符数组、字节数组

1、字符转化为数字

字符-48即可得到对应的数字

2、字符串转为字符数组

语法:字符串名.toCharArray();

3、字符串转为字节数组

语法:字符串名.getBytes();

public class 字符串转化 {
    public static void main(String[] args) {
        String str="abc";
        // 字符串转化为字符数组
        char [] arr1=str.toCharArray();
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]+" ");
        }// 输出: a b c
        
        System.out.println();
        
        // 字符串转化为字符数组
        byte [] arr2=str.getBytes();
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]+" ");
        }// 输出: 97 98 99 
    }
}

八、字符串的替换

字符串.replace(旧值,新值);

有返回值,返回的是替换后的字符串,原字符串不会发生变化

public class test1 {
    public static void main(String[] args) {
        // 1.字符串.replace(旧字符串,新字符串)
        String oldstr="菜就多练,TMD";
        String newstr=oldstr.replace("TMD","***");
        System.out.println(oldstr);
        System.out.println(newstr);
        // 输出:
        // 菜就多练,TMD
        // 菜就多练,***

        // 2.有多个要替换的字符串 就将要替换的字符串放在一个字符数组中 遍历字符数组进行替换即可
        String talk="菜就多练,TMD,wk";
        String [] str={"wk","wc","TMD"};
        for (int i = 0; i < str.length; i++) {
            talk=talk.replace(str[i],"***");
        }
        System.out.println(talk);
        // 输出:
        // 菜就多练,***,***
    }
}

九、修改字符串内容

1、通过subString进行裁剪然后拼接

2、将字符串转化为字符数组,调整字符数组的内容,再将调整好的字符数组转化为字符串

十、StringBuilder

概述:

StringBuilder是一个容器,创建之后里面的内容是可变的

对字符串进行操作时,我们可以将字符串转化为StringBuilder容器,能更加方便操作,最后将StringBuilder容器转化为字符串即可

StringBuilder是一个类,因此创建它的对象同样需要通过构造方法

1、StringBuilder构造方法

空参构造:

public StringBuilder();

创建一个空白可变字符串对象

带参构造:

public StringBuilder(String str);

根据字符串内容,创建可变字符串对象

public class test2 {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder();
        System.out.println(sb);
        // 没有任何输出结果 并不会输出地址值
        // 因为StringBuilder是java已经写好的类 系统对其进行了处理 
        // 它的结果输出的是属性值(即容器中存放的数据) 而不是地址值
        StringBuilder sb1=new StringBuilder("abc");
        System.out.println(sb1);// 输出:abc
    }
}

2、StringBuilder成员方法

1、StringBuilder容器名.append(任意类型)

作用:添加数据,并返回对象本身(仍是StringBuilder类型

public class test2 {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder("abc");
        sb.append(1);// 添加整数
        sb.append(2.3);// 添加浮点数
        sb.append('a');// 添加字符
        sb.append(true);// 添加布尔值
        sb.append("你好");// 添加字符串
        System.out.println(sb);// 输出:abc12.3atrue你好
    }
}

2、StringBuilder容器名.reverse()

作用:反转容器里面的内容 返回的仍是StringBuilder类型

注意:直接在容器内部反转 而不是将反转的内容存放在新的容器中
public class test2 {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder("abc");
        sb.append(1);// 添加整数
        sb.append(2.3);// 添加浮点数
        sb.append('a');// 添加字符
        sb.append(true);// 添加布尔值
        sb.append("你好");// 添加字符串
        System.out.println(sb);// 输出:abc12.3atrue你好
        // sb.reverse()与sb的内容一样说明是直接在容器内部反转 而不是将反转的内容存放在新的容器中
        System.out.println(sb.reverse());// 输出:好你eurta3.21cba
        System.out.println(sb);// 输出:好你eurta3.21cba
    }
}

3、StringBuilder容器名.length()

作用:返回长度(字符出现的个数)

public class test2 {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder("abc");
        System.out.println(sb.length());// 输出:3
    }
}

4、StringBuilder容器名.toString()

作用:通过toString()就可以把StringBuilder转化为String,返回字符串 因为通过StringBuilder拼接后是StringBuilder类型,不是String类型,因此需要转化

public class test2 {
    public static void main(String[] args) {
        StringBuilder sb=new StringBuilder("文韬");
        sb.append("你好");
        sb.append("星期六");
        System.out.println(sb);// 输出:文韬你好星期六
        // 这里的sb不是字符串 而是一个可以操作字符串的容器 因此我们需要将容器转化为字符串
        String str=sb.toString();
        System.out.println(str);// 输出:文韬你好星期六
        // 这里的str是字符串
    }
}

3、链式编程

当我们调用一个方法后不用接收它的返回值,而是继续调用方法,通过链式编程思想我们可以简化代码

简化前:

简化后:

4、StringBuilder使用场景

1、字符串的拼接

2、字符串的反转

十一、StringJoiner

StringJoiner和StringBuilder一样是一个容器,创建之后里面的内容是可变的

1、StringJoiner构造方法

空参构造:

public StringJoiner(间隔符号);

创建一个StringJoiner对象,指定拼接时的间隔符号

带参构造:

public StringJoiner(间隔符号,开始符号,结束符号);

创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号

注意:间隔符不能以字符的形式输入

因为分隔符(delimiter)、前缀(prefix)、后缀(suffix),它们的类型为 CharSequence,CharSequence 是一个接口,它表示一个字符序列,而 String 类实现了这个接口。char 类型的值需要被包装成 String 才能作为 CharSequence 使用。

2、StringJoiner成员方法

1、StringJoiner容器名.add(添加的内容)

注意:添加的内容主要是字符串

作用:添加数据,并返回对象本身(仍是StringJoiner类型 因此可以使用链式编程的思想添加元素

2、StringJoiner容器名.length()

作用:返回长度(字符出现的个数,包括间隔符号和开始、结束符号

3、StringJoiner容器名.toString()

作用:通过toString()就可以把StringJoiner转化为String,返回字符串 因为通过StringJoiner拼接后是StringJoiner类型,不是String类型,因此需要转化

十二、字符串拼接的底层原理

对于不含变量的字符串进行拼接 在编译成字节码文件时就拼接好了 在实际运行的时候就是已经拼接好的字符串

public class StringJoinerdemo2 {
    public static void main(String[] args) {
        String s1="abc";
        // 对于不含变量的字符串进行拼接 在编译成字节码文件时就将"a"+"b"+"c"拼接成"abc"
        // 在实际运行的时候s2就是"abc"
        String s2="a"+"b"+"c";
        System.out.println(s1==s2);
        // 输出:true
    }
}

JDK8以前,如果有变量参与字符串的拼接,那么就会创建一个StringBuilder容器对象来存放变量的值并进行拼接,最后将StringBuilder容器转化为字符串类型(且这个字符串是在堆中重新生成的字符串),JDK8以后,它会预估拼接好的字符串的长度,并将字符串存放到数组中,此时的字符串也是新的字符串

public class StringJoinerdemo2 {
    public static void main(String[] args) {
        String s1="abc";// s1是记录串池中的地址值
        String s2="ab";
        String s3=s2+"c";// s3是新new出来的对象
        System.out.println(s1==s3);
        // 输出:false
        
        // 如果将String s3=s2+"c";改为String s3="ab"+"c";
        // 那么System.out.println(s1==s3);输出结果为true
    }
}

十三、StringBuilder源码分析

创建一个StringBuilder就会默认创建一个长度为16的字节数组

添加的内容长度小于16就会直接存放内容

添加的内容长度大于16就会进行扩容(扩容后的容量为原来的容量*2+2 即34)

如果扩容后仍然不够存放添加的内容就以实际长度为准

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

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

相关文章

Linux 磁盘存储挂载

fdisk -l 查看磁盘信息 mkfs.xfs /dev/vdc 格式化数据盘 mkdir vdev1 创建挂载点 mount /dev/vdc /vdev1 文件系统挂载点挂载 df -h 确认挂载成功 vi /etc/fstab 插入 /dev/vdc /vdev1 xfs defaults 0 0 /dev/vdc /vdev1 xfs defaults 0 0 保存就可以了 卸载实例&#…

韩顺平 | 零基础快速学Python(16) 文件处理

文件 输入与输出 输入&#xff1a;数据从数据源(文件)到程序(内存)&#xff1b; 输出&#xff1a;数据从程序(内存)到数据源(文件)。 #mermaid-svg-06PG6JZq4jJMV1oH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-sv…

SpringBoot源码解析-01

SpringBoot3详细版 一&#xff1a;SpringBoot引入&#xff1a; 1.1.什么是Springboot&#xff1a; SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明&#xff1a;SpringBoot底层是Spring&#xff09; 大多数 SpringBoot 应用只需要编…

洛谷 P9532 [YsOI2023] 前缀和

题目背景 Ysuperman 模板测试的试机题。 小心立秋&#xff0c;小心秋丽。 题目描述 立秋有一个长度为 n 的数组 a&#xff0c;所有数字都是正整数&#xff0c;并且除了其中第一个数字以外其它数字都等于前面所有数字的和。 例如&#xff0c;数组 [1,1,2,4,8,16] 就有可能是…

如何入行产品经理?

转产品经理第一点要先学基础理论知识&#xff0c;学了理论再去实践&#xff0c;转行&#xff0c;跳槽&#xff01; 学理论比较好的就是去报NPDP的系统班&#xff0c;考后也会有面试指导课&#xff0c;跟职场晋升课程&#xff0c;对小白来说非常合适了~&#xff08;可以去哔站找…

【程序分享】AACSD 程序: 用于晶体结构和缺陷的原子分析平台

分享一个 AACSD 程序: 用于晶体结构和缺陷的原子分析平台。 感谢论文的原作者&#xff01; 主要内容 “我们开发了一个名为 AACSD&#xff08;晶体结构和缺陷原子分析器&#xff09;的高效命令行程序&#xff0c;用于对各种原子模拟代码生成的原子配置进行后期分析。该程序不…

利用栈删除数组中重复元素

先将数据排序&#xff08;降序或升序&#xff09; 建立一个“栈”&#xff0c;三种情况&#xff1a; 1.栈为空&#xff1a;压入一个元素 2.栈不为空 且 栈顶元素不等于将入栈元素&#xff1a;压入一个元素 3.栈不为空 且 栈顶元素等于将入栈元素&#xff1a;删除将压入元素…

循环双链表的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一个裂缝都是为透出光而努力&#…

Redis消息队列-基于PubSub的消息队列

7.3 Redis消息队列-基于PubSub的消息队列 PubSub&#xff08;发布订阅&#xff09;是Redis2.0版本引入的消息传递模型。顾名思义&#xff0c;消费者可以订阅一个或多个channel&#xff0c;生产者向对应channel发送消息后&#xff0c;所有订阅者都能收到相关消息。 SUBSCRIBE …

mysql dump导出导入数据

前言 mysqldump是MySQL数据库中一个非常有用的命令行工具&#xff0c;用于备份和还原数据库。它可以将整个数据库或者特定的表导出为一个SQL文件&#xff0c;以便在需要时进行恢复或迁移。 使用mysqldump可以执行以下操作&#xff1a; 备份数据库&#xff1a;可以使用mysqld…

【Linux 驱动基础】设备树中断

# 前置知识 interrupts 文档 Specifying interrupt information for devices 1) Interrupt client nodes -------------------------Nodes that describe devices which generate interrupts must contain an "interrupts" property, an "interrupts-extende…

【数据库】表的增删改(CUD)

目录 一、insert 插入 1.单行插入&#xff1a; 2.多行插入&#xff1a; (1) insert into 插入&#xff1a; (2) replace into 替换插入&#xff1a; (3) 图片插入 &#xff1a; 二、update 修改 三、delete 删除 一、insert 插入 语法&#xff1a; INSERT INTO table_name…

ue4打包多模块

首先&#xff0c;每个模块&#xff0c;包含插件内的模块在内&#xff0c;都要用IMPLEMENT_MODULE(类名, 模块名)的方式&#xff0c;模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用&#xff0c;用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

go语言并发实战——日志收集系统(一) 项目前言

-goroutine- 简介 go并发编程的练手项目 项目背景 一般来说业务系统都有自己的日志,当系统出现问题时,我们一般需要通过日志信息来定位与解决问题&#xff0c;当系统机器较少时我们可以登录服务器来查看,但是当系统机器较多时,我们通过服务器来查看日志的成本就会变得很大,…

leetcode刷题日记之全排列

题目描述 题目解释 这个题类似于之前做的某一道题&#xff0c;其实算法还是要追踪到树的深度遍历&#xff0c;相当于便利叶子节点的路径记录。不过递归的过程就相当于件数根据树进行遍历了。 代码如下 class Solution:def permute(self, nums: List[int]) -> List[List[i…

电动汽车原理视频笔记

看到了一个讲的不错的系列视频 新能源维修猿老罗的个人空间-新能源维修猿老罗个人主页-哔哩哔哩视频 道路千万条&#xff0c;安全第一条&#xff01;新能源维修高压安全知识以及维修工具介绍_哔哩哔哩_bilibili 那么简单&#xff01;电动汽车高压配电和控制_哔哩哔哩_bilibili…

EasyRecovery数据恢复软件2024百度云网盘下载链接

EasyRecovery数据恢复软件是一款功能强大的数据恢复工具&#xff0c;它能够帮助用户从各种存储设备中恢复丢失或误删除的文件数据。无论是由于意外删除、格式化、病毒攻击还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的解决方案。 该软件支持多种存储介质…

创维:在博鳌论坛 叩响世界之门

出走半生&#xff0c;归来仍是少年。 2024年4月8日&#xff0c;一个离开海南近半个世纪的“少年”回到琼海博鳌&#xff0c;“下一站&#xff0c;1000亿&#xff01;”&#xff0c;他的承诺掷地有声。“1000亿”&#xff0c;意指创维集团在2025年前冲击千亿营收&#xff0c;这…

选课成绩管理系统

文章目录 员工管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;&#xff09; 员工管理系统 一、项目演示 课程管理系统 二、项目介绍 基于springbootvue的前后端分离选课成绩管理系统 该系统可做课程管理…

【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口

专栏&#xff1a;Java开发指南 CSDN秋说 文章目录 访问实例变量和方法继承接口 访问实例变量和方法 通过已创建的对象来访问成员变量和成员方法&#xff0c;如下所示&#xff1a; /* 实例化对象 */ Object referenceVariable new Constructor(); /* 访问类中的变量 */ refer…