Java String == equals
来源:互联网 发布:linux iic架构 编辑:程序博客网 时间:2024/06/15 16:08
一直对 euals 和 == 有点犯浑 查了一些资料 总结一下:
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类) ()
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(堆中存储的地址是否相同,即栈中的内容是否相同),所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
3、JVM中的堆和栈(堆中的字符串常量)
a.JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
b.我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.
c.从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。
d.每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
d.堆中存放的是创建的对象,JAVA字符串对象内存实现时,在堆中开辟了一快很小的内存,叫字符串常量池,用来存放特定的字符串对象。
e.通俗来讲java堆栈
Java堆:
1.程序运行中动态分配内存大小
2.java的垃圾回收器自动回收不再使用的数据
Java栈:
1.栈数据可以共享
2.存在栈中的数据大小与生存期必须是确定的。
3.栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象引用。
4.String 类
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找字符串常量中有没有存放"abc",如果没有,则将"abc"存放进字符串常量中,并令str指 向”abc”,如果已经有”abc” 则直接令str指向“abc”。
5.JDK中 Sting
String下面,equals方法的源代码。
看源代码就会发现了。
首先做的是比较引用,引用的如果是同一个对象,直接返回true。
做完return就结束了。
如果引用不是同一个地址,就往下走,判断是否是String的一个实例。同样,不是的话直接返回。
是的话,拿字符串的长度做循环的控制变量,做循环。此处的value在源代码里面来看,应该就是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;
}
- Java String == equals
- java string == equals
- Java String equals和==
- java string equals 和 ==
- Java String 字符串 比较 == equals
- 【Java】String == 和equals()
- java 字符串String比较 equals ==
- Java String中的==和equals()
- Java里String 的equals和==
- java中的string equals 与 == 的比较
- java中的string equals 与 == 的比较
- java和c#中的String equals == 比较
- java中的string equals 与 == 的比较
- java基础 equals与==区别,String的hashcode
- java中的string equals 与 == 的比较
- Java里String 的equals和==
- java中的string equals 与 == 的比较
- java 通过源码看String的Equals与==
- Linux Shell scp 文件定时上传
- VS2010 MFC使用TeeChart绘图控件之一:控件和类的导入
- Android Volley完全解析(三),定制自己的Request
- mongodb安装
- 从百度贴吧转的给自己看(加上自己经验的修改)
- Java String == equals
- Android Selector 与 Shape 基本用法
- Sublime Text 3中写Python需要的一些设置
- 机试-初级题 字符的移位
- JS学习笔记-事件绑定
- 编译Android源码致命错误解决方案
- Android Volley完全解析(四),带你从源码的角度理解Volley
- linux之sed用法
- swing开发图形界面工具配置(可自由拖控件上去)