笔试题目:
线程的实现方式?如何实现线程同步?
线程实现方式:
- 实现runnable接口,并实现该接口的run()方法。
以下是主要步骤:
- 自定义类并实现Runable接口,实现run()方法。
- 创建Thread对象,用实现Runable接口的独享作为参数实例化该Thread对象。
- 调用Thread的start()方法;
class MyThread implements Runnable{
//创建线程类
public void run(){
System.out.println("Thread Body");
}
}
public class Test{
public static void main(String[] args){
MyThread thread = new MyThread();
Thread t = new Thread(thread);
t.start();//启动线程
}
}
- 继承Thread类,重写run方法。
class MyThread extends Thread{
public void run(){
System.out.println("Thread Body");
}
}
public class Test{
public static void main(String[] args){
MyThread thread = new MyThread();
thread.start();
}
}
- 实现Callable接口,重写call方法。
import java.util.concuurent.*;
public class CallableAndFuture{//创建线程类
public static class CallableTest implements Callable<String>{
public String call() throws Exception {
return "Hello World";
}
}
public static void main(String[] args){
ExecutorService threadPool = Executors.newSingleThreadExecutor(); //启动线程
Future<String> future = threadPool.submit(new CallableTest());
try{
System.out.println("waiting thread to finish");
System.out.println(future.get()); //等待线程结束,并获取返回结果
}catch(Exception e){
e.printStackTrace();
}
}
}
线程同步的实现:
在我们回答这个问题之前,我们先来想一下为什么要使用同步呢?Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突,因此加入同步锁可以避免在该线程没有完成操作之前,被其它线程的调用,从而保证了该变量的唯一性和准确性。
1.同步方法
使用synchronized关键字修饰的方法。由于java的每个对象都由一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
注:synchronzied关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。
2.同步代码块
即有synchronized关键字修饰打的语句块。
被关键字修饰的语句块会自动被加上内置锁,从而实现同步。
注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码同步关键代码即可。
其他的实现同步方法
使用特殊域变量(volatile)实现线程同步;使用重入锁实现线程同步;使用局部变量实现线程同步;使用阻塞队列实现线程同步;
使用原子变量实现线程同步。
常见的文件读取方式?
java读取文件方法常见的方法:
- 按字节读取文件内容
- 按字符读取文件内容
- 按行读取文件内容
- 随机读取文件内容
具体的代码实现可以参考这篇文章https://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html
gc机制的简单介绍?
这个博主还是菜鸡,关于垃圾回收机制没具体了解过。大家可以自行google。
https://www.cnblogs.com/xiaoxi/p/6486852.html
react的生命周期及执行顺序?
ttps://blog.csdn.net/qq_38793958/article/details/80998403
简单介绍一下工厂模式和单例模式?
博主的另外一篇博客中有详细的介绍。
https://blog.csdn.net/enl0ve/article/details/81071644
单例模式大家可以看下《剑指offer》中,有一个对单例模式的详细介绍。
error和Exception分别是什么?它们有什么区别?checked和unchecked是什么?
Error和Exception都继承自Throwable类。
二者的不同之处:
Exception:1.可以是可被控制(checked)或者不可控制的(unchecked)。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。
Error:1.总是不可控制的(unchecked);
2.经常用来用于表示系统错误或低层资源的错误。
3.如何可能的话,应该在系统级被捕捉。
Java 中定义了两类异常:
1) Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。
2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是非凡的,它们不能通过client code来试图解决,所以称为Unchecked exception 。
List、Set以及Map的区别是什么?有什么具体的实现?
List:1.可以允许重复的对象。
2.可以插入多个null元素。
3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
Set:1.不允许重复对象
2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
3. 只允许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
1.Map不是collection的子接口或者实现类。Map是一个接口。
2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
附上一篇详细的讲解https://www.cnblogs.com/IvesHe/p/6108933.html
什么时候用finally?什么时候用final?
不做过多讲解,自己看就行了。https://blog.csdn.net/qq120074791/article/details/76409072
Herbinate的意义是什么?怎么样实现一对一和一对多的配置?
https://blog.csdn.net/xrt95050/article/details/7322222
Spring中的控制反转?
https://blog.csdn.net/six_666666/article/details/77868753
用XML和JSON写出下面的需求。某公司有两个项目分别是XMA和XMB,XMA的项目经理为张三,有两个开发员工为甲、乙,XMB的项目经理为李四,有两个开发员工为丙、丁。
JSON格式:
{
"project1": {
"project_name": "XMLA",
"PM": "张三",
"SE": ["甲",
"乙"
]
},
"project2": {
"project_name": "XMLB",
"PM": "李四",
"SE": ["丙",
"丁"
]
}
}
XML格式
<Company>
<project_A>
<project_name>XMLA</project_name>
<PM>张三</PM>
<SE>甲</SE>
<SE>乙</SE>
</project_A>
<project_B>
<project_name>XMLB</project_name>
<PM>李四</PM>
<SE>丙</SE>
<SE>丁</SE>
</project_B>
</Company>
总体来说还行,加油吧,骚年。