一、多线程的实现
多线程的实现主要有以下几种实现:
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口
其中,继承Thread类与Runnable接口实现中的run()是void类型,Callable接口实现中的call()方法可以设置返回类型。
二、线程start()与run()方法区别
start()方法启动线程,异步执行线程里的run()方法,而调用run()方法,代码是同步执行,必须等另一个线程的run()方法执行完毕才能执行。
三、守护线程
java中线程分两种,一种为用户线程,一种为守护线程(Daemon),典型的守护线程的例子有GC(垃圾回收)。
程序运行完毕时,JVM会等待非守护线程(用户线程)运行结束才关闭,而不会等待守护线程。
四、sleep()与wait()的区别
sleep()方法属于Thread类,而wait()方法属于Object类。
sleep()可设置睡眠时间,时间一到自动恢复运行不需要另外的线程唤醒;没有释放锁,仍然占有该锁;其他线程无法访问。
wait()需要notifyAll()或者notify()唤醒,释放锁,其他线程可以访问。
五、同步和异步
synchronized修饰同步代码块,两个并发线程访问同一个对象中的synchronized(this)同步代码块时,同一时间内只有一个线程执行,另外一个线程需要等到当前线程结束之后才能执行(即当前访问线程状态为阻塞);如果一个线程访问同步代码块,另外一个线程可以访问非同步代码块。
同步安全,但多个线程请求同一资源需要等待,不会造成死锁。
异步不安全,但不需要等待,效率提高。
六、HashMap和HashTable区别
HashMap效率高,但是在多线程环境下线程不安全。
HashTable线程安全,但是效率低,因为HashTable内部是采用synchronized来保证线程安全的,每次同步执行的时候要锁住整个结构,但是在线程竞争激烈的情况下HashTable的效率下降得很快。
七、SQL四种连接
数据库连接查询主要分为内连接和外连接,其中外连接包括左(外)连接,右(外)连接,全(外)连接。
inner join,在两张表进行连接查询时,只保留两张表中完全匹配的结果集。
left join,在两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录。
right join,在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。
full join,在两张表进行连接查询时,返回左表和右表中所有没有匹配的行。
八、==和equals区别
==比较的是内存地址,equals比较的是值是否相等,equals()方法可进行重写
测试代码如下:
@Test
public void test(){
String str1=new String("abc");
String str2=new String("abc");
if(str1==str2){
System.out.println("str1==str2");
}else{
System.out.println("str1!=str2");
}
if(str1.equals(str2)){
System.out.println("str1 equals str2");
}else {
System.out.println("str1 does not equals str2");
}
}
输出结果为
str1!=str2
str1 equals str2
若此时新增一个字符串变量String str3=str1,则str3==str1返回的值为true,String str4="abc",则str4==str1返回的值为false。
九、LinkedList和ArrayList的区别
LinkedList底层是链表实现的,插入删除数据效率高,查询的时候效率低于ArrayList。
ArrayList底层是线性表(数组)实现的,查询效率高,插入删除数据效率低,需要移动数组或进行数组扩容,往第一个位置插入数据时间复杂度为O(n),往数组末尾插入一个新的数据时间复杂度为O(1)。
十、TCP和UDP的区别
1、TCP面向连接,UDP无连接。
2、TCP安全可靠(三次握手),UDP不可靠,可能丢包,尽最大努力交付。
3、TCP传输速度慢,效率低,UDP传输数据快,效率高。
4、TCP面向字节流,UDP面向报文。
十一、POST和GET请求的区别
1、GET把参数包含在URL中,POST通过request body传递参数。
2、GET请求URL中传送的参数有最大长度限制,不同浏览器对其最大长度限制不同,POST则无。
3、GET请求只能支持URL编码,而POST请求支持多种编码方式。
4、GET在浏览器回退的时候是无害的,而POST会再次提交请求。
5、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
6、GET请求对数据类型有所限制,只接受ASCII码,而POST无限制,也允许二进制数据。
7、GET请求安全性差,因为参数封装在URL中,数据对所有人都是可见的,而POST安全性更高,因为参数不会被保存在浏览器历史或 web 服务器日志中。
十二、JAVA访问修饰符
JAVA修饰符有public,private,protected,以及default默认不写
访问控制 | 当前类 | 同包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
private | √ | × | × | × |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
十三、list、set、map的区别
Collection接口:list和set,常见的list有ArrayList、LinkedLIst和Vector,常见的set有HastSet和SortedSet。
Map接口:map,常见的实现类有HashMap、HashTable和TreeMap。
LIst中的元素有序、可重复,可为空。
Set中的元素无序、不可重复、只有一个空元素。
Map中的元素无序,Key不可重复,Value可重复,可一个Key为空,多个Value为空。
十四、ArrayList和Vector的区别
ArrayList和Vector都是通过数组的方式来存储数据的,允许下标(索引)进行访问,但是ArrayList线程不安全,Vector是线程安全的,性能要比ArrayList低。
十五、抽象类和接口的区别
抽象类和接口都不能被实例化,一个类可以实现多个接口,只能继承一个abstract class。
关键字不同,实现接口用implements,继承用extends。
抽象类中可以包含非抽象的普通方法,而接口中所有的方法只能是抽象的。
抽象类可以有构造方法,而接口中不能有构造方法。
抽象类中可以有普通成员变量,而接口不可以。
抽象类中和接口中可以有静态成员变量,抽象类的静态成员访问类型可以是任意而接口中静态成员变量默认是也只能是public static final类型。
十六、StringBuffer和StringBuilder的区别
StringBuffer线程安全,StringBuilder线程不安全。在没有多线程问题的情况下,StringBuilder效率更高。