记一次面试经历分享

本文分享了一次Java后台开发的面试经历,涉及线程的实现方式(实现Runnable接口、继承Thread类、实现Callable接口)以及线程同步的实现,包括同步方法和同步代码块。此外,还提及了文件读取方式、GC机制、React生命周期、设计模式(工厂模式和单例模式)、异常类型和处理,以及集合框架(List、Set、Map)的区别等核心知识点。
摘要由CSDN通过智能技术生成

笔试题目:

线程的实现方式?如何实现线程同步?

线程实现方式:

  • 实现runnable接口,并实现该接口的run()方法。

以下是主要步骤:

  1. 自定义类并实现Runable接口,实现run()方法。
  2. 创建Thread对象,用实现Runable接口的独享作为参数实例化该Thread对象。
  3. 调用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读取文件方法常见的方法:

  1. 按字节读取文件内容
  2. 按字符读取文件内容
  3. 按行读取文件内容
  4. 随机读取文件内容

具体的代码实现可以参考这篇文章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>

总体来说还行,加油吧,骚年。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值