java练习题(四)
1. 列举java的常用容器(集合)
1.Collection集合体系:包括List(有序集合),Set(不重复集合),Queue(队列)
常用的List集合有:ArrayList、LinkedList、Vector
常用的Set集合有:HashSet、TreeSet、LinkedHashSet
常用的Queue队列有:BlockingQueue、Deque
2.Map 键值映射集合:
常用的Map集合有:HashMap、TreeMap、SortMap、LinkedHashMap、ConcurrentHashMap等
2. List和Set的区别,不可重复是什么意思?
区别:
1.List可以包含重复元素,而Set包含唯一项。
2.List是一个有序集合,它维护插入顺序,而Set是一个无序集合,不保留插入顺序。
3.List接口包含一个遗留类:Vector类,而Set接口没有任何遗留类。
4.List接口可以允许n个null值,而Set接口只允许一个null值。
不可重复:集合里的元素是不能重复的,set集合中,会根据对象的hashcode去重,set内部的实质使用的就是map
3. HashMap是否线程安全,如果想用线程安全的HashMap怎么做?
HashMap线程不安全
有2种办法让HashMap线程安全,分别如下:
1.通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。
2.改用效率更加高且线程安全的ConcurrentHashMap代替HashMap
4. 编写一个单例模式,常见的单例有哪些,分别列举?
常见的单例模式有:懒汉式,饿汉式,枚举式
1.懒汉式
/**
* 懒汉式
*/
private static Singleton01 instance;//唯一对象
private Singleton01() {// 构造方法私有化
}
public static Singleton01 getInstance() {// 用来创建(获取)唯一对象的方法
if (instance == null) {
instance = new Singleton01();
}
return instance;
}
//---------------------------------->
public static void main(String[] args) {
Singleton01 s1 = Singleton01.getInstance();
Singleton01 s2 = Singleton01.getInstance();
System.out.println(s1==s2);//结果为true。说明s1与s2指向同一对象
}
2.饿汉式
public class Singleton02 {
private static Singleton02 instance = new Singleton02();//创建唯一对象
private Singleton02() {//构造方法私有化
}
public static Singleton02 getInstance() {//获取唯一对象的方法
return instance;
}
}
3.枚举式
public enum Singleton03 {
INSTANCE;//创建唯一对象
}
5. 有哪些排序算法,写出快速排序算法的实现
常见的经典排序算法:冒泡排序,选择排序,插入排序,快速排序,归并排序等。
快速排序:
public class QuickSort {
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
6. 给一个二叉树,使用递归和非递归完成先序,中序和后序的遍历
7. 数据库的事务的四大特性及数据库的隔离级别
ACID
- 原子性Atomicity:事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。
- 一致性Consistency:数据库中的数据在事务操作前和事务处理后都必须满足业务规则约束。事务必须使数据库从一个一致性状态变换到另外一个一致性状态
- 隔离性Isolation:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性Durability:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
数据库的隔离级别:
读未提交:在一个事务中,读到了其他事务没有提交的数据。会产生数据脏读现象,不能限制不可重复读和幻读。
读已提交:在一个事务中可以读取到其他事务已经提交的数据变化。可防止脏读现象,无法限制不可重复读和幻读。
可重复读:在一个事务中直到事务结束之前,都可以反复的读到事务刚开始看到的数据,并且一直不会发生变化,有效的防止了脏读和不可重复读。
可序列化:只有等一个事务结束,才能进行下一个事务。
8.TCP的三次握手和四次挥手
9. GET/POST的区别,除了GET/POST还有哪些?
GET和POST是HTTP请求的两种基本方法,HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,本质上并无区别。
但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
两者的重大区别:GET产生一个TCP数据包;POST产生两个TCP数据包。
两者的其他区别(参考自w3schools):
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST么有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。(最直观区别)
除了上述两种请求还有:
1.DELETE:请求服务器删除Request-URI所标识的资源。
2.TRACE:回显服务器收到的请求,主要用于测试或诊断。
3.CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
4.PUT:向指定资源位置上传其最新内容。
5.HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
6.OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。