四 集合
1 常见的数据结构?
栈:先进后出
队列:先进先出
数组:查询快,增删慢
链表:查询慢,增删快
2 List的子类特点?
①ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高
②Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低
③LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高
3 ConcurrentModificationException的原因以及修改方案?
原因:在迭代器进行遍历的时候,集合修改了元素。因为迭代器是依赖于集合的,当集合修改了元素的时候,迭代器并不知道,所以产生异常
修改方案:迭代器进行遍历,列表迭代器修改;集合使用普通for循环遍历,集合set方法修改
4 什么是泛型?好处?
泛型是一种将明确类型的工作推迟到创建对象或者调用方法的时候的特殊类型
好处:
①将运行时期的问题提前到了编译时期
②避免了强制类型的转换
③解决了黄色警告线,优化了代码
5 List和Set的区别?
①List的元素是可以重复且有序的,它有两个主要实现类,分别是ArrayList和LinkedList
②Set的元素是唯一且无序的,它有两个主要实现类,分别是HashSet和TreeSet
这里的有序指的是元素存放和取出的顺序一致
6 Map集合与Collection的区别?
Map是双列集合的父接口,它的实现类中的元素都是以键值对的形式出现的,其对元素的操作都是针对键元素的,键不可以重复而值可以
Conllection是单列集合的父接口,它的实现类中的元素有重复的、唯一的、有序的、无序的
7 Collection和Collections的区别?
Collection是单列集合的顶层接口
Collections是针对集合进行操作的工具类
8 TreeSet有几种排序方式?
①自然排序:使用他的无参构造器进行实例化并让存放元素所属的类去实现comparable接口然后重写compareTo方法
②比较器排序:存放元素所属的类去实现comparator接口并重写接口的compare方法
9 Comparable和Comparator的区别?
① 要让TreeSet/TreeMap集合中的元素自身具备比较性,需要元素的实例类实现Comparable接口,重写其compareTo方法。
②要让TreeSet/TreeMap集合自身具备比较性,需要定义一个实现了Comparator接口的类(比较器),重写其compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
10 集合和数组的区别?
它们都可以存储元素
集合可以存储不同类型的元素,长度可变,但是只能存储引用类型
数组可以存储引用类型也可以存储基本类型,但是只能存储同种类型,长度固定
11 Map的两种取出方式?
①通过键取值:使用keySet方法将Map集合所有的键元素添加到Set集合,然后遍历Set集合,通过get(key)的方法获取值
②通过键值对:使用entrySet方法将Map集合的所有键值对元素添加到Set集合,然后遍历Set集合,通过getKey以及getValue的方法获取键元素和值元素
12 HashMap和Hashtable的区别?
HashMap线程不安全,效率低,允许null键和null值
Hashtable线程安全,效率高,不允许null键和null值
13 高级for和普通for的区别?
高级for的底层是迭代器,无法修改元素,必须知道遍历的方向;普通for必须有循环的次数
14 Entry就是Map接口中的内部接口,为什么要定义在map内部呢?
entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。
五 IO流
0 close和flush的区别?
close是指先刷新缓冲区,再关闭流。
1.让流变成垃圾这样就可以被系统回收2.通知系统去释放该文件相关的资源
fulsh仅仅只刷新缓冲区,流对象可以继续使用
1 字节流和字符流的区别?
①字节流处理单元是1个字节,操作数据类型为字节和字节数组。字节流可以用于读写所有二进制流对象,但不能直接处理Unicode。
②字符流处理单元是2个字节的Unicode字符,分别操作字符、字符数组或字符串。字符流一般只用来读写txt文件、java文件等。
2 什么是转换流?
java提供将字节流转化为字符流读写方式的转换流OutputStreamWriter和InputStreamReader
3 什么是打印流?
打印流是输出流的一种,包括字节打印流(PrintStream)和字符打印流(PrintWriter),在整个IO流中,打印流是输出信息最方便的流,可以打印任何的数据类型,
启动自动刷新并调用println、printf、format方法时,可以自动刷新、自动换行。
4 什么是异常?分类?
程序出现不正常情况
编译期问题:必须处理,如果不处理程序则不能运行
运行期问题:是指我们代码不够严谨,可以不处理,但是程序运行会出问题
5 throw和throws的区别?
①throw在方法体中,后面跟的是异常对象名,并且只能是一个。抛出的是一个异常对象,说明这里肯定会有一个异常产生
②throws在方法上声明,后面跟的是异常的类名,可以是多个。throws是声明方法有异常,是一种可能性,表么这个异常并不一定会产生
6 final、finally、finalize的区别?
①final是最终得意思,它修饰的类不能被继承(String/StringBuffer/StringBuilder),它修饰的方法不能被重写,它修饰的变量是个常量
②finally是异常处理的一部分,用于释放资源。finally里面的代码一定会执行,但是特殊情况除外,这种情况就是在执行到finally的时候,JVM退出了(System.exit(0))
③finalize是Object类的方法,用于垃圾回收
7 递归的注意事项?
①递归一定要有出口,否则就是死递归
②递归的次数不能太多,否则内存溢出
③构造方法不能递归使用
8 列举几个运行期的异常?
ClassCaseException
ArrayIndexOutOfBoundsException
NullPointerException
ArithmeticException
六 多线程
1 什么是进程?
正在运行的程序,是系统进行资源分配和调动的独立单位,有自己的内存空间和系统资源
2 什么是多进程?
一个时间段执行多个进程,提高CPU的使用率
3 什么是线程?
是程序的执行单元,执行路径,依赖于进程存在,是程序使用CPU的最基本单位。线程的执行有随机性(线程在做高速切换)。一个进程如果执行一条执行路径,
则称为单线程程序,如果执行多条执行路径,则称为多线程程序。
4 什么是多线程?
一个进程如果执行多条执行路径,则称为多线程程序。
多线程的存在,不是为了提高程序的执行速度,其实是为了提高应用程序的使用率。如果一个进程的线程比较多,就会有更高的几率抢到CPU的执行权,
5 创建线程的两种方法?
① 继承Thread类,重写run()方法,创建对象,启动线程
② 实现接口Runnable,重写run()方法,创建对象作为参数,创建Thread对象
6 为什么还要有实现接口的方式?
① 避免了单继承的局限性
② 实现接口的方式只创建了一个资源对象,更好的实现了数据和操作的分离,较好的体现了面向对象的思想
一般我们选择第二种方式
7 线程的生命周期?
创建:start
就绪:具备执行资格,不具备执行权
运行:具备执行资格,具备执行权
阻塞:由于一些操作让线程处于该状态。没有执行资格,没有执行权,而另一些操作可以把它激活,之后处于就绪状态
死亡:线程对象变成垃圾,等待被回收
8 什么是线程睡觉?
指线程暂停执行
9 锁对象的问题?
同步代码块:任意(一般使用,因为被同步的代码越少越好)
静态的锁对象:类的字节码文件
同步关键字加在方法上:this
10 如何卖出负票?如何卖出相同的票?(线程的延时性和随机性)
11 产生线程安全问题的原因?(同步的前提)?
①是否是多线程环境(但是我认为第一条不绝对,比如我只开启了一个start,但是这个start加上主函数的线程,那也是多线程环境)
②是否有共享数据
③是否有多条语句操作共享数据
如果是嵌套同步,容易产生死锁
12 什么是死锁?
两个或两个以上的线程在争夺资源的过程中,出现的一种相互等待的现象
13 线程组?
默认情况下,所有的线程都属于main的线程组
14 为什么wait()、notify()、notifyAll()方法都定义在Object方法中?
这些方法的调用必须通过锁对象调用,而我们使用的锁对象是任意锁对象。所以,这些方法必须定义在Object类中
|
|