数据储存中堆、栈、静态区简析

之前和Jacky的交流收获很多,在这里对其中数据储存的问题做一个小结,Let's go.

创建对象是我们每天都会用到的,就像这个:

Employee emp=new Employee();

Employee中有两个私有属性id和name,加上Setters/Getters方法即可。

创建成功后我们就在内存中需要分配一个空间去储存,那么问题来了,上边这个式子中的每一部分究竟是储存在哪里呢,我用一张图来解释:

等式左边的emp被储存到了栈区,等式右边的new Employee()会在堆区开辟空间储存,而emp事实上只是一个地址符,它会指向堆区中真正对象的位置,对象中所包含的所有属性也都储存在堆区,说到这里,到底堆和栈通常都储存什么类型的数据呢?

其实,栈中存放是基本类型与引用类型,堆中存放的是对象类型与数组(当然数组也是对象类型)。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

提到堆和栈就不得不再说说静态区,通常情况下,我们在需要全局变量的时候会用到static,还是之前的例子,在Employee的model中加这样一段代码:

public int count=0;

public Employee(){

count++;  }

然后在测试类中创建两次对象:

Employee emp1=new Employee();

System.out.println(emp1.count);

Employee emp2=new Employee();

System.out.println(emp2.count);

不难看出,打印的结果一定是两次1,但是如果用static修饰count,结果将变成1和2,那么用static修饰的全局变量究竟是储存在哪里呢,这样就出现了第三个储存区static静态区:

最后补充下static的三种用法:

1.static{  }直接在{ }中写入代码片段,会使在加载类时优先加载其中代码

2.static variate修饰变量,使变量作为全局变量

3.static method修饰方法,预加载方法,使用方法时无需创建对象

再说两句题外话,有经验的it工程师给出了一个方向:

A.Architect

B.Business

C.Coding

D.Design

E.English

每个人都有自己的理解吧,我也不再赘述了,攻城狮和程序猿也许就是方向不同呢,下功夫总会有收获的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,422评论 11 349
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,282评论 30 472
  • Java byte code 的学习意义 为啥要学java bytecode,这就跟你问我已经会python了为...
    shanggl阅读 1,748评论 0 3
  • 2016年10月22号7点11分,我躺在床上不想起,因为外面秋风呼啸,秋雨缠绵,阵阵凉意袭来,感觉被窝是个好安...
    寒山雨雾阅读 136评论 0 2