面试的基本问题:
- HTTP状态码的含义?
- 你对MVC的理解?
- 除了在集合中,还有那些地方用到了泛型?
- 说说HashMap和HashTable那个是线程安全的?
- 说说你对事务的理解?
- HTTP数据包的内容?
- Session和Cookie的区别?
- ArrayList和LinkesList的区别
- 你对Java虚拟机API了解多少?
- Java线程池最经典的接口是什么?
- 说说你对I/O的理解。
- 数据库的范式理解多少?
- 线程的不安全除了出现在并发中还出现那些地方?
- 讲讲你对Struct框架的理解?
- 你对JAVAEE有什么了解?
- 数据库中表和视图的关系?
list<?>
和list<Object obj>
有什么区别?
之下问本人对上述问题的一些肤浅的理解,如有错误之处,希望得到大家的指点。
1. HTTP状态码主要有:
1XX:消息。(不常问)
2XX: 页面成功。
- 200:请求成功(OK),一般不出现在页面上。
- 201:Created 请求被创建完成,同时新的资源被创建。
- 202 Accepted 供处理的请求已被接受,但是处理未完成。
- 203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
- 204 No Content 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
- 205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
- 206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。
3XX:重定向页面。
- 301 Moved Permanently 所请求的页面已经转移至新的url。
- 302 Found 所请求的页面已经临时转移至新的url。
4XX:请求错误。
- 403 Forbidden 对被请求页面的访问被禁止
- 404 Not Found 服务器无法找到被请求的页面。
- 405 Method Not Allowed 请求中指定的方法不被允许。
5XX:服务器错误。
- 500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。
- 501 Not Implemented 请求未完成。服务器不支持所请求的功能。
- 502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。
- 503 Service Unavailable 请求未完成。服务器临时过载或当机。
- 504 Gateway Timeout 网关超时。
- 505 HTTP Version Not Supported 服务器不支持请求中指明的HTTP协议版本。
2.我对mvc的理解:
Model(模型)表示应用程序核心(比如数据库记录列表);
View(视图)显示数据(数据库记录);
Controller(控制器)处理输入(写入数据库记录);
优点:
MVC 分层有助于管理复杂的应用程序;
MVC 分层同时也简化了分组开发;
MVC模式的这三个部分的职责非常明确,而且相互分离,因此每个部分都可以独立的改变而不影响其他部分,从而大大提高了应用的灵活性和重用性;
3.泛型的使用方面
- 泛型类
class 类名称 <泛型类型标识>{}
public class Generic<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
- 泛型接口
public interface Generator<T> { public T next(); }
- 泛型方法
[作用域修饰符] <泛型类型标识> [返回类型] 方法名称(参数列表){}
public class Util {
public static <K, V> boolean compare(Generic<K, V> g1, Generic<K, V> g2) {
return g1.getKey().equals(g2.getKey()) &&
g1.getValue().equals(g2.getValue());
}
}
public class Generic<K, V> {
private K key;
private V value;
public Generic(K key, V value) {
this.key = key;
this.value = value;
}
public void setKey(K key) { this.key = key; }
public void setValue(V value) { this.value = value; }
public K getKey() { return key; }
public V getValue() { return value; }
}
4.HashMap和HashTable
- HashTable是线程安全的,但是不可以接受以null值作为键或者值。因为加入了Synchronize保证线程的同步。实现的接口是Dictionary类。
- HashMap是实现了AbstractMap类,是线程不安全的,可以接受key和value同时为null的情况。 HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。解决哈希冲突的是采用头插法(扩容因子是0.75,默认是16)。
谈谈对事务的理解:
在回答这个问题的时候首先要考虑的是这里面包含了哪些知识点是我们要回答的,
- 第一个要点:什么是事务;
- 第二个要点:数据库的基本特性是什么?
- 第三个要点:什么是事务隔离,有哪些事务隔离级别?
-
什么是事务
数据库中的事务是作为单个逻辑工作单元执行的一系列操作。(多条 SQL 语句,要么全部执行成功,要么全部执行失败。)
数据库要支持事务操作必须满足四个特性,也就是常说的ACID:
A:原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败
C:一致性(Consistency):一个事务执行之前和执行之后都必须处于一致性状态。
I:隔离性(Isolation):多个事务在执行同一个操作时不能被其他事务干扰。
D:持久性(dependency):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的 -
什么是事务隔离,有哪些事务隔离级别?
事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离。一般的数据库,都包括以下四种隔离级别: 读未提交(Read Uncommitted) 读提交(Read Committed) 可重复读(Repeated Read) 串行化(Serializable)
-
读未提交(Read Uncommitted)
读未提交,就是可以读到未提交的内容。因此,在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的,可能会产生“脏读”、“不可重复读”、“幻读”。
-
读提交(Read Committed)
读提交,就是读到已经提交了的内容。这是各种系统中最常用的一种隔离级别,也是SQL Server和Oracle的默认隔离级别。这种隔离级别能够有效的避免脏读,但除非在查询中显示的加锁。“读提交”只能避免“脏读”,并不能避免“不可重复读”和“幻读”。
-
可重复读(Repeated Read)
可重复读,就是专门针对“不可重复读”这种问题而制定的隔离级别,它可以有效的避免“不可重复读”。并且它也是MySql的默认隔离级别。当事务启动时,不允许进行“修改操作(Update)”,而“不可重复读”恰恰是因为两次读取之间进行了数据的修改,因此,“可重复读”能够有效的避免“不可重复读”,但却避免不了“幻读”,因为幻读是由于“插入或者删除操作(Insert or Delete)”而产生的。
-
串行化(Serializable)
数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行(每一行数据都进行了加锁)。这种级别下,“脏读”、“不可重复读”、“幻读”都不会出现,但是执行效率非常差,性能开销也最大,所以基本没人会用。
-
————————————————
参考链接:https://blog.csdn.net/weixin_44873106/article/details/99346661