数据存储类型
存储器类型
存储区域
内存
RAM、ROM
外存
硬盘
RAM:random access memory,随机存储器;可读可写;不存储;运行内存
ROM:read only memory,只读存储器;只可读;存储
数据存储区域
存储区名称
存储数据类型
存储区域
功能特性
寄存器
处理器内部
最快存储区
栈
对象引用、基本数据类型值
通用RAM
堆栈指针向下移动,分配新内存;指针向上移动,释放旧内存;数学计算在内存栈进行
堆
所有Java对象、new创建新对象、构造器创建对象
通用内存池(位于RAM区)
自动分配内存,无序
常量存储(常量池、静态区)
程序中的字面量(Java变量、常量值)
程序代码内部、ROM区
不可变
非RAM存储
流对象、持久化对象等
磁盘、硬盘、数据库等
独立存在
常量池中包含:
1.代码中所定义的各种基本数据类型
2.对象型(String和数组)的常量值
3.以文本形式出现的符号引用:方法、字段、类和接口的名称和描述符
名称
常量池
实现类
Byte、Short、Integer、Long、Character、Boolean、String
未实现类
Float、Double
存储范围
-128~127 (超出部分存入Heap堆)
实战1:==与equals
数据类型
==
equals
基本数据类型
比较数值
--
包装类 、String类
比较地址
比较内容(重写equals方法)
注意:Integer类、String类对equals方法重写,但父类Object类未重写equals方法,故其他子类equals方法比较的也是“引用”地址。
类型1:a与b(Integer类、Double类)
类型
a
b
==
equals
解析
1
int a=89;
Integer b=89;
true
--
--
2
int a=129
Integer b=129;
true
--
--
3
int a=89;
Integer b=new Integer(89);
true
--
--
4
int a=129;
Integer b=new Integer(129);
true
--
--
5
Integer a=89;
Integer b=89;
true
true
-128~127
6
Integer a=129;
Integer b=129;
false
true
-128~127
7
Integer a=89;
Integer b=new Integer(89);
false
true
new
8
Integer a=129;
Integer b=new Integer(129);
false
true
new
9
double a=129.1
double b=129.1;
true
--
--
10
Double a=129.1
Double b=129.1;
false
true
Double不支持常量池
类型2:a+b与c(Integer类)
类型
a
b
c
a+b==c
equals
1
Integer a=129;
Integer b=0;
Integer c=129;
true
true
2
Integer a=new Integer(129);
Integer b=0;
Integer c=new Integer(129);
true
true
解析 :Integer对象无法与数值进行直接比较,所以Integer对象首先进行拆箱后进行数值计算。(参考资料:技术小黑屋-Java中的自动装箱与拆箱 )
类型3:a+b与c(String类)
类型
操作
==
值
1
String a="hello";String b="world";String c="helloworld";
a+b==c
false
2
String a="hello";String b="world";String c="helloworld";
a+"world"==c
false
3
String a="hello"+"world";String c="helloworld";
a==c
true
4
final String a="hello";final String b="world";String c="helloworld";
a+b==c
true
5
final String a="hello";final String b="world";String c="helloworld";
a+"world"==c
true
解析 :String类的intern()方法检测常量池中是否存在字符串,若存在返回引用,若不存在,则创建并返回引用。(同类参考:梦工厂-Java常量池理解与总结 )
实战2:重写equals()方法和hashCode()方法
public class Main {
private int num;
private String name;
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;`
}
if (getClass() != obj.getClass()) {
return false;
}
Main main = (Main) obj;
if (name == null) {
if (main.name != null) {
return false;
}
} else if (!name.equals(main.name)) {
return false;
}
return true;
}
@Override
public int hashCode(){
final int prime=31;
int hash=1;
hash=prime*hash+num;
hash=prime*hash+((name==null)?0:name.hashCode());
return hash;
}
}
最后编辑于 :2018.03.18 00:36:00
©著作权归作者所有,转载或内容合作请联系作者 【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。 平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。