throw和throws的区别:
1.throw代表动作,表示抛出一个异常的动作;throws代表一种状态,代表方法可能有异常抛出
2.throw用在方法实现中,而throws用在方法声明中
3.throw只能用于抛出一种异常,而throws可以抛出多个异常final finally finalize的区别(以问到)
final:java中的关键字,修饰符。
A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为abstract抽象类的和final的类。
B).如果将变量或者方法声明为final,可以保证它们在使用中不被改变.
1)被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
2)被声明final的方法只能使用,不能重载,重写。
finally:java的一种异常处理机制。
finally是对Java异常处理模型的补充。finally结构使代码总会执行,而不管无异常发生。使用finally可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。
finalize:Java.lang.Object类中的一个方法名。
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。try-catch-finally哪部分可以省略
catch 和 finally可以省略一个,不能两个都省略。try-catch-finally 如果catch中有return finally还会执行吗。
会的,因为finally是一定会执行的语句,所以return会在finally之后执行。
finally中的return会覆盖catch中的return的值也会覆盖try中return的值。常见的异常类有哪些?
NullPointerException 当应用程序试图访问空对象时,则抛出该异常。
ClasscastException 两个类型间转换不兼容时引发的运行时异常。
SQLException 提供关于数据库访问错误或其他错误信息的异常。
IOException当发生某种I/O异常时,抛出此异常。
IndexOfBoundsException 索引越界异常。简单工厂模式和抽象工厂有什么区别?
“简单工厂模式”使用fw模式建立对象;“
抽象工厂模式”则使用迭代模式创建对象。
接口数量不同。“简单工厂模式”只有一个接口。
抽象工厂模式理论上具有无限个接口。
简单模式比较适用于小项目forward和Redirect(转发和重定向有什么区别)(以问到)
forward(转发):是服务器行为,只需要一次请求,效率高,一般用于用户登录场景。属于同一请求下,所以可以使用request域下的数据。
Redirect(重定向属于):是客户端行为,url第一次请求时response返回一个新的url在客户端再次请求,一般用于页面跳转。转发不行。java中都有哪些容器
数组,String,集合容器Collections和Collection有什么区别?(以问到)
Collection是单列集合的接口。
Collections是一个包装类,不能被实例化,其中有很多集合操作的静态方法。List、Set、Map之间的区别 (以问到)
List是单列有序集合的接口,有三个主要实现类:
ArrayList:成员可以重复,因为底层是用数组实现的,内存空间分配是连续的,查询效率高,线程是不安全的。允许有null。
Linkedlist:是用双向链表实现,内存空间分配分散,但是插入操作效率高,线程也是不安全的。允许有null。
Vector:是用数组实现的,但是查询操作比ArrayList的效率低,是线程安全的,一般不考虑线程问题,用ArrayList。
Set是单列无序集合的接口:
其中HashSet:不允许有null 和重复的元素,并且是无序的,线程不安全。
Map是双列集合的接口:
其中:
HashMap:每一个元素对应这键和值,并且允许null值和null键,但是无序的。HashMap和HashTable的区别:(感觉每次都会被问,高频考点)
首先两者继承的父类不同,HashMap继承AbstractMap类,HashTable继承与Dictionary,但又都同时实现了Map接口。
二者的线程安全不同,HashMap适用于单线程(多线程要用currentHashMap处理),是非线程安全的,HashTable单线程,多线程都可用,并且是线程安全的。
HashMap没有contains方法只有containsKey和containsValue,HashTable三者都有。
HashMap的初始容量是16,每次扩容为当前容量的2倍;HashTable的初始容量为11,每次扩容为当前容量的2倍+1;如何决定使用HashMap和HashTree?
因为HashTree的key要求实现comparable,并默认按升序排序,所以如果你想要一个有序的结果,选择HashTree,但是HashMap又更高的效率,所以一般使用HashMap。
四种会话跟踪技术:
- 线程的声明周期:
新建,就绪,运行,阻塞,销毁 - 线程池的五种状态:(以问)
Running、ShutDown、Stop、Tidying、Terminated。
Spring Ioc Aop: (高频aop)
- Ioc: 控制反转 , 控制是创建对象和对对象的管理, 反转是将创建对象和管理交给容器,我们只需要调用。(spring容器默认调用对象的无参构造)
- Aop:面向切面编程,底层是动态代理,我们只需要着重于找出切面,切面执行的时间和执行的地点,作用是:解耦合,业务增强,代码复用提高,专注于代码逻辑,使业务和非业务功能分离。
[Spring aop知点]https://www.jianshu.com/p/c15382863eea
mybatis如何防止sql注入?
框架底层,是JDBC中的PreparedStatement类在起作用,我们使用#{}作为标识符,可以防止注入
-
PreparedStatement:
Minor GC 和 Full GC
Minor GC : 回收新生代,因为新生代对象存活时间很短,因此Minor GC会频繁执行, 执行的速度一般也会比较。
Full GC: 回收老年代和新生代,老年代对象其存活时间长,因此Full GC很少执行, 执行速度会比Minor GC慢很多。
- 什么是新生代和老生代
- 新生代(New Generation)
大多数情况下Java程序中新建的对象都从新生代分配内存。 - 老年代(Old Generation或Tenuring Generation)
用于存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象,新建的对象也有可能在老年代上直接分配内存。主要有两种状况(由不同的GC实现来决定):一种为大对象,可通过在启动参数上设置-XX:PretenureSizeThreshold=1024(单位为字节,默认值为0)来代表当对象超过多大时就不在新生代分配,而是直接在老年代分配,此参数在新生代采用Parallel Scavenge GC时无效,Parallel Scavenge GC会根据运行状况决定什么对象直接在老年代上分配内存;另一种为大的数组对象,且数组中无引用外部对象。
sql
- UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)(结果集的并集)
- UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
使用形式如下:
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称; - 内连接和外连接
1、内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
servlet是否是线程安全的,怎么解决?
Servlet是线程不安全的。Servlet体系是建立在java多线程的基础之上的,它的生命周期是由Tomcat 来维护的。当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet,当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。
虽然servlet是单例模式,只有一个对象,但是依然有线程安全问题。解决办法:
- 尽量把成员变量变成局部变量。
- 给servlet对象加锁,synchronized
- 实现SingleThreadModel接口。
实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet实例,即为每个用户创建一个实例,这将导致严重的性能问题。
实现了SingleThreadModel接口的servlet并不能保证是线程安全的,该接口并不能防止servlet访问共享资源造成的同步问题。
但是在分布式环境中可以创建多个servlet. 目前此接口已被弃用。
MyISAM与InnoDB最大的不同的是:MyISAM不支持事务,而InnoDB支持事务
具体的不同在于:
MyISAM:
1)不支持事务和外键
2)极度强调读取速度(这方面性能高)
3)不支持崩溃后灾难恢复
4)使用的锁是表锁
InnoDB:
1)实现了ACID的事务特性,并且如果开启了事务,隔离级别默认是可重复读,同时支持外键
2)写速度(百万级别的数据)远远慢于MyISAM,读的速度也不是很快,虽然速度慢,但是增删有事务不错,慢点可以接受
3)通过bin-log 进行灾难恢复和做数据库主从
4)在说明范围的情况下可以使用行锁
如何选择
默认Innodb
MyISAM:以读为主的应⽤程序,⽐如博客系统、新闻⻔户⽹站
Innodb:更新(删除)操作频率也⾼,或者要保证数据的完整性;并发量⾼,⽀持事务和外键保证数据完整性。⽐如OA⾃动化办公系统。
避免死锁(银行家算法):
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
检测死锁
首先为每个进程和每个资源指定一个唯一的号码; 然后建立资源分配表和进程等待表,
解除死锁
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
避免一个线程同时获取多个锁 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
1.因竞争资源发生死锁 现象:系统中供多个进程共享的资源的数目不足以满足全部进程的需要时,就会引起对诸资源的竞争而发生死锁现象
2.进程推进顺序不当发生死锁
- volatile
我的理解是,被volatile修饰的共享变量,就会具有以下两个特性:
保证了不同线程对该变量操作的内存可见性(一旦更改立即刷新到主存上)。此外还有线程的工作内存。
禁止指令重排序。