Solarex's Blog

我只想过,平平淡淡的生活,欲望啊,请放过脆弱的我

Java枚举语法糖

| Comments

Java从1.5引入枚举类型,EffectiveJava第2版item 30也建议我们使用枚举来代替int常量。我们从下面的Enum示例中看下枚举类型到底是什么。

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
49
50
51
52
53
54
55
56
public class Main {
    enum ExceptionHandleStrategy {
        IGNORE,
        LOG {
            @Override
            public void handle(Exception e) {
                System.out.println(e.getLocalizedMessage());
            }
        },
        THROW {
            @Override
            public void handle(Exception e) {
                throw new RuntimeException(e.getMessage());
            }
        };

        public void handle(Exception e) {
        }
    }

    public static void main(String[] args) {
        System.out.println(ExceptionHandleStrategy.IGNORE.getClass());
        System.out.println(ExceptionHandleStrategy.LOG.getClass());
        System.out.println(ExceptionHandleStrategy.THROW.getClass());
        System.out.println(EnumWithoutMethod.A.getClass());
        System.out.println(EnumWithoutMethod.B.getClass());
        System.out.println(EnumWithoutMethod.C.getClass());
        System.out.println(EnumWithVariable.A.getClass());
        System.out.println(EnumWithVariable.B.getClass());
        System.out.println(EnumWithVariable.C.getClass());
        System.out.println(EnumWithVariable.A.name());
        System.out.println(EnumWithVariable.A.getxxx());
        ExceptionHandleStrategy.LOG.handle(new RuntimeException("system just broken"));
    }

    enum EnumWithoutMethod {
        A,
        B,
        C;
    }

    enum EnumWithVariable {
        A("wristband"),
        B("glucometer"),
        C("fit");

        private String name;
        public String getxxx() {
            return this.name;
        }

        EnumWithVariable(String name){
            this.name = name;
        }
    }
}

数据结构与算法

| Comments

ArrayList

  • 尾插效率高,支持随机访问
  • 中间插入或者删除效率低
  • 空间不够用时,自动增长为现有空间的1.5倍
  • 底层使用Object数组来存储数据,使用System.arrayCopy来移动元素

LinkedList

  • 头插,中间插,删除效率高
  • 不支持随机访问
  • MessageQueue中Message根据msg.when来进行插入,mMessages指向头结点

Vector

  • 底层使用数组实现,增长看capacityIncrement,若capacityIncrement小于0,翻倍增长
  • 方法有synchronized修饰,线程安全
  • Stack栈底层实现使用的Vector
  • Stack在同一端进行插入和删除,FILO
  • 队列Queue是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,插入的一端称为队尾,删除的一端称为队头
  • 把队列的头尾相接的顺序存储结构称为循环队列
  • 双端队列Deque是一种具有队列和栈的性质的数据结构,双端队列中的元素可以从两端弹出,其限定插入和删除操作在队列的两端进行。LinkedListArrayDeque实现了Deque接口,LinkedBlockingQueue实现了BlockingDeque接口
  • 优先级队列,PriorityQueueMessageQueue根据Message.when来进行插入