1. Java中的枚举

    本文基于JDK 1.8.0_45 一个简单的枚举例子 public enum EnumExample { enum1, enum2; } 以上是一个简单的枚举例子,我们通过关键字enum定义了一个名叫EnumExample的枚举类,在其中我们定义了两个枚举类型:enum1和enum2。 在Java中所有的枚举类默认都会继承自Enum抽象类,所有的枚举类型都会自动包含Enum抽象类中定义的方法。其中包含了获取枚举类型的名字、顺序、所属的类,另外还有通过枚举类和名字获取枚举类型的静态方法,如下所示: public enum EnumExample { enum1, enum2; public static class Test { public static void main(String[] args) { System.out.println(enum1.name());// enum1 System.out.println(enum1.ordinal());// 0 System.…

    on java enum 枚举 EnumSet EnumMap 动态添加枚举

  2. Java中的注解

    本文基于JDK 1.8.0_45 一个简单的注解的例子 @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) public @interface MyAnnotation { String value(); } 以上是一个简单的注解的例子,从中可以看到: 通过@interface标识这个类是一个注解; 通过在注解类上加上注解来标识这个注解的元信息; 注解可以通过定义一些方法来给注解添加更多的信息; 所有的注解类型都会自动的继承自Annotation接口。该接口主要是提供给Class来使用,比如反射等。 请注意显式的实现Annotation接口并不会定义一个注解类型,该接口也不会定义一种注解类型。 该接口提供了基本的equals、hashCode、toString和annotationType方法,其中annotationType会返回相应注解实际上的class。 内置注解-Documented 变量 无 用法 只能用于其他注解上; 该注解用于标识它需要被JavaDoc之类的工具处理,并被包括在生成的文档中; 例子 package com.oomlife.java.example; import java.…

    on java annotation 注解 Repeatable

  3. Java中的字符串操作

    本文基于JDK 1.8.0_45 在编程世界中使用最多的数据是数值和字符串,下面就让我们来聊聊Java中的字符串操作。 所谓字符串,就是一串有序的字符。在Java中字符串的数据类型分为了两种,可变字符串和不可变字符串。可变字符串包括StringBuilder和StringBuffer,不可变字符串是String。它们都实现了接口CharSequence。 CharSequence接口 在CharSequence中定义了字符序列操作的一系列方法,如下所示: int length();// 长度 char charAt(int index);// index位置的字符 CharSequence subSequence(int start, int end);// start到end位置之间的子CharSequence String toString();// 包含CharSequence中字符的String default IntStream chars();// 默认方法,返回一个IntStream。Stream是在JDK1.8中才引入的feature StringBuilder和StringBuffer StringBuilder和StringBuffer都继承自AbstractStringBuilder抽象类,并实现了CharSequence接口和序列化接口Serializable。AbstractStringBuilder实现了CharSequence接口和Appendable接口,因此StringBuilder和StringBuffer均可用来表示一个字符串,同时还可以在声明之后在末尾添加新的字符或字符串从而修改原有的字符串。在AbstractStringBuilder中实现了各种各样的append方法和insert方法,另外还包含了一些其他的工具方法,…

    on java string StringBuilder StringBuffer intern

  4. Java数据类型

    本文基于JDK 1.8.0_45 基本数据类型 Java中的基本数据类型及其所占字节大小如下所示。基本数据类型是在栈中字节分配内存,其中一个char为两个字节,这样一个char中即可存储一个中文汉字。 类型 字节 byte 1 char 2 short 2 integer 4 long 8 float 4 double 8 boolean 1/8 注:1 byte是8 bits 在定义long的时候需要在数字末尾加上l或者L,在定义float的时候可以在数字末尾加上f或者F(默认如果数字中有小数点则为float),在定义double的时候需要在数字末尾加上d或者D。一般建议在数字末尾加上大写字母来标示数据类型,这是因为特别是小写字母l和数字1在印刷体中较难区分,使用大写字母L更易于阅读。如: byte b = 1; char c = 1; short s = 1;…

    on java 数据类型 number character

  5. Java中的异常

    本文基于JDK 1.8.0_45 Throwable架构是非常经典的继承结构: 所有的广意的异常都是Throwable的子类,通过继承的树状结构来对异常进行分类,比如异常分为两大类,Error和Exception,其中Exception又分为检查异常和运行期异常,每一个分支又是细化的一类异常。 在Throwable中定义大多数关于异常处理的方法,并提供部分接口给子类重写。 一般都可以从异常命名中看出来其作用是什么,因此当我们自定义异常的时候也最好遵循这一命名规则。 printStackTrace方法有PrintWriter和PrintStream两种参数的重载方法,源码中通过自定义的PrintStreamOrWriter内部类的两种子类分别对这两种类型的参数进行封装,并通过统一接口提供lock和println的方法,通过这种方式避免了复制代码来分别实现相似的功能。该方法通过递归遍历并打印自己的异常堆栈、suppressed异常堆栈和cause异常堆栈。 从1.7版本开始添加了两个API方法:addSuppressed和getSuppressed来解决存在多个异常抛出的场景(如try-with-resources)。其中try-with-resources的字节码大概是下面的样子,有可能会出现两个异常,一个是try块中的异常,一个是调用close方法时抛出的异常。使用suppressed就可以避免前一个异常被丢弃而无法找到真正的异常原因的问题。 try{ throw new Throwable(); }catch(Throwable e) { try { resource.close(); }catch(Throwable suppressedException) { e.addSuppressed(suppressedException); throw e; } throw…

    on java 异常 exception Throwable 循环依赖