Java面试一

来源:互联网 发布:聚宝盆软件安卓版 编辑:程序博客网 时间:2024/05/22 15:28

案例如下:

public class StringTest {public static void main(String[] args) {String s = new String("abc");// 问题1:当类中执行String s = new String("abc");这行代码后,在内存里生成几个对象?他们是什么?在什么地方?// (生成2个对象;首先去String// Pool查找有没“abc”对象,没有的话,就在池里面放入abc,接着是new一个对象,是在堆里面生成另一个对象;// s是引用,指向堆里面的对象;)String s1 = "abc";// 问题2:当执行String s1 = "abc";这行代码后,在内存里生成几个对象?他们是什么?在什么地方?// 答:一个对象也没生成;s1引用string pool里面的abc。String s2 = new String("abc");// 问题3:当类中执行String s2 = new String("abc");这行代码后,在内存里生成几个对象?他们是什么?在什么地方?// 答:生成一个对象,首先是在String Pool查找,发现有“abc”,就不生成,接着在堆里面生成一个对象;s2指向堆里的“abc”// 执行完前三行语句,内存一个有三个对象,一个池里面的,两个堆里面的;System.out.println(s == s1);// falseSystem.out.println(s == s2);// falseSystem.out.println(s1 == s2);// false// 对象的比较,是比较内存地址的,他们三个地址不同,都是输出false// intern:// 调用该方法,JAVA虚拟机首先检查字符串池中是否已经存在与该对象相等的对象存在,// 如果有则返回字符串池中对象的引用;如果没有,则先在字符串池中创建一个相同值的String对象,然后返回他的引用。// 可以理解成比较他们的值是否相等System.out.println("s == s.intern()" + (s == s.intern())); // false,执行intern才会创建sSystem.out.println(s1 == s1.intern());// trueSystem.out.println(s == s2.intern());// true// intern如果pool存在,则指向它;String hello = "hello";String hel = "hel";String lo = "lo";System.out.println(hello == "hel" + "lo");// true,两个都是在池里面System.out.println(hello == "hel" + lo);// false,左边是在池里面,右边是在堆里面,当两个都不是字面值(引号里面、常量值)相加会生成新的对象System.out.println(hello == "hel" + lo);// falseString hel_lo = ((hel + lo).intern());System.out.println("hello == hello.intern() " + (hello == hello.intern()));// trueSystem.out.println(hello == hel_lo);// trueSystem.out.println(hello == (hel + lo));// false}}


堆与栈的区别

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

 

CPU:寄存器

内存:主存储器、ROM、RAM、高速缓存缓存器

JAVA数据存储:寄存器、堆(new对象、垃圾回收等、Java堆可以处于物理上不连续的内存空间)、栈(RAM)、静态存储区域与常量存储区域(静态数据变量、常量)、非RAM(持久化的对象Serializable、对象转化为字符流发送到其他位置)

 

栈:Java虚拟机栈(OutOfMemoryError)(描述的是JAVA方法执行的内存模式,每个方法执行都会创建一个栈帧用于存储局部变量表(存储基本类型和对象引用)、操作栈、动态链接、方法出口)、本地方法栈(native)(StackOverflowError、OutOfMemoryError)

方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

 

Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池

(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池

 

 

原创粉丝点击