JavaSE——String类详解

news2025/1/17 14:05:21

目录

一、String类简介

二、关于字符串拼接的+号 

三、StringJoiner类——通过连接符拼接字符串

四、String类常用方法详解

五、instanceof关键字


一、String类简介

        String是被final修饰的类,不能被继承,因此不能使用匿名内部类。String是一个常量,不可变,所以可以被共享。原因是String在内存中存放在方法区中的字符串常量池中,底层是一个byte数组,数组有地址,String的地址是不可变的,而不是说String本身不可变,原有的值不变,所以叫常量。

注意:JDK8中是char[] value        JDK11中是byte[] value

二、关于字符串拼接的+号 

public static void main(String[] args) {
    String s1 = "ab";
    // s2是字面量,在编译期间已经变成了"ab"
    String s2 = "a" + "b";
    // 在编译到这一行时,知道s3是"a"
    String s3 = "a";
    // 在编译这一行时候,只知道s3是String类型,不能确定其值
    /*
    字符串使用 +号 相当于使用 StringBuilder
    StringBuilder stringBuilder = new StringBuilder("a");
    // 拼接字符串
    stringBuilder.append("b");
    stringBuilder转为String:
    String s = stringBuilder.toString();
    System.out.println(s);
     */
    s3 += "b";
    System.out.println(s1); // ab
    System.out.println(s2); // ab
    System.out.println(s3); // ab
    System.out.println(s1 == s2); // true
    System.out.println(s1 == s3); // false
}

因此,使用+号的时候 String s3 = "a"; s3+="b";创建了5个对象:

"a"、"b"、"ab"、StringBuilder、toString中也会创建String对象。

方法传参:基本数据类型和String传参,值不变

  • 少量的字符串拼接可以使用+号,大量拼接字符串效率低;
  • 大量的字符串拼接使用StringBuilder,但是线程不安全;
  • 大量的字符串拼接也可以使用StringBuffer,线程安全;

三、StringJoiner类——通过连接符拼接字符串

// 设置连接符
String[] names = {"A", "B", "C", "D", "E"};
StringJoiner stringJoiner = new StringJoiner("-");
for (String name : names) {
    stringJoiner.add(name);
}
System.out.println(stringJoiner); // A-B-C-D-E


// 设置开头结尾
String[] names1 = {"U", "V", "W", "X", "Y"};
StringJoiner stringJoiner1 = new StringJoiner("-", "[", "]");
for (String name : names1) {
    stringJoiner1.add(name);
}
System.out.println(stringJoiner1); // [U-V-W-X-Y]

四、String类常用方法详解

public class TestDemo3 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str = "abcd";
        // 根据索引获取对应的字符
        char c = str.charAt(2);
        System.out.println(c); // c

        // 获取字符串的长度
        System.out.println(str.length()); // 4

        // 把字符串转换成字符数组
        char[] chars = str.toCharArray();
        System.out.println(chars); // abcd

        // 把字符数组转换成字符串
        char[] chs = {'h', 'e', 'l', 'l', 'o'};
        String s = new String(chs);
        System.out.println(s); // hello

        // 把字符数组的一部分转换成字符串
        // offset:表示截取字符数组的起始索引
        // count:截取的长度
        String s1 = new String(chs, 0, 3);
        System.out.println(s1); // hel

        String str2 = "中国人";
        String str3 = "ABCD";
        String str4 = "abcfadshadcabc.java";
