概述
java学习的目标jvm和Java类库
java类库三个级别:
- 精读源码
java.io;java.util;java.lang
集合 枚举 - 深刻理解
java.lang.reflect;java.net;javax.net.;java.nio.;java.util.concurrent.* - 会用即可
一、枚举
1 为什么要使用枚举
枚举的定义:在某些情况下,一个类的对象是有限而且固定的,比如季节类只有4个对象。这种实例有限而且固定的类,在java里被称为枚举类。
1.1接口常量
不好的地方是必须写注释才可以知道常量的含义。这个相当于手动实现一个枚举类。
- 不分类
public interface SexConstants{
//男
public static final int MAN = 0;
}
- 静态内部类进行分类 可以分类管理
public interface Constants{
public static class SexConstants{
//男
public static final int MAN = 0;
}
public static class TypeConstants{
//水果
public static final int FRUITS = 0;
}
1.2 枚举
好处存入数据库的值和注释可以通过枚举的名字进行关联映射。
- 不分类
public enum Sex{
MAN(0,"男"),
FEMALE(1,"女");
}
- 分类 管理好枚举 要不几个简单的常量一个枚举的话,枚举类就太多了
public interface Enums {
public static enum Sex{
MAN(0,"男"),
FEMALE(1,"女");
//防止字段值被修改,增加的字段也统一final表示常量
private final Integer code;
private final String value;
Sex(Integer code,String value){
this.code = code;
this.value = value;
}
//根据code获取枚举
public static Sex getEnumByKey(String code){
if(null == code){
return null;
}
for(Sex temp:Sex.values()){
if(temp.getCode().equals(code)){
return temp;
}
}
return null;
}
//根据枚举名字的字符串获取枚举,这个枚举自带的valueof()可以实现以下功能
public static Sex enumByName(String name) {
if (StringUtils.isEmpty(name)) {
return null;
}
for (Sex item : Sex.values()) {
if (name.equals(item.name())) {
return item;
}
}
throw new CoreException("不支持的枚举");
}
}
public Integer getCode() {
return code;
}
public String getValue() {
return value;
}
}
2 枚举的用法
2.1方法
- values():获取枚举集合
- Color c = Color.valueOf(Object.class,“RED”);将字符串变成枚举
- switch枚举
- oridinal:这个方法返回枚举值在枚举类中的顺序 Color.RED.oridinal()
- name:获取枚举的名字 Color.RED.name()。还可以使用toString()方法
- compareTo
2.2 特性
- 枚举实例,如果不同的成员变量(枚举实例不需要我们new)需要不同的属性,需要将成员变量和构造方法定义为私有,同时成员变量定义为final ,这个设计称为不可变的类。
- 实现接口的枚举类:创建每个实例的匿名内部子类的实例,要不实现的方法都是一样效果。
- 包含抽象方法的枚举类:枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义为抽象类,枚举类需要显示创建枚举值,所以定义每个枚举值时必须为抽象方法提供实现,否则将编译错误。
- 构造器是private的,省略会自动加private。
- 使用enum定义、非抽象的枚举默认会用final修饰,因此枚举类不能派生子类。
3 枚举的线程安全及序列化问题
3.1 源码分析
http://blog.jrwang.me/2016/java-enum/
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
反编译之后:
public final class Season extends java.lang.Enum<Season> {
public static final Season SPRING;
public static final Season SUMMER;
public static final Season AUTUMN;
public static final Season WINTER;
public static Season[] values();
public static Season valueOf(java.lang.String);
static {};
}
3.2 安全问题
https://www.cnblogs.com/z00377750/p/9177097.html
二 日期
1 Date
new Date():底层是System.getCurrentTime()
2 TimeStamp
Timestamp extends Date
3 Canlendar
注意星期和月的取值范围
4 Date和Calendar转换
5 日期常用工具类
三 反射
四 泛型
1.泛型的意义 使用场景
https://www.cnblogs.com/lwbqqyumidi/p/3837629.html
参数化类型,比如List接口的定义时就是通过泛型,不固定参数类型。
List< E>,凡是出现E的地方均表示相同的接受外部的类型参数。
1.1 为了提高代码的重用性,用通用的数据类型object来实现
灵活 通用性差
List< Object> 不能用List< String>
缺点:
- 处理引用类型时,虽然没有装箱和拆箱操作,但将用到数据类型的强制转换操作,增加处理器负担
- 如果处理器是数组,数组中数据类型不一致,则会运行时类型转换异常,编译器无法检查出来
三 泛型的定义
菱形语法 List list = new ArrayList<>();
接口,类和方法都可以使用泛型去定义。因此,可以分为泛型接口,泛型类,泛型方法。
1 泛型类,泛型接口
public List< E>{}
1.
泛型派生子类:不传,默认当object处理
public class A2 extends Apple{}
public class A2 extends Apple< String>{}
2 .并不存在泛型类
不管为泛型的类型形参传入哪一种类型实参,对于java而言,依赖被当成同一类处理。
变量声明的类型必须匹配传递给实际对象的类型 List< Animal> animals = new ArrayList < Animal>();
3. 通配符 ?,只能用于引用的声明中 List < ?> list = new Arraylist< Dog>();
void add (List < ? extends Animal> animals) Animal可以是类也可以是接口
通配符声明不能调用泛型传参方法。
getField(Class<?> clazz, Class annotation)
类型通配符上限:<? extends T>,?代表是T类型本身或者是T的子类型。常用于泛型方法,避免类型转换。
类型通配符下限。<? super T>,?代表T类型本身或者是T的父类型。
2 泛型方法
需要在提前声明一下 。比如 public < E> List< E> add(){}
例子:
public <E> List<List<E>> splitList(List<E> list, int len) {
if (list == null || list.size() == 0 || len < 1) {
return null;
}
List<List<E>> result = new ArrayList<List<E>>();
int size = list.size();
int count = (size + len - 1) / len;
for (int i = 0; i < count; i++) {
List<E> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
result.add(subList);
}
return result;
}
3 pecs
https://www.cnblogs.com/drizzlewithwind/p/6100164.html
五 UUID
UUID : 通用唯一识别码
1.应用在分布式计算环境 目的是让分布式中的所有元素,都能有唯一的标识。
2.开发时,数据库表会有自增主键,查询速度快。但是做系统集成或者数据迁移时候比较麻烦,id会重复。jdk1.5出了UUID这个类