在Java中,对象作为函数参数的传递方式是值传递还是引用传递?String str = "abc" 与 String str = new String("abc")在存储上有何区别?想成为一名合格的搬砖工,掌握吧,颤抖吧!
堆(heap)和栈(stack)
在数据结构中存在堆和栈,在内存分配中也有堆和栈的概念,指的是堆空间和栈空间,注意不要将两者混为一谈,这里要讨论的是后者。
在数据结构中,堆和栈是两种不同的数据结构。栈是一种后进先出的线性表,堆是一种特殊的完全二叉树,树中所有非终端结点的值均不大于(或不小于)其左右孩子结点的值。
在内存分配中,栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。在C++中,程序员可以通过malloc函数申请堆空间,但在Java中,程序员不能直接地操作堆与栈,只能由Java自动管理。
栈的优势:① 存取速度比堆要快,仅次于直接位于CPU中的寄存器;② 栈数据可以共享。存在栈中的数据大小与生存期必须是确定的,缺乏一定灵活性。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
一个经典的关于堆和栈的比喻:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
Java两种数据类型与存储
Java有两种数据类型:① 一种是基本数据类型,共8种,即int、short、long、byte、float、double、boolean、char(注意不包含string数据类型);② 另一种是对象数据类型,是类类型或应用数据类型,如Integer、String、Double等。