详细的String源码解析

本文探讨了为何在HashMap中通常使用String作为key的原因,源于其不可变性。通过分析源码,解释了String的final特性及value数组的私有化确保了其不变性。此外,文章讨论了编码问题,如ISO-8859-1与UTF-8的区别,并介绍了substring、equals方法、equalsIgnoreCase方法以及replace方法的基本使用和源码实现。
摘要由CSDN通过智能技术生成
我们常常把String类型的字符串作为HashMap的key,为什么要这样做呢?

因为String是不可变的,一旦初始化就不再改变了,如果被修改将会是一个新对象。


 @Test
    public void testString() {
   
        String s = "Java";
        logger.info(s);
        System.out.println(s.hashCode());
        s = "code";
        logger.info(s);
        System.out.println(s.hashCode());
    }
    //输出结果:
    /* 15:12:22.453[main] INFO base.AnalString -Java
    2301506
        15:12:42.794[main] INFO base.AnalString -code
    3059181*/

从输出结果来看是s的值已经被改变了,但是在debug的过程中我们可以发现,s的引用指向一个新的String这个String就是“code”.

在这里插入图片描述
在这里插入图片描述

这时我们从源码中一探究竟。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
   
    /** The value is used for character storage. */
    private final char value[];

  • String被final修饰,说明String类绝不可能被继承,也就说任何对String的操作方法,都不会被继承重写。
  • String中保存的数据是一个被final修饰的字符数组value。也就是说value一旦被赋值成功后,内存地址是无法改变的。并且这个字符数组的访问权限是private,外部绝对访问不到,String也没有开放出对value进行赋值的方法,所以说value一旦产生,内存地址根本无法修改。

因为String具有不可变性,所以String的大多数操作方法,都会返回新的String。

编码问题

来写一个demo

@Test
   public void testEncoding() throws UnsupportedEncodingException {
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值