Java final 和 static 关键字

final 关键字

1. 数据

声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。

  • 对于基本类型,final 使数值不变;
  • 对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
1
2
3
4
final int x = 1;
// x = 2; // cannot assign value to final variable 'x'
final A y = new A();
y.a = 1;
阅读更多

Java Object通用方法

Object 类中的方法一览:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public native int hashCode()

public boolean equals(Object obj)

protected native Object clone() throws CloneNotSupportedException

public String toString()

public final native Class<?> getClass()

protected void finalize() throws Throwable {}

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

public final void wait() throws InterruptedException
阅读更多

Java基本运算

== 和 equals()

  • == 判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。

    • 基本数据类型:== 比较的是值
    • 引用数据类型:== 比较的是内存地址
  • equals() 判断两个对象是否相等。但它一般有两种使用情况:

    • 情况1:类没有重写 equals() 方法。等价于“==”。
阅读更多

设计模式六大原则

一.单一职责链原则

不要存在多于一个导致类变更的原因(一个类只负责一项职责)

(要在类的职责扩散到无法控制之前,立即重构)

二.里氏替换原则

定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

阅读更多

垃圾收集器与内存分配

一.判断对象是否存活的算法:

  1. 引用计数法:

    给对象添加一个引用计数器,每一个地方引用它时计数器加1;引用失效时计数器减1.为值为0的对象不可能再被使用.

    缺点:

    难以解决对象之间循环引用的问题(对象A引用对象B,对象B引用对象A,两个对象无实际意义)

  2. 可达性分析算法:

    通过一些称为”GC_ROOTS”的对象作为起点,开始向下搜索引用它的对象,这个过程走过的路径即”引用链”.当一个对象到”GC_ROOTS”没有任何引用链相连,证明此对象不存活.

阅读更多

虚拟机类加载机制

一.类加载时机:

  1. 类从加载到虚拟机内存~卸载出内存的生命周期(这些阶段通常是交叉混合进行的):

    加载 –> 验证 –> 准备 –> 解析 –> 初始化 –> 使用 –> 卸载

  2. 主动引用五种必须立即对类进行初始化的情况:

阅读更多

Java NIO

简介

Java NIO(New I/O)是 Java 1.4 中引入的一套新的 I/O API,它与传统的 Java I/O 模型相比具有以下优势:

  • 非阻塞 I/O:NIO 的 I/O 操作是非阻塞的,这意味着线程不会在 I/O 操作期间阻塞。这使得 NIO 非常适合高并发应用。
  • I/O 多路复用:NIO 支持 I/O 多路复用,这意味着一个线程可以同时处理多个 I/O 操作。这使得 NIO 能够有效地利用系统资源。
阅读更多

ArrayList 扩容

一 先从 ArrayList 的构造函数说起

ArrayList有三种方式来初始化,构造方法源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* 默认初始容量大小
*/
private static final int DEFAULT_CAPACITY = 10;


private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**
*默认构造函数,使用初始容量10构造一个空列表(无参数构造)
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

/**
* 带初始容量参数的构造函数。(用户自己指定容量)
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {//初始容量大于0
//创建initialCapacity大小的数组
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {//初始容量等于0
//创建空数组
this.elementData = EMPTY_ELEMENTDATA;
} else {//初始容量小于0,抛出异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}


/**
*构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回
*如果指定的集合为null,throws NullPointerException。
*/
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}

阅读更多

Java反射

何为反射?

如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。

通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

反射的应用场景了解么?

像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。

阅读更多