当前位置: 首页 > news >正文

二、字符串 String

二、字符串 String

String 不是基本数据类型,是一个用final 修饰的最最最最最最常用的引用数据类型!

小拓展:String 为什么可以直接赋值为一个字符串?

1、存储结构

底层就是一个 char数组

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** 该值用于字符存储. */
    private final char value[];

    /** 缓存字符串的哈希码 */
    private int hash; // 默认为0
}

2、4个重要(必须知道)构造

就 JDK 1.8 而言,String 有 16 个构造方法(其中有 2 个是废弃的)

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    /* 以 String 为参数 */
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

    /* 以 char[] 为参数 */
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

    /* 以 StringBuffer 为参数 */
    public String(StringBuffer buffer) {
        synchronized(buffer) {
            this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
        }
    }
   
    /* 以 StringBuilder 为参数 */
    public String(StringBuilder builder) {
        this.value = Arrays.copyOf(builder.getValue(), builder.length());
    }
}

3、String.equals

String.equals 重写了 Object.equals

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    public boolean equals(Object anObject) {
        // 对象引用相同直接返回true
        if (this == anObject) {
            return true;
        }
        
        // 必须是String类型才有比较的必要
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                // 把两个字符串转成char[]逐一比对
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
}

4、常用方法

  1. indexOf():返回第一次出现的位置,没有返回-1
  2. lastIndexOf():返回最后一次出现的位置,没有返回-1
  3. contains():判断包含
  4. toUpperCase():转至大写
  5. toLowerCase():转至小写
  6. length():返回字符串你长度
  7. trim():去掉首尾空格
  8. .replace():替换
  9. split():拆分数组
  10. join():字符串数组转字符串
  11. endsWith():判断结尾包含
  12. startsWith():判断起始包含
  13. equalsIgnoreCase():忽略大小写比较
  14. isEmpty():判空
  15. .substring():截取

5、为何 final 修饰

对于这样设计的好处,Java语言之父 James Gosling的回答是:

他会更倾向于使用final;因为它能够缓存结果,当你在传参时不需要考虑谁会修改它的值

如果是可变类的话,则有可能需要重新拷贝出来一个新值进行传参,这样在性能上就会有一定的损失

迫使 String类设计成不可变的另一个原因是安全

  1. 安全
  2. 高效

6、String、StringBuilder、StringBuffer

StringBuffer 、StringBuilder 都是操作自身的 char[] 来实现字符串的操作;String每次修改都是赋值一个全新的字符串,之前的字符串依然存在,但是很快会被当成垃圾回收掉。

StringBuffer 使用 synchronized 来保证线程安全

String 常用两种创建方式:

/**
 * s1先去字符串常量池查看是否有 "aaa" 字符串,如果有直接返回常量句柄;
 * 如果没有此字符串,先在字符串常量池中创建这个字符串,然后再返回常量句柄
 */
String s1 = “aaa”;

/**
 * s2直接在堆上开辟一个空间,存放 "aaa",只有调用了intern()方法才会把这个
 * 字符串存到字符串常量池
 */
String s2 = new String(“aaa”);

// 验证
System.out.println(s1 == s2); // false
String s3 = s2.intern();
System.out.println(s1 == s3); // true

相关文章:

  • Python数据类型转换
  • Protobuf 和JSON 性能分析
  • DCA培训心得笔记(二)
  • TB-RK1808M0最新固件烧录和驱动更新
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • C语言被创造出来的基础是什么?它的主要结构是什么?
  • error: Unexpected console statement (no-console) 解决办法
  • 神经系统分类和组成图表,神经系统的组成概念图
  • [Swift学习] 访问控制 Access Control, private、public、filePrivate等修饰符
  • [SQL]数据库语言学习
  • 软考高频考点——项目中标了以后该怎么做?
  • 基于注意力机制的LSTM液体管道非稳态工况检测
  • Oracle VM VirtualBox安装CentOS 7系统
  • windows hello人脸识别设置没反应的解决办法
  • 企业级容器云PaaS解决方案【厚PaaS+轻应用+微服务】---(2)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • cookie和session
  • CSS实用技巧
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES学习笔记(12)--Symbol
  • extjs4学习之配置
  • Flex布局到底解决了什么问题
  • JavaScript函数式编程(一)
  • Linux中的硬链接与软链接
  • log4j2输出到kafka
  • nginx 配置多 域名 + 多 https
  • uni-app项目数字滚动
  • vuex 学习笔记 01
  • Vue学习第二天
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从setTimeout-setInterval看JS线程
  • 给Prometheus造假数据的方法
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 技术发展面试
  • 解决iview多表头动态更改列元素发生的错误
  • 利用jquery编写加法运算验证码
  • 如何用vue打造一个移动端音乐播放器
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 算法-图和图算法
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 线上 python http server profile 实践
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 怎样选择前端框架
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #if #elif #endif
  • #mysql 8.0 踩坑日记
  • $L^p$ 调和函数恒为零
  • (1)Nginx简介和安装教程
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (编译到47%失败)to be deleted