java基础复习2之字符串

由于是复习的方式来过一遍字符串。这里不会详细的介绍String类型。只是大概聊一聊,我认为比较重要的知识点。至于详细的用法,我推荐去书上看一看,配合着代码敲敲,至于书籍(《java核心卷1》)的链接,我以及在我的java基础复习1有百度网盘的。需要的同学自行去获取。

一,String是不可变的

相信很多人都知道String是不可变的,但是对原因不了解。那么为什么这么说呢。首先看一段代码

    private final char value[];

可以看出String的对象一旦定义由于final修饰,它所指向的char数组就已经不可变了。不过这并不能完全说明他是不可变的,因为对于final修饰的数组其实我们是可以修改数组内部的值的。所以原因是什么呢?其实原因挺简单的,因为对于String对象,是没有办法通过方法去改变的。也就是没有setvalue()之类的方法的。所以基本上可以说String是不可变的。

String a="111";
a="222";

这样可不是改变String对象,而是重新new一个新的String对象。

二,关于Stirng的equals()

个人认为还是挺重要的。直接贴上源码吧

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                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;
    }

源码还是很简单的,大家阅读即可,我也不做多的描述,不过这里对于String对象的“==”和equals()的比较方式希望大家还是要了解区分一下的。= =比较的一般的是值,对于引用类型比较的是地址

String a="111";
String b="111";
String c= new String("111");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(b));
System.out.println(a.equals(c));

大家可以试一试,自己思考一下原因。结果是T,F,T,T。

三,关于StringBuilder和StringBuffer

前面说了Stirng的类是不可变的,意味着对于不同的字符串其实都是要占用不同的空间的。那么我们如果处理一些问题时,需要不断的对字符串操作,那么对内存将会是很大的浪费,而且很耗时间。那么就可以使用StrngBuilder类StringBuffer类来代替。
特别是做算法题的同学们,特别要注意。关于这两个类的具体操作不赘述。
注:StringBuilder是线程不安全的,而StringBuffer是线程安全的
不过在处理单线程问题,StringBuilder速度会更快。

四,关于String的内存问题

其实对于喜欢思考的同学应该会发现一个问题,对于同样的“111”为什么有的==是true,和有的结果是false。
其实这涉及到字符串常量池和String对象之间的关系。
简单说,就是利用=声明的String对象其实地址是直接指向字符串常量池的。而new出来的对象则是在堆中开辟了一个新的空间,然后在这个空间再指向字符串常量中的实例。因而利用= =比较是会出现false的结果,原因就是地址不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值