String常见问题

Posted Code_BinBin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String常见问题相关的知识,希望对你有一定的参考价值。

String的两种赋值方式及区别

字符串可能是任何程序语言中都会出现的对象,java中创建并初始化一个String对象,最常见的方式有两种:

  • String str=new String(“XXX”);
  • String str=“XXX”;

两者看似相同,其实差别很大

第一种:

  • 首先在String Pool 中查找 有没有“abc”这个字符串对象,如果有,则不在String
    Pool中创建“abc”这个对象了,直接在堆中创建一个“abc”字符串对象,然后将堆中的这个“abc”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“abc”字符串对象。
  • 如果没有,则首先在String Pool中创建一个“abc”对象,然后再在堆中创建一个“abc”对象,然后将堆中的这个“abc”对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个“abc”对象

例如:

public class Test02 {
    public static void main(String[] args) {
        String s=new String("abc");
        String ss="abc";
        System.out.println(ss==s);
    }
}

在这里插入图片描述

第二种:

  • 查找String Pool中是否存在“abc”这个对象,如果不存在,则在StringPool 中创建一个“abc”对象,然后将String Pool中的这个“abc”对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个“abc”字符串对象
  • 如果存在,则不创建任何对象,直接将String Pool中的这个“abc”对象地址返回来,赋给s引用

例如:

public class Test02 {
    public static void main(String[] args) {
        String s="abc";
        String ss="abc";
        System.out.println(ss==s);
    }
}

在这里插入图片描述

equals和==比较的区别

String使用"=="操作符的作用

  • 用于基本数据类型的比较
  • 判断引用是否指向堆内存的同一块地址。

String的equals方法
equals方法在Object类当中,而Object是所有类的父类

	public boolean equals(Object obj) {
	        return (this == obj);
	}

但是String对equals方法进行了重写。

/**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    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;
    }



equals的作用:

判断两个变量是否指向同一个对象,也就是判断堆里面的内容是否一样,返回值是布尔

equals的基本使用:

boolean b = obj1.equals(obj2);
String类型比较不同对象内容是否相同,应该用equals,因为==用于比较引用类型和比较基本数据类型时具有不同的功能。

String池:

String是不可改变的,为了进步效率Java引用了字符串池的概念,例如new String(“abc”);首先会在String池中创建一个对象“abc”由于有NEW的存在所以会分配地址空间,复制String池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。

String对象的理解

  • 如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。
  • 如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
  • Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
  • 使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个。

以上是关于String常见问题的主要内容,如果未能解决你的问题,请参考以下文章

CSP核心代码片段记录

Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段

以下代码片段的时间复杂度是多少?

这两个代码片段之间有区别吗?如果有,那又如何? [复制]

Sleep() 方法后的代码片段没有被执行

面试常用的代码片段