String类型,==,equal

对于基本数据类型而言:

int a = 10;

int b = 10;

a==b 返回true.

对于引用类型而言:

String c = new String("10");

String d = new String("10");

c == d 返回false     c.equals(d)返回true

对于两个对象而言,==比较两个引用的地址是否相同。两个对象的hashCode相同,equal方法返回true.

基本类型是存储在内存中的堆栈(以后简称栈),

而引用类型的变量在栈中仅仅是存储它的内存位置的地址记录,而其本身则存储在堆中。

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。

String str=new String("abc");

我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。

String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;

=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;

现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?

我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,然后将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。

这种方式是String特有的,并且它与new的方式存在很大区别。

String str="abc";

毫无疑问,这行代码创建了一个String对象。

String a="abc";  String b="abc";   那这里呢?

答案还是一个。

String a="ab"+"cd";   再看看这里呢?

答案是三个。

说到这里,我们就需要引入对字符串池相关知识的回顾了。

在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。

我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。

只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中。对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,对此我们不再赘述。因此我们提倡大家用引号包含文本的方式来创建String对象以提高效率,实际上这也是我们在编程中常采用的。

栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。

堆(heap):用于存储对象

时间: 2025-01-07 13:02:28

String类型,==,equal的相关文章

关于String类型常亮进行“==” 和equal()比较的不同

参考地址:http://blog.csdn.net/jijijiujiu123/article/details/18631647 equal()比较的是""里面的内容 如果碰见string类型并且没有new一个对象,就用equal()去比较两个值是否相等: 如果碰见String s = "";  并且没有s = s1+s2;这种形式 那么就用==去比较: 如果碰见String s="";   并且还有s = s1+s2;这种形式,那就用equal

C#string类型总结

个人笔记分享,知识点以及小练习 字符串的特性:不可变性,每对字符串做拼接或者重新赋值之类的操作,都会在内存中产生一个新的实例. 所以说,在.Net平台下,如果你对一个字符串进行大量的拼接赋值等操作,会产生大量的垃圾. ---->我们可以将字符串看做是char类型的只读数组. --->当我们以索引的方式去访问某一个字符串的时候,获得是char类型 空和null有什么区别,空在内存上开空间了,null没有 字符串的常用函数 1.ToCharArray():将一个字符串转换成一个char类型的数组.

第六章 String类型

1 构造String类型 string str1=new string('c',3); //str1="ccc" char[] chs=new char[]{'c','a','t','o','o','n'}; string str2=new string(chs);//str2="catoon"; string str3=new string(chs,0,3);//str3="cat"; 2 String类的字段.属性和索引函数 --String

【C++ Primer每日刷】之三 标准库 string 类型

标准库 string 类型 string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与其他的标准库类型一样,用户程序要使用 string 类型对象,必须包含相关头文件.如果提供了合适的 using 声明,那么编写出来的程序将会变得简短些: #include <string> using std::string; 1.1 string 对象的定义和初始化 string 标准库支持几个

C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

 标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更基本的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:因为其中反映了更复杂的概念: 2.抽象:因为我们在使用时不需要关心他们是如何表示的,我们只需要知道这些抽象数据类型支持哪些操作就可以了. 正文: 一.命名空间的using声明 1. using std::cin; ::运算符的作用含义是右操作数的名字可以在左操作数的作用域中找到. 格式: [cpp]

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

string 类型的输入操作符 cin 和 getline 函数分别如何处理空白字符?

string用来读取一个word : string 类型的输入操作符 cin 对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中). getline 函数用来读取整行文本,接受两个参数:一个输入流对象和一个 string 对象,例如 getline(cin,line): getline 函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在

计算两个日期之间相差几天(Date类型与String类型互相转换)

一:计算两个日期之间相差几天 1 /** 2 * 3 */ 4 package com.hlcui.date; 5 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.Calendar; 9 import java.util.Date; 10 11 import org.junit.Test; 12 13 /** 14 * @author Administrator

关于SpringMVC中如何把查询数据全转成String类型

之前,本想与客户商量做几张固定的报表予使用,结果发现客户每个月都需要各种各样的报表,所以我们做了个窗口用于直接执行SQL语句:数据量一开始并不是很大查询出来的数据较少(约1-6W左右),所以刚开始几个月很好用,查询出来的数据直接从页面复制下来贴到Excel做月报表,就这样一年过去了,最近做三期,发现运维人员月底几天特别的忙,数据逾百万(汗),SQL查询语句都要写n多分页.... 伙伴们如此幸苦,还是我来拯救他们吧- 我的解决思路大致如下: A>界面增加查询倒出Excel表按钮(不需要分页,也不需