一、基本数据类型
- int : 4字节 (32位) 。 min:-2,147,483,648 (-2的31次方); max:2,147,483,647 (2的31次方-1)
- long : 8字节 (64位)。 (-2的63次方)~(2的63次方-1) 例:long a = 100000L;
- short : 2字节。 -32768 ~ 32767
- byte : 1字节。
- float : 4字节。有效位数是7位 例:float f1 = 234.5f;
- double : 8字节。有效位是15~16位 例:double d1 = 123.4;
- char : 2字节。
- boolean : 1位。
二、包装类
- 主要属性和方法:
- 包装类 . SIZE :基本类型的二进制位数;
- 包装类 . MIN_VALUE :最小值;
- 包装类 . MAX_VALUE :最大值;
- 包装类 .valueOf(str):字符串 —> 包装类实例;
- 包装类 .parseXXX(str):字符串 —> 基本类型;(XXX可以是 Int,Short,Long,Float,Double,Byte)
- 自动装箱:实质是调用 包装类.valueOf (int i) 方法。计算数值时,Integer会自动转为int进行计算。例如:Integer a = 10; Integer b = 20; int c = a + b 。
- 自动拆箱:编译器内部会调用 包装类.xxxValue( ) 方法。例如:int a = 30; Integer b = a; int数值又会被包装成Integer。
三、引用类型
引用是一种数据类型(保存在stack中),保存了对象在内存(heap,堆空间)中的地址,这种类型即不是我们平时所说的简单数据类型也不是类实例(对象);
不同的引用可能指向同一个对象,换句话说,一个对象可以有多个引用,
Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。
- Java对象的四种引用类型:强引用,软引用,弱引用,虚引用
Java中提供这四种引用类型主要有两个目的:
- 第一是可以让程序员通过代码的方式决定某些对象的生命周期;
- 第二是有利于JVM进行垃圾回收。
1.强引用
- 是指创建一个对象并把这个对象赋给一个引用变量。
比如:
Object object =
new
Object();
String str =
"hello"
;
- 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
2.软引用
- 用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。常使用软引用构建敏感数据的缓存。
- 如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2 之后,提供 SoftReference 类来实现软引用。
软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。
也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。
另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。
3.弱引用(WeakReference)
- 用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference 类来实现弱引用。常使用弱引用构建非敏感数据的缓存。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。
4.虚引用(PhantomReference)
- 虚引用也称为幽灵引用或者幻影引用,它和前面的软引用、弱引用不同,它并不影响对象的生命周期,也无法通过虚引用来取得一个对象实例。在java中用java.lang.ref.PhantomReference 类来实现虚引用。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。设置虚引用关联唯一的目的就是能在这个对象被收集器回收时收到一个系统通知。
要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
在使用软引用和弱引用的时候,我们可以显示地通过System.gc()来通知JVM进行垃圾回收,但是要注意的是,虽然发出了通知,JVM不一定会立刻执行,也就是说这句是无法确保此时JVM一定会进行垃圾回收的。
参考:https://www.cnblogs.com/huajiezh/p/5835618.html
对象在传递的时候究竟是按什么方式传递的呢?
Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中基本类型没有引用。
一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,我们可以把它想象为类似 C++ 语言中指针的东西,它指示了对象在内存中的地址——只不过我们不能够观察到这个地址究竟是什么。
即是按值传递也是按引用传递,但通常基本数据类型(如int,double等)我们认为其是“值传递”,而自定义数据类型(class)我们认为其是“引用传递”。
如有错误,欢迎留言指正 * _ *