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常见问题的主要内容,如果未能解决你的问题,请参考以下文章
Failed to convert property value of type ‘java.lang.String‘ to required type ‘int‘ for property(代码片段