//         ctrl + alt + 左右
//         字符串是以字节数组形式存储
//         在比较两个字符数组的时候,是进行逐位比较
//         如果对应字符不相等返回的是字符之差
//         如果字符相同,返回的是长度之差
//         如果返回的是一个正数,对象 > 参数
//         如果返回的是一个负数,参数 > 对象
        System.out.println(str2.compareTo(str3)); // 19948
        // 忽略大小写比较
        System.out.println(str2.compareToIgnoreCase(str3)); // 19916
        // 把字符串转换成大写
        System.out.println(str4.toUpperCase()); // ABCFADSHADCABC.JAVA
        // 把字符串转换成小写
        System.out.println(str3.toLowerCase()); // abcd

        // 字符串的拼接  本质上是将两个字节数组合并成一个字节数组再转换成字符串返回
        // concat效率低,不推荐
        System.out.println(str2.concat("abc")); // 中国人abc
        // 拼接字符串
        System.out.println(String.join("-", "A", "B", "C", "D"));
        // A-B-C-D

        // 判断是否包含某一个字符串
        System.out.println(str4.contains("ad")); // true
        // 判断是否以...结束
        System.out.println(str4.endsWith(".java")); // true
        // 判断是否以...开始
        System.out.println(str4.startsWith("https://")); // false

        // 比较字符串是否相等
        System.out.println("ABCD".equals(str3)); // true

        // 忽略大小写比较字符串
        System.out.println("abcd".equalsIgnoreCase(str3)); // true
        // 把字符串转换成字节数组
        // utf-8一个汉字占3个字节
        byte[] bytes = str2.getBytes();
        System.out.println(str2.length()); // 3
        System.out.println(bytes.length); // 9
        // 指定编码来将字符串转换成数组
        // gbk 一个汉字占两个字节
        byte[] gbks = str2.getBytes("gbk");
        System.out.println(gbks.length); // 6
        // 将字节数组转换成字符串
        String s2 = new String(bytes, "utf-8");
        System.out.println(s2); // 中国人
        // 指定编码转换
        String gbk = new String(gbks, "GBK");
        System.out.println(gbk); // 中国人
        String str5 = new String(gbks, 0, 4, "gbk");
        System.out.println(str5); // 中国


        // 同一个字符串的哈希码值是固定不变的
        System.out.println("abc".hashCode()); // 96354
        /**
         * hashCode底层源码:
         * public int hashCode() {
         *        int h = hash;
         *        if (h == 0 && value.length > 0) {
         *            hash = h = isLatin1() ? StringLatin1.hashCode(value)
         *                                  : StringUTF16.hashCode(value);
         *        }
         *        return h;
         *    }
         */

        String str6 = "D:\\img\\hongkonga\\hello.png";
        // 获取指定元素首次出现的索引,如果找不到返回-1
        System.out.println(str6.indexOf('a', 1)); // 15
        System.out.println(str6.indexOf("ka")); // -1

        String str7 = new String("abc");
        String str8 = "abc";
        // 获取字符串的字面量
        System.out.println(str8 == str7.intern()); // true

        String str9 = "";
        // 判断字符串是否是空  判断底层数组长度是否是0
        System.out.println(str9.isEmpty()); // true

        String str10 = "   ";
        // 判断字符串是否是空字符串或者全是空格
        System.out.println(str10.isBlank()); // true

        String str11 = "cksaocnao";
        // 寻找对应字符最后一次出现的索引
        int index = str11.lastIndexOf("a");
        System.out.println(index); // 7

        // 从fromIndex开始依次向前找
        int index1 = str11.lastIndexOf("a", 7);
        System.out.println(index1); // 7

        String repeat = str11.repeat(3);
        System.out.println(repeat); // cksaocnaocksaocnaocksaocnao
        System.out.println(str11.replace('a', 'A'));
        // cksAocnAo
        System.out.println("=======================");

        String str12 = "csabj46NDSJkcbja";
        // 截取字符串 从beginIndex截取到最后
        String substring = str12.substring(3);
        System.out.println(substring); // bj46NDSJkcbja

        // 截取一部分,包头不包尾
        String substring1 = str12.substring(3, 6);
        System.out.println(substring1); // bj4

        String str13 = "D:\\img\\Macaoa\\world.png";
        System.out.println(str13.substring(str13.lastIndexOf("\\") + 1));
        // world.png

        // 生成验证码
        String uuid = UUID.randomUUID().toString();
        System.out.println(uuid); // 8d8f0fff-b1f8-4491-b601-37a62b047464
        String code = uuid.substring(0, 6);
        System.out.println(code); // 8d8f0f

        // 去除字符串两端空格
        String str14 = "     hello  我是   ";
        System.out.println(str14.trim()); // hello  我是

        System.out.println(new Object()); // java.lang.Object@4590c9c3
        // 将对应的类型转换成字符串
        String s3 = String.valueOf(10);
        System.out.println(s3 + 1); // 101
        String s4 = String.valueOf(new Object());
        System.out.println(s4); // java.lang.Object@9629756
    }
}

