java面试题(IO、集合)

io流
什么是IO

以流为基础进行数据的输入输出,所有数据被串行化

io流的分类?

流向:

输入流:从文件读出到内存,只能进行读操作

输出流:从内存读出到文件,只能进行写操作

操作单元:

字符流:以字符为单位,每次读入或读出16位数据,只能读取字符类型数据

字节流:以字节为单位,每次读入或读出8位数据,可以读取任何类型数据

角色:

节点流:直接与数据源想相连,读入或读出

处理流:也叫包装流,对已存在的流进行包装

InputStream(字节输入流):从文件中读取数据(字节)到内存中

OutputStream(字节输出流):将内存中的数据(字节)写入文件中

Reader(字符输入流):从文件中读取数据(字符)到内存中

Writer(字符输出流):将内存中的数据(字符)写入文件中

BIO、NIO、AIO的区别?

BIO:同步阻塞式IO(传统IO),面对百万级连接时并发性不好

NIO:同步非阻塞式IO,基于通道和缓冲区,实现了IO的多路复用,减少对cpu的消耗

AIO:异步非阻塞式IO,并发性好,基于事件和回调机制

字节流如何转化为字符流

字节输入流转字符输入流通过 InputStreamReader 实现

字节输出流转字符输出流通过 OutputStreamWriter 实现

字节流与字符流如何选择
  1. 大多数情况下使用字节流,因为字节流是字符流的包装,绝大多数IO都是直接操作磁盘文件的

b. 如果需要频繁处理字符串,选择字符流,具有缓冲区

什么是缓冲区?有什么作用?

一段特殊的内存区域,当频繁操作一个资源时性能降低,为了提升性能可以将一部分数据暂时写到缓存区。

字符流都是在缓冲区进行操作的。

什么是对象序列化?什么是反序列化?

对象序列化:将对象以二进制的形式保存在硬盘上

反序列化:将二进制的文件转化为对象读取

如何克隆对象

重写Object的clone方法

通过序列化和反序列化克隆

集合
什么是集合?集合的特点?有什么好处?

集合是存储数据的容器;

特点:

  1. 用于存储数据

  1. 集合不固定长度

好处:

  1. 容量自增长

  1. 可以方便的扩展或改写集合

  1. 学习成本低

  1. 高性能的数据结构算法,提高响应速度与质量

集合和数组的区别?
  1. 数组固定长度,集合不固定

  1. 数组可以存储基础数据类型和引用数据类型,集合只能存储引用数据类型

  1. 数组存储必须是同一数据类型,集合可以存储不同数据类型

为什么要使用集合?

当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端,因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用来存储多个数据的;但是集合提高了数据存储的灵活性,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的优缺点
  1. 底层数组,查找速度快

  1. 顺序添加元素快

  1. 删除元素耗费性能

  1. 插入元素,耗费性能

ArrayList的扩容机制

使用ArrayList()创建ArrayList对象时,不会定义底层数组的长度,当第一次调用add(E e) 方法时,初始化定义底层数组的长度为10,之后调用add(E e)时,如果需要扩容,则调用grow(int minCapacity) 进行扩容,长度为原来的1.5倍

ArrayList、LinkedList的区别
  1. ArrayList底层为数组;LinkedList底层为链表

  1. LinkedList在添加和删除元素时具有比ArrayList更好的性能;

  1. 查询时ArrayList优于LinkedList

List和Set的区别
  1. 都继承同一个接口

  1. List:有序,元素可以重复,可以插入多个null元素;Set:无序,元素不能重复,可以存储一个null元素

  1. Set查询效率低,增删效率高;List查询效率高,增删效率低

HashSet如何保证数据不重复

新增元素时,判断元素是否存在的依据,不仅需要比较hashCode值,还要结合equles比较;判断key是否存在,如果存在就用新的值覆盖旧的值,并返回旧的值。

HashMap的jdk1.7和jdk1.8中有什么不同?

JDK1.8之前HashMap由数组+链表组成;之后由数组+链表+红黑树组成;

hashMap扩容机制

1.7:创建一个新的空数组,长度为原来的两倍;遍历原数组每个位置上的链表的元素,获取元素下标,插入到新数组中; 

1.8:创建一个新的空数组,遍历老数组每个位置上的链表或红黑树;如果是链表直接计算下标,并添加到新数组中;如果是红黑树,则先遍历红黑树,将红黑树中每个元素在新数组中的下标位置,插入到新数组中;

hashMap、hashTable的区别
  1. hashMap:非线程安全,hashTable:线程安全(内部方法synchronized修饰)

  1. hashMap效率高于hashTable

  1. hashMap键值对允许有空值,hashTable不允许

  1. hashMap默认大小为16,增长方式为2的指数倍;hashTable默认大小为11,增长方式为旧的两倍+1

  1. TreeMap默认升序排列

Collection和Collections的区别
  1. Collection是一个集合接口;Collections是一个包装类

  1. Collection提供了对集合对象进行基本操作的通用接口方法;Collections包含有关集合的静态多态方法

  1. Collections服务于Collection框架

  1. Collection包含List、Set、Map等接口;Collections包含反转、拷贝、替换等方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值