一、枚举
1.介绍
本质是一种类,只不过对象是有限的、固定几个,不能由用户创建。(想想单例<枚举类只有一个对象,则可以作为一种单例模式的实现方式)
eg.
星期:星期一、星期二、、、、星期天;
季节:春夏秋冬;
2.怎么自定义
jdk5.0前:
->写下对象的实例属性(final)
->私有化构造器
->实例变量的get方法
->new出不同的对象(给对象使用public static final关键字可以直接在方法中用类名调用)
jdk5.0后
enum关键字:enum+类名
->创建当前类的实例:直接>对象名(参数);对象间逗号隔开
->声明当前类的对象的实例变量
->私有化构造器
->实例变量的get方法可以有
枚举类的父类是enum类
3.enum常用的方法
toString()方法----对象名
name():返回对象名
values():返回枚举类对象数组
valueOf(“对象名称”):能返回找到叫对象名的对象,如果没找到就报错
ordinal—非静态,用对象调用第几个声明的,返回数字(从0开始)
4.枚举类实现接口操作
1.枚举类实现接口。不同对象调用同一方法
2.让枚举类的每一个对象的声明后重写方法。不同对象调用不同的方法
二、注解
1.介绍
jdk5.0引用的,以“@注解名”在代码中存在
@override
像修饰符一样用。可以添加参数值,在类编译、运行时加载,体现不同功能;
2.注解、注释
注解:被编译器、其他读取
注释:给程序员看
3.常见的
1.文档注解
2.编译格式检查:@Overrite(重写)、@Deprecated(过时)、@SuppressWarning(抑制编译器警告)
3.跟踪代码依赖性、实现配置文件(框架)
Spring框架中关于<事务>处理
4.基础使用
@Overrite(重写):校验作用,相当于保护机制;
@Deprecated(过时):不推荐用,API中会说被什么替换
@SuppressWarning(抑制编译器警告):黄色警告,不希望看到警告时,作用范围与放置位置有关----语句、方法、类上@SuppressWarning({“unused”})
5.怎么自定义
写框架时会需要,在目前课程,不是重点内容
框架 = 注解 + 反射 + 设计模式;
6.元注解(了解)
1.对现有注解进行解释说明;
元数据:String name = “tom”; String\name时tom的元数据
2.例子
@Retention—注解的作用范围:
SOURCE编译器使用后丢弃、
CLASS编译器记录在class文件,JVM不保留、
RUNTIME编译器记录在class文件,JVM保留;
@Target—能修饰的结构
@Documented—能不能再javadoc体现
@Inherited—子类会继承父类注解
三、异常
1.异常介绍
导致程序不能正常进行的。
有Error和excepution两种;
主要讲excepution这种,并且,分为两种:编译异常(主要)、运行异常
2.异常处理
(1)try-catch-finally模型
try—放可能异常的代码
catch—匹配相应的excepution的类型,可以加入自己的输出语句
finally—强制执行,除非系统强制停止jvm的运行。一般用于流文件的关闭(随着引用指针出栈流文件和磁盘链接非空指针,GC垃圾回收器不会回收,手动关闭防止内存泄露)
( 2)throws抛异常
方法证明+ throws+异常类型—>>>并没有解决,只是被抛出了—>>>但是中央main必须处理
3.方法重写
方法重写抛出异常类型需要是>>>父类方法的子类一样也行(想想多态的引用时抛出的异常 )
如果父类方法无异常则子类方法重写很难抛出异常类型、但是可以抛出运行时异常
所以在开发中一些接口会在抽象方法中抛出子类重写方法可能发生的异常
4.处理选择
资源一定要解决->t-c-f
父类没有抛异常,那子类重写的方法需要自己解决->t-c-f
不适合在当前方法中解决的throws
5.手动throw异常对象
-
基于开发实际要求,不满足具体场景的 ,自己主动抛出异常
-
throw new RuntimExceotion(“输入id非法”);引号内是异常的“Message“
-
可以自己处理异常,对于编译异常必须处理
“抛”===自动抛出、手动抛出
”抓“===处理异常,对应异常处理两种方式
6.自定义异常
步骤:
- 继承异常体系的某类,一般是Exception
- 通常提供几个重载的构造器
- 提供一个全局量,改他的值,唯一标识他的类
使用:
在具体代码满足指定条件,手动抛出 throw new RuntimExceotion,非运行异常需要考虑处理
意义:
名称显示原因
四、集合
->保存多个数据使用,更加灵活
->动态保存任意多个元素
->提供操作方法
->删除添加的代码简洁明了
1、框架体系
分为两组:单列集合、双列集合
Collection体系图—List set实现的都是单列集合
Map体系图===实现的是双链集合
2、Collection接口
特点
- collection实现子类可以存放多个元素
- 有些Collection实现类可以存放重复元素,有些不可以
- 有些Collection实现类有些是有序的(List),也有无序的(Set)
- Collection没有直接的实现子类,而是通过子接口Set、List实现的
常用方法
- add()-添加单个object元素 eg:list1.add(new Dog(“大黄”,2));
- remove(index\object)-根据元素或者索引删除
- contains(object)-查询元素是否存在
- size()-元素个数
- isEmpty()-判断是否为空
- clear()-清空
- addAll(Collection)-添加多个元素
- containsAll(集合)-查找多个元素是否存在
- removeAll(集合)-删除多个元素
遍历方式
1.Iterator迭代器
只要实现了Collection接口都有一个**iterator()**方法来返回一个Iterator对象(即迭代器),看图,仅用于遍历集合并不存储对象。
原理图
- iterator.hasNext()—集合的下一个元素存在就返回true
- iterator.Next()—返回集合的下一个元素//快捷键:itit+回车
- 如果希望再次遍历,需要重置迭代器:iterator = list. iterator
2.增强for—也可以直接在数组上用
- 底层还是迭代器
- for(object:List){}
- 快捷方式:I+回车\集合名称.for;
List接口
-
元素可以重复,有序->按照插入顺序
-
每个都有顺序索引—get(int index)
-
实现子类很多的,常用:ArrayList、LinledList和Vector;
-
常用方法:
插入:add(All)(index,object)-没有下–时 插到最后
indexof()-某元素第一次出现的下标
lastindexOf()-某元素最后一次出现的位置
set(index,object)-替换,索引必须存在
subList(formIndex,toIndex)-返回子串[,)
ArrayList类
线程不安全
- 维护object数组->transient Object[] elementDate;transient表示该属性不会被序列号
- 创建ArrayList对象使用无参构造器时初始容量为0,第一次添加容量成10,满了后容量扩成1.5倍
- 创建ArrayList对象使用指定大小构造器,如需扩容,则按照原来指定的1.5倍扩容
- 底层源码===真正在group添加容量
Vector类
多线程使用
- 对象数组
- 线程同步 ,操作方法有synchronized
- 无参时,默认容量是10,按两倍扩容
LinkedList类
- 实现了双向链表、双端队列的特点
- 可以任意添加元素,包括null
- 线程不安全,没有同步
底层:
-
维护了一个双向链表
-
LinkedList维护了两个属性first、last代表首节点和尾结点
-
每个结点是Node对象==》维护了pre、next、item三个属性,以此实现双向链表
-
添加删除不是通过数组,效率高
CRUD====增删改查,默认删除第一个
Set接口
基本介绍
- 无序(添加和取出顺序不一致),没有索引
- 不允许重复元素,所以最多包含一个null
- JDK API中Set接口实现类
- 不能用索引方式遍历
- 取出顺序是固定的,但不是添加顺序
HashSet类
- 可以放null,不可以重复
- 不保证元素有序,取决于hash后,再确认索引结果
- 增加时,会返回boolean值
- HashSet底层机制:HashMap(底层是:数组+链表+红黑树)
底层存储机制
->不能重复???
不能添加重复对象
但是可以添加不同对象,具有相同的内容
《坑》