Java基础
一、 String
-
String不可变,因此是线程安全的
-
StringBuilder不是线程安全的
-
StringBuffer是线程安全的,内部使用synchronized进行同步
-
new String(“abc”)
-
使⽤这种⽅式⼀共会创建两个字符串对象(前提是 String Pool 中还没有 “abc” 字符串对象)。
-
“abc” 属于字符串字⾯量,因此编译时期会在 String Pool 中创建⼀个字符串对象,指向这个 “abc”
字符串字⾯量;
-
⽽使⽤ new 的⽅式会在堆中创建⼀个字符串对象。
-
二、final
1、数据
声明数据为常量,可以是编译时常量,也可以是在运⾏时被初始化后不能被改变的常量。
- 对于基本类型,final 使数值不变;
- 对于引用类型,final使引用不变,也就不能引用其他对象,但是被引用的对象本身是可以修改的
2、方法
声明方法不能被子类重写
private方法隐式地被指定为final,如果在⼦类中定义的⽅法和基类中的⼀个 private ⽅法签名相同,此
时⼦类的⽅法不是重写基类⽅法,⽽是在⼦类中定义了⼀个新的⽅法。
三、static
1、静态变量
-
静态变量:⼜称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接
通过类名来访问它。静态变量在内存中只存在⼀份。
-
实例变量:每创建⼀个实例就会产⽣⼀个实例变量,它与该实例同⽣共死。
2、静态方法
-
静态方法在类加载的时候就存在了,他不依赖于任何实例,所以静态方法必须有实现,也就是它不能是抽象方法。
-
只能访问所属类的静态字段和静态⽅法,⽅法中不能有 this 和 super 关键字,因此这两个关键字与具体对象关联。
3、静态语句块
- 静态语句块在类初始化时运⾏⼀次。
4、静态内部类
- ⾮静态内部类依赖于外部类的实例,也就是说需要先创建外部类实例,才能⽤这个实例去创建⾮静态内部类。⽽静态内部类不需要。
- 静态内部类不能访问外部类的⾮静态的变量和⽅法。
5、初始化顺序
- 静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代码中的顺序
四、 equals()
1、等价与相等
- 对于基本类型,== 判断两个值是否相等,基本类型没有 equals() ⽅法。
- 对于引⽤类型,== 判断两个变量是否引⽤同⼀个对象,⽽ equals() 判断引⽤的对象是否等价。
2、面试题:请解释字符串比较之中“==”和equals()的区别?
- ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
- equals():比较的是两个字符串的内容,属于内容比较。
五、 hashCode()
-
hashCode() 返回哈希值,⽽ equals() 是⽤来判断两个对象是否等价。等价的两个对象散列值⼀定相
同,但是散列值相同的两个对象不⼀定等价,这是因为计算哈希值具有随机性,两个值不同的对象可能
计算出相同的哈希值。
-
在覆盖 equals() ⽅法时应当总是覆盖 hashCode() ⽅法,保证等价的两个对象哈希值也相等。
-
HashSet 和 HashMap 等集合类使⽤了 hashCode() ⽅法来计算对象应该存储的位置,因此要将对象添
加到这些集合类中,需要让对应的类实现 hashCode() ⽅法。
六、 重写与重载
1、重写(Override)
存在于继承体系中,指⼦类实现了⼀个与⽗类在⽅法声明上完全相同的⼀个⽅法。
为了满⾜⾥式替换原则,重写有以下三个限制:
- ⼦类⽅法的访问权限必须⼤于等于⽗类⽅法;
- ⼦类⽅法的返回类型必须是⽗类⽅法返回类型或为其⼦类型。
- ⼦类⽅法抛出的异常类型必须是⽗类抛出异常类型或为其⼦类型。
使⽤ @Override 注解,可以让编译器帮忙检查是否满⾜上⾯的三个限制条件。
2、重载(Overload)
存在于同⼀个类中,指⼀个⽅法与已经存在的⽅法名称上相同,但是参数类型、个数、顺序⾄少有⼀个
不同。
应该注意的是,返回值不同,其它都相同不算是重载。
七、 反射
每个类都有⼀个 Class 对象,包含了与类有关的信息。当编译⼀个新类时,会产⽣⼀个同名的 .class⽂件,该⽂件内容保存着 Class 对象。
类加载相当于 Class 对象的加载,类在第⼀次使⽤时才动态加载到 JVM 中。也可以使⽤Class.forName(“com.mysql.jdbc.Driver”) 这种⽅式来控制类的加载,该⽅法会返回⼀个 Class 对象。
反射可以提供运⾏时的类信息,并且这个类可以在运⾏时才加载进来,甚⾄在编译时期该类的 .class 不存在也可以加载进来。
Class 和 java.lang.reflect ⼀起对反射提供了⽀持,java.lang.reflect 类库主要包含了以下三个类:
- Field :可以使⽤ get() 和 set() ⽅法读取和修改 Field 对象关联的字段;
- Method :可以使⽤ invoke() ⽅法调⽤与 Method 对象关联的⽅法;
- Constructor :可以⽤ Constructor 的 newInstance() 创建新的对象。