Java 基本知识
Java 基本类型
基本数据类型
| 类型 | 字长 | 说明 |
|---|---|---|
| byte | 1 | 字节型 |
| short | 2 | 短整型 |
| int | 4 | 整型 |
| long | 8 | 长整型 |
| float | 4 | 单精度浮点数 |
| double | 8 | 双精度浮点数 |
| char | 字符型 | |
| boolean | 布尔型 |
long 和 double 在内存中占两个 SLOT,其它类型在内存中占一个 SLOT。
String 不是基本数据类型,它是一种特殊的类。
Object
java.lang.Object
java.lang 包在使用的时候无需显示导入,编译时由编译器自动导入。 Object 类是类层次结构的根,Java 中所有的类从根本上都继承自这个类。 Object 类是 Java 中唯一没有父类的类。其他所有的类,包括标准容器类,比如数组,都继承了 Object 类中的方法。
Object 类中的方法如下:
protected Object clone()
Creates and returns a copy of this object.
- 会抛出 CloneNotSupportedException
使用这个方法的类必须实现 java.lang.Cloneable 接口,否则会抛出CloneNotSupportedException 异常。而 Cloneable 接口其实只是个空接口,不需要写任何方法。
- 这个方法是 protected 修饰的 重写 clone() 方法的时候需要写成 public,以让类外部的代码调用。
boolean equals(Object obj)
Indicates whether some other object is “equal to” this one.
equals() 方法需要具有如下特点:
自反性(reflexive):任何非空引用 x,x.equals(x) 返回为true。
对称性(symmetric):任何非空引用 x 和 y,x.equals(y) 返回 true 当且仅当y.equals(x) 返回 true。
传递性(transitive):任何非空引用 x 和 y,如果 x.equals(y) 返回true,并且y.equals(z) 返回 true,那么 x.equals(z) 返回 true。
一致性(consistent):两个非空引用 x 和 y,x.equals(y) 的多次调用应该保持一致的结果(前提条件是在多次比较之间没有修改 x 和 y 用于比较的相关信息)。
约定:
- 对于任何非空引用 x,x.equals(null) 应该返回为
false。 - 重写 equals() 方法时,应该同时重写 hashCode() 方法。
== VS equals()
==运算符判断两个引用是否指向同一个对象。- equals() 方法应当用来判断两个对象内容是否相等。
Object 类中的 equals() 方法代码如下:
1 | public boolean equals(Object obj) |
即 Object 类中的 equals() 方法等价于 == 。
如果需要判断两个对象是否内容相等时,应当重写 equals() 方法。
int hashCode()
Returns a hash code value for the object.
当重写 equals() 方法时,必须重写 hashCode() 方法。
hashCode 需要满足的条件如下:
(1) 在 Java 应用的一次执行过程中,如果对象用于 equals() 比较的信息没有被修改,那么同一个对象多次调用 hashCode() 方法应该返回同一个整型值。
应用的多次执行中,这个值不需要保持一致,即每次执行都是保持着各自不同的值。
(2) 如果 equals() 判断两个对象相等,那么它们的 hashCode() 方法应该返回同样的值。
(3) 如果 equals() 判断两个对象不相等,那么它们的 hashCode() 方法并不需要不同。
即,两个对象用 equals() 方法比较返回 false ,它们的 hashCode 可以相同也可以不同。但是,为不相等的对象产生不同的 hashCode 可以改善哈希表的性能。
Object 类默认的 hashCode() 方法返回对象的地址。
String toString()
Returns a string representation of the object.
Object 类中的 toString() 方法定义如下:
1 | public String toString() |
Integer
Integer 类是 int 类型的装箱类
int
- int 是基本数据类型
- 使用时无需使用 new 创建对象,也不需要额外的引用空间保存辅助信息
- 由于不是对象,没有相应的方法,在某些场合使用受限
Integer:
- Integer 是一种封装类,它用 final 关键字修饰,不能被继承
- Integer 弥补了基本数据类型在面向对象方面的欠缺,它可以实例化对象,且该类中还提供了多个用于处理 int 型数据的功能方法。
- 可以通过自动的拆箱和封箱在 int 和 Integer 类型之间自动转换。
String
String 是一种特殊的类,String 类初始化后是不可变的(immutable)。
在进行连接操作时,String 每次返回一个新的 String 实例,会产生很多临时变量,因此,大量字符串拼接时,最好使用 StringBuffer 或 StringBuilder。
StringBuffer/StringBuilder
StringBuffer 和 StringBuilder 都可以用来拼接字符串,两者都不会生成临时变量。
区别:
StringBuilder 是非线程安全版 StringBuffer,性能优于 StringBuffer。
hashCode()
1 | /** |
语法糖
foreach 是一种 Iterator 语法糖,其原理如下:
foreach 用法:
1 | for (String s : strings) { |
类似于:
1 | Iterator<String> iterator = strings.iterator(); |
修饰符
访问控制
| 修饰符 | 说明 |
|---|---|
| private | 只能在同一个类中访问 |
| 默认 | 只能在同一个包中访问 |
| protected | 可以在同一个包和子类中访问 |
| public | 不限制访问 |
static
- 修饰变量
- 修饰方法
- 修饰静态块
1 | class A { |
- 修饰静态内部类
1 | class Outer { |
- 静态导入
使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
1 | import static java.lang.System.out; //导入java.lang包下的System类的静态变量out; |
final
final 关键字可用于修饰类、变量和方法,用于表示它所修饰的类、变量和方法不可改变。
| 修饰对象 | 说明 |
|---|---|
| 变量 | 表示该变量一旦获得了初始值之后就不可被改变,final 既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量、形参。 |
| 方法 | 方法不可被重写,如果不希望子类重写父类的某个方法,则可以使用 final 修饰该方法。 |
| 类 | 不可以有子类 |
例子
1 | final StringBuffer a = new StringBuffer("foo"); |
由此可见,final 只对引用的值(即内存地址)有效,引用只能指向初始指向的那个对象,之后无法改变它的指向。但是 final 无法阻止它所指向的对象的变化。
对比 finally 和 finalize
finally 关键字用于异常处理机制,往往跟在 try-catch 语句块之后,finally 语句所包含的代码几乎在任何情况下都会被执行,且在 try-catch 语句块中只能有一个 finally 语句块。
finalize,垃圾回收器要回收对象的时候,首先要调用这个类的 finalize 方法。
利用 finalization 机制,用户可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。
但是 finalize 的执行是不确定的,既不确定由哪个线程执行,也不确定执行的顺序。因此不推荐使用此方法。
transient
变量修饰符,如果用 transient 声明一个实例变量,当对象存储时,它的值不需要维持。也就是说,用 transient 关键字标记的成员变量不参与序列化过程。
Reference
- Java™ Platform, Standard Edition 8 API Specification. Oracle. http://docs.oracle.com/javase/8/docs/api/overview-summary.html
- Java Object类. 圣骑士wind. http://www.cnblogs.com/mengdd/archive/2013/01/03/2842809.html
