五、instanceof关键字

关键字:instanceof 用于判断类/接口和对象的关系

格式:对象  instanceof 类/接口    

只要这个对象的实际类型是后面类或者其子类,或者接口的实现类,那么就返回true。

    interface A{}
    class B implements A{}
	class C extends B{}
	class D extends C{}

C c = new D();
c instanceOf A  -- true
c instanceOf B  -- true
c instanceOf C  -- true
c instanceOf D  -- true

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

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

相关文章

leetocode二叉树(六)-翻转二叉树

题目 226.翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。、 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出&#x…

【STM32项目】基于stm32四足跳舞机器人设计与实现(完整工程资料源码)

目录 前言 一、设计目的: 1.1 设计背景 1.2 设计意义 1.3 设计功能 二、硬件部分 2.1 sg90舵机(8个) 2.2 stm32f103c8t6(1个) 2.3 OLED显示屏(1个) 2.4 HC-05蓝牙模块(1个&#xff…

C语言malloc超级详细用法和calloc 扩展

前提 在C语言中&#xff0c;malloc&#xff08;内存分配&#xff09;用于动态分配内存。它是标准库中的一部分&#xff0c;包含在 <stdlib.h> 头文件中。使用 malloc 可以在运行时请求所需的内存空间&#xff0c;而不是在编译时就确定内存大小。 语法 在cplusplus中mall…

LeetCode岛屿数量

题目描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网…

Elasticsearch生产应用(进阶版),不知道怎么提升生产ES集群性能,看这篇就可以了

这里借助kibana进行修改相应的配置 elasticsearch集群的部署&#xff0c;详情请看上一篇文章&#xff1a; Elasticsearch最新版快速入门看这个就可以了-CSDN博客 基础ES集群运维篇可以查看 Elasticsearch 生产应用&#xff08;实用版&#xff09;&#xff0c;知晓这些&…

“探索Adobe Photoshop 2024:订阅方案、成本效益分析及在线替代品“

设计师们对Adobe Photoshop这款业界领先的图像编辑软件肯定不会陌生。如果你正考虑加入Photoshop的用户行列&#xff0c;可能会对其价格感到好奇。Photoshop的价值在于其强大的功能&#xff0c;而它的价格也反映了这一点。下面&#xff0c;我们就来详细了解一下Adobe Photoshop…

Python语言实现梯度提升树 (Gradient Boosting Machines, GBM)算法

梯度提升树&#xff08;Gradient Boosting Machines, GBM&#xff09;是一种集成学习方法&#xff0c;通过迭代地训练决策树&#xff0c;并让每棵新的树拟合前一棵树的残差&#xff0c;从而逐步提高模型的准确率。下面是一个简单的Python实现GBM的例子&#xff1a; 实现思路&a…

机器人大功率主轴SycoTec 4060 ER-S汽车电机机芯焊缝铣削打磨加工

在汽车制造的精密领域&#xff0c;每一个细节都关乎着整车的性能与品质&#xff0c;而汽车电机机芯的焊缝加工更是其中至关重要的一环。在机器人末端加装德国进口电主轴 SycoTec 4060 ER-S&#xff0c;为汽车电机机芯焊缝铣削打磨加工带来全新的解决方案。 SycoTec 4060 ER-S转…

gbase8s之建表相关问题

第一章..绪论 1.1..背景 需要对明年所有系统的表新建。 1.2..要求 对导切建表可能遇到的一些问题罗列及解决办法。 第二章..新建表的的过程 1.1..获取DDL 获取DDL一定要在服务器上去获取&#xff0c;千万别用gds去导出ddl。 1.1.1..切换数据库用户 su – gbasedbt 1.1…

基于ECS和NAS搭建个人网盘

前言 在数字化时代&#xff0c;数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累&#xff0c;使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备&#xff08;如硬盘、U盘&#xff09;虽然方便&#xff0c;但存在易丢失、损坏和数据…

系统思考与业务创新工作坊

感谢合作伙伴对上周新华三项目的积极反馈&#xff01;系统思考远不止是一个两天的课程&#xff0c;而是一场持续修炼的旅程。在麻省理工学院&#xff08;MIT&#xff09;的系统动力学课程中&#xff0c;系统思考需要长达两年的深入学习&#xff0c;而我们在十多年的实践与组织应…

ubuntu 安装docker, docker-compose

1. 安装curl apt-get update apt upgradeapt install curl 2.安装&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 3. 验证&#xff1a; docker -v 4. 安装docker-compose : # 下载 curl -L "https://github.com/docker/compose/rel…

探索 Jupyter 核心:nbformat 库的神秘力量

文章目录 探索 Jupyter 核心&#xff1a;nbformat 库的神秘力量1. 背景介绍&#xff1a;为何选择 nbformat&#xff1f;2. nbformat 是什么&#xff1f;3. 如何安装 nbformat&#xff1f;4. 简单的库函数使用方法4.1 读取 Notebook 文件4.2 修改 Notebook 中的单元格4.3 添加 M…

性能测试-JMeter(2)

JMeter JMeter断言响应断言JSON断言断言持续时间 JMeter关联正则表达式提取器正则表达式正则表达式提取器 XPath提取器JSON提取器 JMeter属性JMeter录制脚本 JMeter断言 断言&#xff1a;让程序自动判断预期结果和实际结果是否一致 提示&#xff1a; -Jmeter在请求的返回层面有…

【Linux】【命令】查找(grep/find)与统计(wc)

查找与统计 grepfindwcExamples grep grep 命令用于在文件中或者标准输出中搜索特定字符串&#xff0c;并显示匹配结果。 grep 全称&#xff1a;Global Regular Expression Print 基本语法&#xff1a; grep [OPTION]... PATTERN [FILE] ...默认情况下&#xff0c;PATTERN 是…

浙大数据结构:09-排序3 Insertion or Heap Sort

这个题跟上个题差不多&#xff0c;只不过是换成了堆排序而已 机翻 1、条件准备 跟之前一样&#xff0c;oldnum数组存旧数组&#xff0c;newnum数组存新数组 #include <iostream> #include<vector> #include<algorithm> using namespace std; #define end…

从调用NCCL到深入NCCL源码

本小白目前研究GPU多卡互连的方案&#xff0c;主要参考NCCL和RCCL进行学习&#xff0c;如有错误&#xff0c;请及时指正&#xff01; 内容还在整理中&#xff0c;近期不断更新&#xff01;&#xff01; 背景介绍 在大模型高性能计算时会需要用到多卡&#xff08;GPU&#xf…

Android实现App内直接预览本地PDF文件

在App内实现直接预览pdf文件&#xff0c;而不是通过调用第三方软件&#xff0c;如WPS office等打开pdf。 主要思路&#xff1a;通过PhotoView将pdf读取为图片流进行展示。 一、首先&#xff0c;获取对本地文件读取的权限 在AndrooidManifest.xml中声明权限&#xff0c;以及页…

案例-登录认证(上)

案例-登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登 录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录 认证。 最终我…

Educational Codeforces Round 170 (Rated for Div. 2)(A~E题解)

本场也算是对我努力的一个reward吧&#xff0c;也是非常nice啊&#xff0c;话不多说&#xff0c;先写题解&#xff0c;写完直接休息 A. Two Screens 思路&#xff1a;我们先去想其最多需要多少次&#xff0c;也就是两个串长度之和&#xff0c;然后在哪里有优化呢&#xff1f;就…