java 中==和equals的区别
来源:互联网 发布:开发即时通讯软件 编辑:程序博客网 时间:2024/06/06 01:00
本文来自对网上资源的总结归纳
首先介绍JVM的内存机制:堆和栈的区别
堆:(对象)
引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。
堆内存主要作用是存放运行时创建(new)的对象。
(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)
当我们在程序中创建一个对象时,这个对象会被保存到运行时数据区中,以便反复利用(复用,因为创建对象的成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可能被另外一个引用变量所引用(在方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量去引用它时,系统的垃圾回收器(GC)才会在合适的时候回收它。
栈:(基本数据类型变量、对象的引用变量)
基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。
栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先出"模式来实现的。
(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法定义的变量将会放到这块栈内存里,随着方法的结束,这个方法的内存栈也将自动销毁。(不需要GC回收)
因此,所有在方法中定义的局部变量放在栈内存中;
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理inta = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
为什么说栈的速度快,堆的速度慢?
栈中的数据占内存大小在编译时是确定的,比如一个int类型就占4B,所以变量地址好计算,所以分配和销毁和访问速度都比较快.
堆中的数据占内存大小一般在编译时是不确定的,在运行时才能知道大小,所以其地址只有在运行时计算,而且运行时可能占内存大小还有变动,所以对这样的数据的分配,销毁和访问都非常不方便,速度也慢一些.
栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的速度快
cpu有专门的寄存器(esp,ebp)来操作栈,堆都是使用间接寻址的。栈快点。
==和equals的区别:
首先,equals()是个方法,在祖先类Object中已经实现,源代码如下:
[java] view plain copy public boolean equals(Object obj) { urn (this == obj); }
从Object类中equals的实现可以看出,原始的equals方法跟==是等价的。
先对Java中的各种数据类型进行一一说明。
String类里的equals方法已经被重写,只要内容相同,返回就为true(具体请参见其源代码)
- Java中==和equals的区别,equals和hashCode的区别
- Java中==和equals的区别,equals和hashCode的区别
- Java 中==和 equals 的区别, equals 和 hashCode 的区别
- Java中==和equals的区别,equals和hashCode的区别
- Java语法----Java中equals和==的区别
- Java语法----Java中equals和==的区别
- Java语法----Java中equals和==的区别
- Java语法----Java中equals和==的区别
- Java 中 equals 和 == 的区别和联系
- Java中==和equals的区别和联系
- java中字符串的equals和==的区别
- java中 ==和 equals区别
- java中"==" 和 equals区别
- Java中equals和==区别
- Java 中equals和==区别
- java中==和equals区别
- Java中equals和== 区别
- Java中"=="和"equals"区别
- java8之----Optional取代null
- phpQuery的用法
- 在VC++中读写INI文件
- 彻底搞懂Java内存泄露
- 怎么看懂和编写makefile
- java 中==和equals的区别
- alljoyn 框架
- hibernate_day02_02_实体类编写规则和03_hibernate主键生成策略
- 应用服务器性能优化 之 消息队列(MQ:Message Queue)
- canvas绘图基础(二)
- C++中结构体与类的区别(struct与class的区别)
- xml的一些知识点
- python3环境的scrapy环境的安装
- iOS 使用通知的正确“姿势”