java基础之枚举,日期,泛型,UUID,异常

本文深入解析Java编程语言的核心技术,包括枚举的定义与用法、日期处理、反射机制、泛型概念及其应用场景、UUID原理及应用、异常处理等。通过实例讲解,帮助读者掌握Java开发中的关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

java学习的目标jvm和Java类库
java类库三个级别:

  1. 精读源码
    java.io;java.util;java.lang
    集合 枚举
  2. 深刻理解
    java.lang.reflect;java.net;javax.net.;java.nio.;java.util.concurrent.*
  3. 会用即可

一、枚举

1 为什么要使用枚举

枚举的定义:在某些情况下,一个类的对象是有限而且固定的,比如季节类只有4个对象。这种实例有限而且固定的类,在java里被称为枚举类。

1.1接口常量

不好的地方是必须写注释才可以知道常量的含义。这个相当于手动实现一个枚举类。

  1. 不分类
public interface SexConstants{
//男
public static final int MAN = 0;
}
  1. 静态内部类进行分类 可以分类管理
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 枚举

好处存入数据库的值和注释可以通过枚举的名字进行关联映射。

  1. 不分类
public enum Sex{
MAN(0,"男"),
FEMALE(1,"女");
}
  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方法

  1. values():获取枚举集合
  2. Color c = Color.valueOf(Object.class,“RED”);将字符串变成枚举
  3. switch枚举
  4. oridinal:这个方法返回枚举值在枚举类中的顺序 Color.RED.oridinal()
  5. name:获取枚举的名字 Color.RED.name()。还可以使用toString()方法
  6. compareTo

2.2 特性

  1. 枚举实例,如果不同的成员变量(枚举实例不需要我们new)需要不同的属性,需要将成员变量和构造方法定义为私有,同时成员变量定义为final ,这个设计称为不可变的类。
  2. 实现接口的枚举类:创建每个实例的匿名内部子类的实例,要不实现的方法都是一样效果。
  3. 包含抽象方法的枚举类:枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义为抽象类,枚举类需要显示创建枚举值,所以定义每个枚举值时必须为抽象方法提供实现,否则将编译错误。
  4. 构造器是private的,省略会自动加private。
  5. 使用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>
缺点:

  1. 处理引用类型时,虽然没有装箱和拆箱操作,但将用到数据类型的强制转换操作,增加处理器负担
  2. 如果处理器是数组,数组中数据类型不一致,则会运行时类型转换异常,编译器无法检查出来

三 泛型的定义

菱形语法 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这个类

六 异常

在这里插入图片描述

函数式编程和Lambda

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值