Switch 语句的变量类型可以是什么?

switch 语句中的变量类型可以是: byteshortint 或者 char 以及 enum。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

八种基本数据类型的大小,以及它们的封装类。

基本数据类型 大小(byte) 范围 封装类
byte 1byte(1个符号位) -2^7~2^7-1 Byte
short 2 byte(1个符号位) -2^15~2^15-1 Short
int 4 byte(1个符号位) -2^31~2^31-1 Integer
long 8 byte(1个符号位) -2^63~2^63-1 Long
char 2 byte(1个符号位) -2^15~2^15-1 Character
float 4 byte(1位符号位,8位指数位) 2^-149~2^128-1 Float
double 8 byte(1位符号位,11位指数位) 2^-1074~2^1024-1 Double
boolean 4 byte(单独声明)/ 1 byte(boolean数组) false/true Boolean

一般来说,32 位系统引用类型为 4 byte,64 位系统引用类型为 8 byte。
但是如果开启指针压缩(-XX:+UseCompressedClassPointers)的话,那么就都为 4byte。

equals 和 == 的区别

  • 对于基本数据类型来说,== 就是比较值是否相等
  • 对于引用类型来说,== 比较的是它们在内存中的地址(堆地址)
    • 对于引用类型来说,每次 new 出来,都会开辟新的堆空间(所以除非同一个 new 出来的,一般 == 都为 false)
  • 对于 equals 来说,在 Object 类中是使用 == 比较的,所以也是比较的地址

    1. public boolean equals(Object obj) {
    2. return (this == obj);
    3. }
  • 但是一般的基本类型的封装类,引用类型都会重写 equals 方法,比如 String,所以重写后的 equals 是比较的值大小

    1. public boolean equals(Object anObject) {
    2. if (this == anObject) {
    3. return true;
    4. }
    5. if (anObject instanceof String) {
    6. String anotherString = (String)anObject;
    7. int n = value.length;
    8. if (n == anotherString.value.length) {
    9. char v1[] = value;
    10. char v2[] = anotherString.value;
    11. int i = 0;
    12. while (n-- != 0) {
    13. if (v1[i] != v2[i])
    14. return false;
    15. i++;
    16. }
    17. return true;
    18. }
    19. }
    20. return false;
    21. }

    Object 有哪些公共方法?

    image.png

    clone()

    使用的时候需要实现 _java.lang.Cloneable_ 接口,然后重写 clone() 这个方法(深克隆、浅克隆)

    1. protected native Object clone() throws CloneNotSupportedException;

    equals()

    默认的是比较对象的堆地址,一般需要重写 equals() 这个方法(比较值)

    1. public boolean equals(Object obj) {
    2. return (this == obj);
    3. }

    hashCode()

    一般用在 hash tables 中,用来比较。同一个对象的 hashCode 一定相同,但是 hashCode 相同的对象,它们不一定相同。

    1. public native int hashCode();

    finalize()

    这个方法是专供垃圾回收提供的,垃圾回收期跳如果要针对一个类的对象进行回收,那么它会先调用 finalize() 方法,但要注意,并非调用了 finalize(),就马上会回收。java 的垃圾回收机制是无法认为预测的,它只在 jvm 认为合适的时候才会进行回收。而所谓的合适,唯一的判断标准就是内存不足。

    1. protected void finalize() throws Throwable { }

    getClass()

    此方法与反射有关。用于返回一个返回该对象的运行时类的 java.lang.Class 对象。也就是运行中的对象本身。

    1. public final native Class<?> getClass();

    notify()、notifyAll() 和 wait()

    这三个方法是相辅相成来实现多线程的。wait() 来阻塞线程,wait() 被调用后,线程将会进行等待状态,锁被释放,同时线程也会让出 CPU 资源,其他的线程可以运行。notify\notifyAll() 方法用于唤醒线程,调用 notify\notifyAll() 方法后,不会立即释放锁,而是等待 synchronized 代码块执行完后。或者遇到 wait() 方法后,再释放锁。因此,有一点要非常注意,notifynotifiAllwait() 是必须在 synchronized 包含的代码块中使用。这跟 thread 类的 sleep 方法是不一致的,sleep() 方法可以在任意地方使用。 ```java public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException(“timeout value is negative”); }

  1. if (nanos < 0 || nanos > 999999) {
  2. throw new IllegalArgumentException(
  3. "nanosecond timeout value out of range");
  4. }
  5. if (nanos > 0) {
  6. timeout++;
  7. }
  8. wait(timeout);

}

public final void wait() throws InterruptedException { wait(0); }

  1. <a name="V1Jhu"></a>
  2. ### toString()
  3. 它默认的作用是就对象转化为字符串的形式。如果是基础数据类型,如 int ,long,byte 等等,但如是引用对象,`toString()` 将会转化为该对象的内存地址。
  4. ```java
  5. public String toString() {
  6. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  7. }

