java面试题一

本文转自:http://blog.youkuaiyun.com/dengshengjin2234/article/details/8471907

案例如下:

[java]  view plain copy
  1. public class StringTest {  
  2.     public static void main(String[] args) {  
  3.         String s = new String("abc");  
  4.         // 问题1:当类中执行String s = new String("abc");这行代码后,在内存里生成几个对象?他们是什么?在什么地方?  
  5.         // (生成2个对象;首先去String  
  6.         // Pool查找有没“abc”对象,没有的话,就在池里面放入abc,接着是new一个对象,是在堆里面生成另一个对象;  
  7.         // s是引用,指向堆里面的对象;)  
  8.         String s1 = "abc";  
  9.         // 问题2:当执行String s1 = "abc";这行代码后,在内存里生成几个对象?他们是什么?在什么地方?  
  10.         // 答:一个对象也没生成;s1引用string pool里面的abc。  
  11.         String s2 = new String("abc");  
  12.         // 问题3:当类中执行String s2 = new String("abc");这行代码后,在内存里生成几个对象?他们是什么?在什么地方?  
  13.         // 答:生成一个对象,首先是在String Pool查找,发现有“abc”,就不生成,接着在堆里面生成一个对象;s2指向堆里的“abc”  
  14.         // 执行完前三行语句,内存一个有三个对象,一个池里面的,两个堆里面的;  
  15.         System.out.println(s == s1);// false  
  16.         System.out.println(s == s2);// false  
  17.         System.out.println(s1 == s2);// false  
  18.         // 对象的比较,是比较内存地址的,他们三个地址不同,都是输出false  
  19.         // intern:  
  20.         // 调用该方法,JAVA虚拟机首先检查字符串池中是否已经存在与该对象相等的对象存在,  
  21.         // 如果有则返回字符串池中对象的引用;如果没有,则先在字符串池中创建一个相同值的String对象,然后返回他的引用。  
  22.         // 可以理解成比较他们的值是否相等  
  23.         System.out.println("s == s.intern()" + (s == s.intern())); // false,执行intern才会创建s  
  24.         System.out.println(s1 == s1.intern());// true  
  25.         System.out.println(s == s2.intern());// true  
  26.         // intern如果pool存在,则指向它;  
  27.         String hello = "hello";  
  28.         String hel = "hel";  
  29.         String lo = "lo";  
  30.         System.out.println(hello == "hel" + "lo");// true,两个都是在池里面  
  31.         System.out.println(hello == "hel" + lo);// false,左边是在池里面,右边是在堆里面,当两个都不是字面值(引号里面、常量值)相加会生成新的对象  
  32.         System.out.println(hello == "hel" + lo);// false  
  33.         String hel_lo = ((hel + lo).intern());  
  34.         System.out.println("hello == hello.intern() " + (hello == hello.intern()));// true  
  35.         System.out.println(hello == hel_lo);// true  
  36.         System.out.println(hello == (hel + lo));// false  
  37.     }  
  38. }  


堆与栈的区别

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

 

CPU:寄存器

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

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

 

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

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

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值