2019.08.14网易一面
2019.08.14网易 30分钟
上来就是自我介绍和实习项目
1.说一下Collection
Collection即单列集合。统一定义了一套单列集合的接口
他重写了Iterator接口的iterator方法(Iterable接口可以看成许多容器类共同特性被提取出来做了接口。而相对于不同容器,这个共有特性的具体实现细节又不同。既然不同所以又要自己定义自己系列的迭代器规则,并让所有实现类都遵循这个规则。)、Object类的equals和hashCode方法、定义一系列待实现方法
实现:List:无序、不唯一
ArrayList:数组 线程不同步、不安全、查询快、增删慢
Vector:数组 线程同步、安全、查询慢(因为线程同步,变慢了)、增删慢
LinkedList:链表 线程不同步、不安全、增删快、查询慢
Set:有序(存储顺序与添加顺序同)、唯一
HashSet:哈希表 TreeSet:二叉树 LinkedHashSet
参考:https://blog.csdn.net/jyg0723/article/details/80498840
2.HashMap和TreeMap差别
HashMap是基于Hash表的结构,根据键的hashCode存储数据,TreeMap是基于红黑二叉树的结构
HashMap是无序的,TreeMap实现了SortMap<K,V>接口,对key进行了排序
HashMap允许有空键和空值,TreeMap不允许有空键和空值
3.iterator迭代器有add方法吗,为什么?
如果想用add方法是想要在迭代中添加元素,对于有序集合(ArrayList)来说,在此元素后面新增一个元素很简单,但是对于无序集合(HashSet),不能保证新插入元素一定在此元素的后面,还需计算hash值,这样就违背了add的本意。再者,一般用iterator通常是在遍历的场景下,很少使用add方法。
4.最优二叉树遍历方式
前序遍历:根节点----前序遍历左子树----前序遍历右子树
中序遍历:中序遍历左子树----根节点----中序遍历右子树
后序遍历:后序遍历左子树----后序遍历右子树----根节点
5.数据库索引、如何建立、分类、项目中应用(我说没有用过,哭)
索引是对数据库表中一个或多个列的值进行排序的结构
优点:大大加快数据的检索速度、创建唯一性索引,保证数据库表中每一行数据的唯一性、加速表和表之间的联系、在使用分组和排序字句进行数据检索时,可以加快。
缺点:索引需要占用数据库表意外的物理存储空键、创建索引和维护索引需要花费一定的时间、当对表进行更新操作时,索引需要呗重建。
分类:唯一索引:UNIQUE
主键索引:PRIMARY KEY
聚集索引:CLUSTER
实现方式:B+树(Oracle默认索引)
散列索引:根据对应键的散列码来找到最终的索引项的技术
位图索引:针对多个字段的简单查询设计的一种特殊的索引
总结:B+树最常用,性能也不差,用于范围查询和单值查询,特别是范围查询,只能用B+树。
HASH针对单值查询会比B+树快一些。但是Oracle不支持HASH索引,只支持HASH表空间。位图适用于值的类型
很小并且需要复合查询的情况。
6.ABC表建立组合索引,现在想查where A and C 能用吗?
查询时使用联合索引的一个字段,如果这个字段在组合索引中所有字段的第一个,那就会用到索引。
7.IO流分类:IO流中用到了很多设计模式,说一个
适配器模式:FileInputStream是字节流,而并没有字符流读取字符的一些api,因此通过InputStreamReader将其转换为Reader子类,因此有了可以操作文本的文件方法。
FileInputStream fileInput = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(fileInput);
装饰者模式:为了构造缓冲字符流,将FileInputStream字节流包装为BufferedReader过程就是装饰的过程。
BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
8.并发:synchronized作用范围
Java 中的 synchronized 关键字可以在多线程环境下用来作为线程安全的同步锁。
一、可以在某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其他线程不能同时访问这个对象中任何一个synchronized方法)不同的对象实例的synchronized方法是不相干扰的。这个时候,锁就是这个方法所在的对象。。
二、某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法,他可以对类的所有对象实例起作用。此时锁就是这个class。
三、还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/区块/},锁就是这个方法所在的对象 ;
参考:https://uule.iteye.com/blog/1104562
9.进程死锁的前提
一、互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占用该资源的进程使用完成后释放该资源。
二、请求和剥夺条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但又对自己获得的资源保持不放。
三、不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完成之后自己释放。
四、环路等待条件:是指进程发生死锁后,必然存在一个进程--资源之间的环形链
处理死锁的方法:预防死锁、避免死锁、检测死锁、解除死锁
10.Exception与error的差别 Exception的分类 NullpointerException属于什么
错误一般来说,最常见的错误有程序进入死循环、内存泄漏等,在这种情况下,程序运行时本身无法解决,只能通过其他程序干预,Error类对象有Java虚拟机生成并抛弃。
异常是程序执行时遇到的非正常情况或者意外行为,常见的有数组下标越界、算法溢出、除数为0、无效参数、内存溢出等。这种情况程序本身可以解决,有异常代码调整程序运行方向,可使程序继续运行,直至正常结束。Java提供了两类主要的异常:runtime exception和checked exception。运行时异常代表运行时由Java虚拟机生成的异常,原因是编译错误。
两者的区别:
Exception:可以是可被控制或不可控制、表示一个由程序员导致的错误、应该在应用程序级被处理
Error:总是不可以控制的、经常用来表示系统错误或低层资源的错误、如果可能的话,应该在系统级被捕捉。
参考:https://blog.csdn.net/u011046058/article/details/47129657
11.运行时异常与一般异常的区别
一般异常:(checked exception)比如IO异常,SQL异常。对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。
运行时异常( runtime exception ):我们可以不处理。当出现这样的异常时,总是由虚拟机接管。
12.try-catch-finally中return
1、不管有没有异常,finally中的代码都会执行
2、当try、catch中有return时,finally中的代码依然会继续执行
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
13.序列化相关
序列化:把对象转换为字节序列的过程称为对象的序列化
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;当你想用套接字在网络上传送对象的时候;当你想通过RMI传输对象的时候;我们会想到数据库,也可以用序列化。
如何实现:实现Serializable接口、transient 修饰的属性,是不会被序列化的、静态属性不序列化。
// ObjectOutputStream 对象输出流,将 自己创建对象存储到E盘的文件中,完成对新建对象的序列化操作 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("文件的位置"))); oos.writeObject("new的对象"); oos.close(); //反序列化 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("上面那个位置"))); FlyPig person = (FlyPig) ois.readObject();//当初存储的对象是什么就是什么
ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可多参数制定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流读取字节序列,再把他们反序列化为一个对象,并将其返回
在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值,要是不写,在后面扩展的时候,可能就会出现不认识就数据的问题。
14.事务 spring中的事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。数据库事务 transanction 正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。Spring事务管理器的接口是PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了