序言
我是应届刚毕业菜鸟(其实好像也工作半年了),每日工作之余看几篇博客(可能是运气比较好吧,看了一些大神的),对自己之前和现在懒散迷茫的工作状态深恶痛疾,越舒适越懒啊。
今天就难受的开始写一点东西,就记录一下java的基础和平时遇到的问题,后续再扩展。
关于对象
java数据类型分为基本数据类型和引用数据类型。
基本数据类型有short,int,long,byte,boolean,float,double,char;对应占用字节数是2,4,8,1,?,4,8,2。他们存放在栈中,对应的包装类为引用数据类型。至于为什么有包装类了还要基本数据类型,我认为是这些类型需要频繁的创建和回收,放在栈中访问和回收快,效率高。
boolean占用字节数不确定,因为java虚拟机中没有boolean值的字节码指令,虽然定义了boolean类型,但在编译后使用int数据类型代替。但是boolean数组会被编码成byte数组,只占用1个字节。所以单个boolean占4个字节,数组占1个字节。
引用数据类型是那些通过new操作创建的对象。Person p = new Person()。new在堆中分配一块内存存放数据,()调用构造函数,p为栈中的一个引用,指向堆中该对象的内存地址。
引用传递和值传递
这个是我以前去笔试和面试经常会问到的问题。
当函数参数进行传递时,基本数据类型表现为值传递,而引用数据类型表现为引用传递。
值传递只会传递原有值的拷贝,并不会改变原来对象的值,而引用传递会传递引用的复制(即实际内存地址的拷贝),函数中如果进行修改,会修改实际对象的值,导致原有对象的变化。
其中String是一个坑,主要它是用final修饰的,值不可变。String虽然是引用传递,但是当函数中进行修改时,因为它不可变,会重新生成一个常量,并且把传递的引用指向该常量,而原有的引用还是指向原有的常量,导致它看起来是值传递。
对象的引用
java中存在四种引用:强引用,软引用,弱引用,虚引用。
强引用就是我们一般使用的,类似必需品,即使内存不足,JVM也是不会随意回收强引用的对象来较少内存消耗的。
软引用指类似可有可无的物品,当内存不足时,JVM会回收软引用对象。软引用一般用来实现缓存。
弱引用跟软引用差不多,不过弱引用生命周期比弱引用很短。当垃圾回收时发现了弱引用对象,不论内存是否足够,都会回收内存。
虚引用不会决定对象的生命周期,跟没有引用一样,在任何时候都可能被垃圾回收。一般虚引用用来追踪垃圾回收的过程。
不过在我写代码的时候一般都用的是强引用,还没有写过软引用,先记录一下,以后碰到的时候稍微有点印象。
今天就记录到这里,如果我有理解错的,还望各位指出更正,以免影响他人理解。