JAVA数组
数组和容器
Java 中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组的效率要高于容器(如 ArrayList)。
数组可以持有值类型,而容器则不能(这时,就必须用到包装类)。
Java 数组的本质是对象
封装了一些数据,可以访问属性,也可以调用方法
数组对象(这里可以看成一个指针)存储在栈中。
数组元素存储在堆中。
创建数组
Java 语言使用 new 操作符来创建数组。
·指定数组维度
为数组开辟指定大小的数组维度。
如果数组元素是基础数据类型,会将每个元素设为默认值;如果是引用类型,元素值为 null。
·不指定数组维度
用花括号中的实际元素初始化数组,数组大小与元素数相同。
指定数组维度后,无论后面是否初始化数组中的元素,数组都已经开辟了相应的内存。
数组维度的形式
·数组维度可以是整数、字符。
·数组维度可以是整数型、字符型变量。
·数组维度可以是计算结果为整数或字符的表达式。
访问数组
Java 中,可以通过在 [] 中指定下标,访问数组元素,下标位置从 0 开始。
数组的引用
···
泛型和数组
通常,数组和泛型不能很好地结合。你不能实例化具有参数化类型的数组。
Java 中不允许直接创建泛型数组。但是,可以通过创建一个类型擦除的数组,然后转型的方式来创建泛型数组。
## 多维数组
···
Arrays 类
Java 中,提供了一个很有用的数组工具类:Arrays。
它提供的主要操作有:
sort - 排序
binarySearch - 查找
equals - 比较
fill - 填充
asList - 转列表
hash - 哈希
toString - 转字符串
JAVA枚举
enum 的全称为 enumeration, 是 JDK5 中引入的特性。
枚举的好处:可以将常量组织起来,统一进行管理。
枚举的典型应用场景:错误码、状态机等。
枚举的本质
枚举的本质是 java.lang.Enum 的子类。
尽管 enum 看起来像是一种新的数据类型,事实上,enum 是一种受限制的类,并且具有自己的方法。枚举这种特殊的类因为被修饰为 final,所以不能继承其他类。
定义的枚举值,会被默认修饰为 public static final ,从修饰关键字,即可看出枚举值本质上是静态常量。
枚举不可以继承
enum 不可以继承另外一个类,当然,也不能继承另一个 enum 。
因为 enum 实际上都继承自 java.lang.Enum 类,而 Java 不支持多重继承,所以 enum 不能再继承其他类,当然也不能继承另一个 enum。
枚举的应用
组织常量
有了枚举,你可以将有关联关系的常量组织起来,使代码更加易读、安全,并且还可以使用枚举提供的方法。
switch 状态机
switch 已经支持 int、char、String、enum 类型的参数。这几种类型的参数比较起来,使用枚举的 switch 代码更具有可读性。
错误码
组织枚举
可以将类型相近的枚举通过接口或类组织起来,但是一般用接口方式进行组织。
Java 接口在编译时会自动为 enum 类型加上public static修饰符;Java 类在编译时会自动为 enum 类型加上 static 修饰符。
在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。
策略枚举
这种枚举通过枚举嵌套枚举的方式,将枚举常量分类处理。
枚举实现单例模式
单例模式是最常用的设计模式,单例模式在并发环境下存在线程安全问题。
为了线程安全问题,传统做法有以下几种:
·饿汉式加载
·懒汉式 synchronize 和双重检查
·利用 java 的静态加载机制
相比上述的方法,使用枚举也可以实现单例,而且还更加简单
枚举工具类
EnumSet
EnumSet 是枚举类型的高性能 Set 实现。它要求放入它的枚举常量必须属于同一枚举类型。
主要接口:
noneOf - 创建一个具有指定元素类型的空 EnumSet
allOf - 创建一个指定元素类型并包含所有枚举值的 EnumSet
range - 创建一个包括枚举值中指定范围元素的 EnumSet
complementOf - 初始集合包括指定集合的补集
of - 创建一个包括参数中所有元素的 EnumSet
copyOf - 创建一个包含参数容器中的所有元素的EnumSet
EnumMap
EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其它的 Map 实现(如 HashMap)也能完成枚举类型实例到值得映射,但是使用 EnumMap 会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值。这使得 EnumMap 的效率非常高。
主要接口:
size - 返回键值对数
containsValue - 是否存在指定的 value
containsKey - 是否存在指定的 key
get - 根据指定 key 获取 value
put - 取出指定的键值对
remove - 删除指定 key
putAll - 批量取出键值对
clear - 清除数据
keySet - 获取 key 集合
values - 返回所有
JAVA控制语句
·选择语句
if, else-if, else
switch
·循环语句
while
do…while
for
foreach
·中断语句
break
continue
return
JAVA异常
Throwable 是 Java 语言中所有错误(Error)和异常(Exception)的超类
Error 表示正常情况下,不大可能出现的严重问题。编译器不会检查 Error
Exception 是 Throwable 的一个子类。Exception 表示合理的应用程序可能想要捕获的条件。
RuntimeException 是 Exception 的一个子类。RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
编译器不会检查RuntimeException 异常。当程序中可能出现这类异常时,倘若既没有通过 throws 声明抛出它,也没有用 try catch 语句捕获它,程序还是会编译通过。
自定义异常
try - try 语句用于监听。将要被监听的代码(可能抛出异常的代码)放在 try 语句块之内,当 try 语句块内发生异常时,异常就被抛出。
catch - catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
finally - finally 语句块总是会被执行,无论是否出现异常。
try、catch、finally 三个代码块中的局部变量不可共享使用。
catch 块尝试捕获异常时,是按照 catch 块的声明顺序从上往下寻找的,一旦匹配,就不会再向下执行。
如果 Java 程序只有一个线程,那么没有被任何代码处理的异常会导致程序终止。如果 Java 程序是多线程的,那么没有被任何代码处理的异常仅仅会导致异常所在的线程结束。