Java面试一

案例如下:

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);// false
		System.out.println(s == s2);// false
		System.out.println(s1 == s2);// false
		// 对象的比较,是比较内存地址的,他们三个地址不同,都是输出false
		// intern:
		// 调用该方法,JAVA虚拟机首先检查字符串池中是否已经存在与该对象相等的对象存在,
		// 如果有则返回字符串池中对象的引用;如果没有,则先在字符串池中创建一个相同值的String对象,然后返回他的引用。
		// 可以理解成比较他们的值是否相等
		System.out.println("s == s.intern()" + (s == s.intern())); // false,执行intern才会创建s
		System.out.println(s1 == s1.intern());// true
		System.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);// false
		String hel_lo = ((hel + lo).intern());
		System.out.println("hello == hello.intern() " + (hello == hello.intern()));// true
		System.out.println(hello == hel_lo);// true
		System.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),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值