Java 的四种引用,以及它们用到的场景

强引用

一般定义的对象都是强引用,一旦没有引用指向堆中的对象,那么它会被回收

软引用

SoftReference ,一般用于当做缓存,堆内存不足,则回收

弱引用

WeakReference,进行垃圾回收的时候,发现则回收(可以 get 到),ThreadLocal

虚引用

PhantomReference,进行垃圾回收的时候,发现则回收(不能被 get 到),一般用于管理堆外内存

try 里面有 return,那么 finally 还会执行吗?

会执行,当 try 语句退出的时候,一定会执行 finally 块,这确保了即使发生一个意想不到的异常也会执行 finally。如果在 try 或者 catch 执行的时候,JVM 退出,或者这个线程被中断或者杀死,那么就不会执行 finally。

如果从 finally 块中返回一个值,那么这个值将会成为整个 try-catch-finally 的返回值,无论是否有 return 语句在 try 和 catch 中。这包括在 catch 块里抛出的异常。

Excption 与 Error 包结构

Java 基础 - 图2
java 将可抛出的(Throwable)的结构分为三种类型:Checked Exception(被检查的异常),RuntimeException(运行时异常),Error(错误)。

  • RuntimeException
    • 一般被应用程序抛出,编译器不会检查
  • Exception
    • 需要 try catch,或者抛出,否则会报编译错误
  • Error

    • 编译器不会检查,一般因为资源不足等,比如 OOM

      OOM 你遇到过哪些情况

      在 JVM 中,除了程序计数器之外都会产生 OOM,例如堆内存(Heap)溢出,就会报 OutOfMemoryError,如果栈溢出就会报 StackOverFlowError,但如果是栈扩展的时候,内存不足,就会报 OutOfMemoryError

      SOF 你遇到过哪些情况

  • 递归调用

  • 大量循环或者死循环
  • 全局变量过多
  • 数组、List、Map 数据过多

    Java面向对象的三个特征与含义

  • 封装

    • 将某事物的属性和行为包装到一个对象中
    • 可以使用 priavte、protected、public 来修饰属性和方法,来限制外部的访问。
  • 继承
    • 子类可以继承父类的属性和方法
    • 即父对象的属性和方法,其子对象都拥有
  • 多态

    • 一般指 java 中我的方法重写(Override)和方法重载(overload)
    • overload 的方法的参数列表必须不一致
    • override 是面向对象中的多态
    • 多态指父类中的同一个方法能在其不同的子类中有不同的实现。

      Interface与abstract类的区别

      抽象类

      如果一个类没有包含足够多的信息来描述一个具体的对象,那么这个类就是抽象类

  • 抽象类不能被实例化

  • 如果一个类中含有抽象方法,那么这个类必须被定义为抽象类

    接口

    接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。

  • 实现接口的类必须实现接口的所有方法

  • 接口没有构造方法
  • 接口中的方法必须是抽象的
  • 接口中的方法一般不需要实现,除非这个方法加了 default 或者 static 关键字
  • 接口中只能包含 public、static 和 final 修饰的变量
  • 接口支持多继承