JAVASE--集合、I/O流

一、集合

JAVASE--集合、I/O流_第1张图片

集合的出现是为了存储个数不确定的数据,与数组相比集合的长度是可变的,集合存储的都是对象,而且集合内对象的类型可以不一致。

集合框架的最顶层是Collection接口,该Collection接口中的2个子接口:List和Set,List可存放重复有序的元素,Set不可存放重复元素且无序。

实现List接口的子类:Vector(可增长的数组结构,同步,效率非常低,已被ArrayList替代)、ArrayList(不同步的数组结构,长度是可变的【原理是创建新数组+复制数组】,查询速度很快,增删较慢)、LinkedList(链表结构,不同步,增删速度很快,查询速度较慢)。

实现Set接口的子类:HashSet(哈希表结构,不同步,保证元素唯一性的方式依赖于:hashCode(),equals()方法,查询速度快)、TreeSet(可以对Set集合中的元素进行排序,使用的是二叉树结构)。

取出Set集合元素只有采用迭代器的方式,通过iterator方法获取容器的迭代器对象。集合对象实现元素自然排序,是因为实现了Comparable接口的compareTo方法,当元素自身不具备自然排序,或具备的自然排序不是所需要时采用比较器排序方式(在创建TreeSet集合时,在构造函数中指定具体的比较方式,需要定义一个类实现Comparator接口,重写compare方法)。

1.1 泛型

         对于不确定的对象类型,可以通过Object类型多态方式解决,但对象提升为Object后需要向下转型才能使用对象的内容,而转型会有运行发生ClassCastException异常的风险。泛型的出现解决了上面的问题,通过传递参数的形式确定对象类型,将运行时期的ClassCastException异常转移到编译时期通过编译失败体现,也避免了强制转换的麻烦。

当使用了带有泛型的类时,需要传递具体类型实参时,无法明确要传递的实参,可以用通配符(?)表示;如果要操作的对象的类型是在一个范围之内,比如只操作Person或者Person的子类型对象时,这时可以使用泛型的限定,对要操作的类型进行限制,提高程序类型操作的安全性。

为了解决集合的更多需求。集合框架提供了Collections(操作集合)和Arrays(操作数组)两个工具类,方法都是静态的。数组转成集合:Arrays.asList();集合转成数组:Collection接口中的toArray();

1.2 Map

Collection集合每次存储的是一个元素,而Map集合是将两个有对应关系的元素一次存储,即Map集合内部存储的是键key值value对,必须保证键的唯一性。

二、I/O流

输入输出流技术是为了把内存中的数据持久化到硬盘中,在硬盘和内存等设备之间进行读写操作,输入方向是指读数据,输出方向是指写数据。

当某方法被重复使用,而且重复使用之前的运算结果作为参数传递到方法调用时使用递归,递归的使用必须加入判断条件,即控制递归次数,避免栈内存溢出。

Java中的I/O流对象诸多,对解决问题时使用对象有以下的总结:1.分析明确问题中的数据源和数据目的,对数据源的字节数据操作使用InputStream对象,字符操作使用Reader对象,对目的数据的字节操作使用OutputStream对象,字符操作使用Writer对象;2.明确数据所在的具体设备,操作源设备在硬盘中的文件使用File开头的对象,源设备在内存中使用相应的数组和字符串,源设备的键盘输入为System.in,源设备在网络中使用Socket,目的设备和源设备使用情况相同;3.判断需求是否需要额外的功能,转换流:InputStreamReader、OutputStreamWriter,缓冲区对象BufferedXXX的使用提高效率,序列流对象SequenceInputStream,对象序列化使用ObjectInputStream、ObjectOutputStream,当需要操作基本类型数据保证字节原样性时使用DataOutputStream和DataInputStream对象。

切割文件的原理是:一个源对应多个目的,文件切割方式分为固定大小及固定份数两种。配置信息文件用于记录源文件的类型及切割碎片的个数,在Java中使用Properties对象来建立配置文件,其常用方法load和store用于读和写。

合并文件的原理:多个源对应一个目的,每一个碎片对应一个输入流,多个输入流对象先要进行集合存储,SequenceInputStream对象用于将多个源合并成一个源,读取配置文件信息,并加入健壮性的判断。

当要把某对象持久化存储则使用对象的序列化,对象的序列化保存的是对象的相关值信息,对象的创建还需调用class编译文件。对象需要实现Serializable接口才能启动序列化功能,通过ObjectOutputStream来写入序列化的对象,使用ObjectInputStream 读取(重构)对象,读取序列化的对象的过程也成为反序列化。序列化对象时强烈建议显示声明序列号,private static final long serialVersionUID = 1L;

对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值,静态的数据不会被序列化,非静态的数据想要不被序列化可以用transient(瞬态)关键字修饰。

你可能感兴趣的:(JavaSE)