Java底层原理(一):栈(starck)和堆(heap)
平时上课老师都会分析代码底层原来,在栈与堆已经代码区等等如何实现,原理是如何的,但是稍微一直稍微有些模糊,今天翻到了一篇还可以的文章,分享顺便给自己回顾一下; 栈与堆都是用来存放数据,java自动管理两个区,程序员不能直接管理和设置栈区和堆区; 1.栈与堆的区别,栈的优势在于存取速度比较快,在栈区存放的数据需要有确定的生命周期以及数据大小,缺乏灵活性,数据可以共享;堆区存放数据可以动态的分配大小,生命周期可以不必告诉编译器,GC(垃圾回收)会自动处理掉无用的数据,数据灵活性高,但是速度慢。 2.在java中有两种数据类型,八大整形原始型(byte,short,int,long,float,double,boolean,char),这类类型声明时为自动变量,如int a = 4;long b = 100l;自动变量存放的是字面值,不是类的实例,不是类的引用,没有类的存在;如这里a指向的是int引用,指向3这个值(字面值存放在某个代码块中,随着代码块结束,他们的生命周期也跟着结束); 另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: ? 另一类为包装类数据(Integer,byte,String,Double),这些了全部存放于堆中,由GC处理;String是一个特殊的包装类数据。即可以用String str = new String("abc");的形式来创建,也可以用String str = "abc";的形式来创建(作为对比,在JDK 5.0之前,你从未见过Integer i = 3;的表达式,因为类与字面值是不能通用的,除了String。而在JDK 5.0中,这种表达式是可以的!因为编译器在后台进行Integer i = new Integer(3)的转换)。前者是规范的类的创建过程,即在Java中,一切都是对象,而对象是类的实例,全部通过new()的形式来创建。Java中的有些类,如DateFormat类,可以通过该类的getInstance()方法来返回一个新创建的类,似乎违反了此原则。其实不然。该类运用了单例模式来返回类的实例,只不过这个实例是在该类内部通过new()来创建的,而getInstance()向外部隐藏了此细节。那为什么在String str = "abc";中,并没有通过new()来创建实例,是不是违反了上述原则?其实没有。? 从结果言可以看出,String类被设计为不可改变类,当改变其值时,java会自动创建相应的对象,然后将值返回给引用的变量这个创建过程虽说是完全自动进行的,但它毕竟占用了更多的时间。在对时间要求比较敏感的环境中,会带有一定的不良影响。 ? 由此我们可以理解“==”与equals的区别,equals为比较两者指向的值是否相等,==则为两者引用指向的地址是否相等(即是否指向同一个地方); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |