io流
什么是IO
以流为基础进行数据的输入输出,所有数据被串行化
io流的分类?
流向:
输入流:从文件读出到内存,只能进行读操作
输出流:从内存读出到文件,只能进行写操作
操作单元:
字符流:以字符为单位,每次读入或读出16位数据,只能读取字符类型数据
字节流:以字节为单位,每次读入或读出8位数据,可以读取任何类型数据
角色:
节点流:直接与数据源想相连,读入或读出
处理流:也叫包装流,对已存在的流进行包装
InputStream(字节输入流):从文件中读取数据(字节)到内存中
OutputStream(字节输出流):将内存中的数据(字节)写入文件中
Reader(字符输入流):从文件中读取数据(字符)到内存中
Writer(字符输出流):将内存中的数据(字符)写入文件中
BIO、NIO、AIO的区别?
BIO:同步阻塞式IO(传统IO),面对百万级连接时并发性不好
NIO:同步非阻塞式IO,基于通道和缓冲区,实现了IO的多路复用,减少对cpu的消耗
AIO:异步非阻塞式IO,并发性好,基于事件和回调机制
字节流如何转化为字符流
字节输入流转字符输入流通过 InputStreamReader 实现
字节输出流转字符输出流通过 OutputStreamWriter 实现
字节流与字符流如何选择
大多数情况下使用字节流,因为字节流是字符流的包装,绝大多数IO都是直接操作磁盘文件的
b. 如果需要频繁处理字符串,选择字符流,具有缓冲区
什么是缓冲区?有什么作用?
一段特殊的内存区域,当频繁操作一个资源时性能降低,为了提升性能可以将一部分数据暂时写到缓存区。
字符流都是在缓冲区进行操作的。
什么是对象序列化?什么是反序列化?
对象序列化:将对象以二进制的形式保存在硬盘上
反序列化:将二进制的文件转化为对象读取
如何克隆对象
重写Object的clone方法
通过序列化和反序列化克隆
集合
什么是集合?集合的特点?有什么好处?
集合是存储数据的容器;
特点:
用于存储数据
集合不固定长度
好处:
容量自增长
可以方便的扩展或改写集合
学习成本低
高性能的数据结构算法,提高响应速度与质量
集合和数组的区别?
数组固定长度,集合不固定
数组可以存储基础数据类型和引用数据类型,集合只能存储引用数据类型
数组存储必须是同一数据类型,集合可以存储不同数据类型
为什么要使用集合?
当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端,因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用来存储多个数据的;但是集合提高了数据存储的灵活性,Java集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据
如何选用集合?
首选根据特点来选择,需要根据键值获取元素,选用Map,只需要存放数据选用List或Set;
Map:
需要排序选择TreeMap;不需要排序选择HashMap;线程安全选择ConcurrentHashMap;
Collection:
保证元素唯一时选择实现 Set;不需要选择List;
主要的常用的集合类有哪些?
Map:hashMap、TreeMap、HashTable、LinkedHashMap
List:ArrayList、LinkedList、Vector
Set:HashSet、TreeSet、LinkedHashSet
List、Map、Set有什么区别?
List:有序,元素可以重复,可以插入多个null元素
Map:键值对集合,key:无序、唯一,value:允许重复;每个键只能映射到一个值
Set:无序,元素不能重复,可以存储一个null元素
集合框架底层数据结构
List:
ArrayList:数组
LinkedList:双向链表
Vector:数组
Set:
HashSet:hashMap
TreeSet:红黑树
LinkedHashSet:hashMap
Map:
hashMap: JDK1.8之前HashMap由数组+链表组成;之后由数组+链表+红黑树组成
TreeMap:红黑树
HashTable:数组+链表
LinkedHashMap:数组+链表
迭代器Iterator是什么?有什么特点?
Iterator接口提供了遍历任何集合的接口
特点:单向遍历,安全
ArrayList的优缺点
底层数组,查找速度快
顺序添加元素快
删除元素耗费性能
插入元素,耗费性能
ArrayList的扩容机制
使用ArrayList()创建ArrayList对象时,不会定义底层数组的长度,当第一次调用add(E e) 方法时,初始化定义底层数组的长度为10,之后调用add(E e)时,如果需要扩容,则调用grow(int minCapacity) 进行扩容,长度为原来的1.5倍
ArrayList、LinkedList的区别
ArrayList底层为数组;LinkedList底层为链表
LinkedList在添加和删除元素时具有比ArrayList更好的性能;
查询时ArrayList优于LinkedList
List和Set的区别
都继承同一个接口
List:有序,元素可以重复,可以插入多个null元素;Set:无序,元素不能重复,可以存储一个null元素
Set查询效率低,增删效率高;List查询效率高,增删效率低
HashSet如何保证数据不重复
新增元素时,判断元素是否存在的依据,不仅需要比较hashCode值,还要结合equles比较;判断key是否存在,如果存在就用新的值覆盖旧的值,并返回旧的值。
HashMap的jdk1.7和jdk1.8中有什么不同?
JDK1.8之前HashMap由数组+链表组成;之后由数组+链表+红黑树组成;
hashMap扩容机制
1.7:创建一个新的空数组,长度为原来的两倍;遍历原数组每个位置上的链表的元素,获取元素下标,插入到新数组中;
1.8:创建一个新的空数组,遍历老数组每个位置上的链表或红黑树;如果是链表直接计算下标,并添加到新数组中;如果是红黑树,则先遍历红黑树,将红黑树中每个元素在新数组中的下标位置,插入到新数组中;
hashMap、hashTable的区别
hashMap:非线程安全,hashTable:线程安全(内部方法synchronized修饰)
hashMap效率高于hashTable
hashMap键值对允许有空值,hashTable不允许
hashMap默认大小为16,增长方式为2的指数倍;hashTable默认大小为11,增长方式为旧的两倍+1
TreeMap默认升序排列
Collection和Collections的区别
Collection是一个集合接口;Collections是一个包装类
Collection提供了对集合对象进行基本操作的通用接口方法;Collections包含有关集合的静态多态方法
Collections服务于Collection框架
Collection包含List、Set、Map等接口;Collections包含反转、拷贝、替换等方法