Java中数据存储在哪?以及equals和==的区别
2016-03-08 12:25
330 查看
最近在看java编程思想,疯狂补java基础,下面写下自己看书之后的一些细小的知识点的总结。
java中,经常会使用到一些变量,不管是基本数据类型还是引用数据类型,但是我们又会有问题,那么这些变量到底存储在哪里呢?
对于基本数据类型,不论是局部变量还是成员变量都是存储在栈中,
在java编程思想中也有提到,对于基本数据类型,会直接将变量存储在栈中。同时我们也可以通过上面的代码来得出结论。
这里我们首先知道方法中的a变量是存储在栈中,若是成员变量c存储在堆中的话,那么地址也就不一样,会输出false,但是却输出true,说明也是存储在栈中的,同时由于共享性的关系,使得两个变量指向同一个地址。
对于引用数据类型。
深入Java虚拟机中有说:new出来的对象全是存储在堆中。
这里String字符串比较特殊:存储在常量池中,当字符串值相等的时候,这个时候他们实际上也是同一个对象。
比如:
因此,第一种,“1234” 都是指向同一个地址,所以是同一个对象,而第二种,因为通过new了一个新对象,因此不是指向同一个地址,所以,不是同一个对象。
注意:==无论如何都是比较地址,而equals原本也是比较地址,但是通过重写这个方法,可以比较值,很多类都重写了这个方法,比如String。
java中,经常会使用到一些变量,不管是基本数据类型还是引用数据类型,但是我们又会有问题,那么这些变量到底存储在哪里呢?
对于基本数据类型,不论是局部变量还是成员变量都是存储在栈中,
public class Test { int c =100000; public static void main(String[] args) { // TODO Auto-generated method stub int a = 100000; Test t = new Test(); if(a==t.c){ System.out.println("true"); }else{ System.out.println("false"); } } } 输出的是true
在java编程思想中也有提到,对于基本数据类型,会直接将变量存储在栈中。同时我们也可以通过上面的代码来得出结论。
这里我们首先知道方法中的a变量是存储在栈中,若是成员变量c存储在堆中的话,那么地址也就不一样,会输出false,但是却输出true,说明也是存储在栈中的,同时由于共享性的关系,使得两个变量指向同一个地址。
对于引用数据类型。
深入Java虚拟机中有说:new出来的对象全是存储在堆中。
这里String字符串比较特殊:存储在常量池中,当字符串值相等的时候,这个时候他们实际上也是同一个对象。
比如:
public class MtTest { public static void main(String[] args) { String a = "1234"; // String b = new String("1234"); String b= "1234"; if(a==b){ System.out.println("同一个对象"); }else{ System.out.println("不是同一个对象"); } } } 输出结果是同一个对象
public class MtTest { public static void main(String[] args) { String a = “1234”; String b = new String(“1234”); // String b= “1234”; if(a==b){ System.out.println(“同一个对象”); }else{ System.out.println(“不是同一个对象”); } } } 输出的不是同一个对象
因此,第一种,“1234” 都是指向同一个地址,所以是同一个对象,而第二种,因为通过new了一个新对象,因此不是指向同一个地址,所以,不是同一个对象。
注意:==无论如何都是比较地址,而equals原本也是比较地址,但是通过重写这个方法,可以比较值,很多类都重写了这个方法,比如String。
相关文章推荐
- java.lang.IndexOutOfBondsException:setSpan(3..3) ends beyond length 2
- 转载 java_web开发入门
- Canal+Otter - Canal篇(1)
- Java并发编程(十六):线程间协作的两种方式:wait、notify、notifyAll和Condition(转载)
- Java并发编程(十五):Timer和TimerTask(转载)
- Java核心技术学习笔记之五——Java集合
- java类加载 运行机制
- Java并发编程(十四):Callable、Future和FutureTask(转载)
- Java并发编程(十三):CountDownLatch、CyclicBarrier和Semaphore(转载)
- java反射机制
- Java并发编程(十二):线程池的使用(转载)
- 关于MyEclipse破解时找不到Common的解决方法
- Java并发编程(十一):阻塞队列(转载)
- Java中的Exception和RuntimeException的区别
- Java中避免NullPointerException的一些方法
- Spring 整合Quartz两种方式比较(JobDetailBean和MethodInvokingJobDetailFactoryBean方式)
- Java并发编程(十):并发容器之CopyOnWriteArrayList(转载)
- Java开发中的23种设计模式详解
- Eclipse如何打包jar包
- Java并发编程(九):并发容器之ConcurrentHashMap(转载)