新手求教JAVA中内存相关问题
各位前辈好,我是一个初学java的新手,最近学习内存部分内容遇到了如下问题,还望各位赐教。
1.是否所有基本类型数据都存储在栈上,那假如有这样一段语句 Point p1 = new Point(1, 1);
传给其构造函数的1,1是int型,为什么他们存储在堆里。
2.在程序编译的时候,开始时是否只编译我运行的这个,有主函数的这个类,而其他的类(例如Point类)是不是不会被编译,在具体运行到该语句的时候再编译该类?
3.一个对象被创建时,会有额外的堆的开支来存储与这个对象的相关信息(比如方法之类的?)。我在网上看别人的文章时,有看到过“相同类实例化的对象只开辟一块空间来存储这些信息,而不是每个对象被创建时都会有这些额外开支”(我不确定是不是这样说,难道是说 被编译时每个类都会有独立的开支,而对象被创建时又会有另外的独立开支?)
4.如果我创建一个函数,这个函数需要被不断、大量重用,那么我是否应该尽力使传到该函数的参数为值类型(最好是byte、boolean),传递对象比传递值类型(如int)更占用内存么? 因为我最近看视频才知道,传递一个对象的话,只是传递引用,那么不管传递多大的对象,传递的引用其大小不都是一样么,而且不用额外开辟储存空间存储这个引用,这样来说穿引用不是比传值类型更占优势?
5.程序在编译时,类里面的静态成员,常量就会被放到 静态、常量区,假如我在某个方法中有这样一段语句。Point p1 = new Point(1, 1); 而我写的Point类中也有自己的静态与常量成员,那这些静态成员、常量也是被分配到静态、常量区存储么?是在程序一开始编译的时候存储,还是在创建第一个该对象时临时加进去?
6.对于ArrayList,它好像是顺序表,是否意味着它在堆上的存储是连续的?那当它自己初始化的容量不足,需要扩容时,他需要重新在堆开辟空间存储新元素,那么是否有可能ArrayList在堆上就不连续了,而是一块一块的分布,那这样不就与顺序表的概念相冲突了么?