java后端面试题汇总

本篇将持续更新。。。。。面试题总结

    面试过程中,遇到领导问你为什么离职时,一定要想好怎么回答,不知道的可以百度一下,我现在还在摸索阶段,有想法的可以留言探讨,这个问题很重要!

1. RESTful指的是什么?

    目前最流行的一种互联网软件架构,资源在网络中以某种表现形式进行状态转移(1)每一个URI代表一种资源;(2)客户端和服务器之间,传递这种资源的某种表现层;(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。(感觉很晦涩难懂,我也不是很懂)

2. Object类中有哪些方法,请举几个例子。

    clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()

3. StringBuilder和StringBuffer区别?

   StringBuilder是线程不安全的,而StringBuffer是线程安全的,所以速度上(也可以理解为性能上)StringBuilder > StringBuffer > String。String是不可变的,其他两个是可变的。StringBuffer很多方法都被synchronized修饰了,所以才是线程安全的,但是这样会时其速度变慢。

4. List,Set的区别?

    List,Set都是继承自Collection接口。List元素有序,set元素无序,重复放入元素会覆盖之前的元素。

5. Set遍历的方式有哪些?

    (1)Set<String> sets = new HashSet<String>();for (String element : sets) {}   (2)Set<String> sets = new HashSet<String>();Iterator<String> it = sets.iterator();while(it.hasNext()){String str = it.next()}

6. Map遍历的方式有哪些?

    Map<String, Integer> tempMap = new HashMap<String, Integer>();  (1)Iterator it = tempMap.entrySet().iterator();  while (it.hasNext()) {  Map.Entry entry = (Map.Entry) it.next();  Object key = entry.getKey();   Object value = entry.getValue();  }(2)for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {String key = entry.getKey().toString();String value = entry.getValue().toString();  }(3) for (Object o : tempMap.keySet()) {  System.out.println("key=" + o + " value=" + tempMap.get(o));  }(4)for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {   Object obj = i.next();   System.out.println(obj);// 循环输出key   System.out.println("key=" + obj + " value=" + tempMap.get(obj));    }

    这里主要记住entrySet和keySet,使用迭代器iterator。

7. 什么叫java的反射机制?

    在java运行环境中获取类的属性和方法,调用对象的任何一个方法。动态获取类的信息,以及动态调用对象的方法就叫做java的反射机制。

8. 事务有哪些特性,稍微解释一下?

    ACID,原子性(Atomicity):事务不可拆分,要么都发生,要么都不发生。一致(Consistency)性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。隔离性(Isolation):多个用户访问时,各个用户之间的事务性互不干扰。持久性:事务一旦被提交,数据库中的数据改变就是永久性的。

8. 获取一个对象的方法

    A.class a.getclass() Class.forName()

9. ThreadLocal是干嘛用的?

    ThreadLocal(线程变量副本),ThreadLocal为每个线程维护一个本地变量。而Synchronized实现内存共享,ThreadLocal采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

10. &和&&的区别?

    &运算符有两种用法:(1)按位与;(2)逻辑与。&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&。

11. byte的加减法?

    题目为 byte a=1,b=2,ab;final byte c=3,d=4,cd;ab=a+b;cd=c+d;

    syso(ab);syso(cd);

    被final修饰的变量是常量,这里的cd=c+d可以看成是cd=7;在编译时就已经变为cd=7了.而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。Java中的byte,short,char进行计算时都会提升为int类型。

12. 线程和进程有什么区别?

    线程相关可以访问以下地址(https://www.cnblogs.com/bsjl/p/7693029.html).   线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

13.什么是线程安全?Vector是一个线程安全类吗?

    如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。

14.什么是线程池? 为什么要使用它?

    创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。

15.Java多线程中调用wait() 和 sleep()方法有什么不同?

    Java程序中wait 和 sleep都会造成某种形式的暂停,它们可以满足不同的需要。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁

16.局部代码块,构造代码块,静态代码块的区别?

    首先用代码解释一下:

public class Main {
    public static void main(String[] args) {
        B b =new B();
    }
}
class A{
    {
        System.out.println("构造代码块A");
    }
    static{
        System.out.println("静态代码块A");
    }
    public A(){
        System.out.println("构造函数A");
    }
}
class B extends A{
    {
        System.out.println("构造代码块B");
    }
    static{
        System.out.println("静态代码块B");
    }
    public B(){
        System.out.println("构造函数B");
    }
}
    输出结果为:

        静态代码块A
        静态代码块B
        构造代码块A
        构造函数A
        构造代码块B
        构造函数B

解释: 1.局部代码块,又叫普通代码块。它是作用在方法中的代码块。作用:是控制局部变量的生命周期.
         2. 构造代码块,就是给所有对象进行初始化。每次创建对象他都会执行,构造代码快是优于构造函数执行。构造代码块与构造函数的区别是:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。
         3.静态代码块,是对类进行初始化,若一个类包含多个静态代码块,那则是按照代码执行顺序执行。随着类的加载而执行,而且只一次。优先于主函数执行。当类进入内存时,首先进行静态代码加载

17.使用线程的方式有哪些?

         1. 继承Thread类。
         2. 实现Runabl接口   两者没有很大的区别,java是单继承,所以一般以第二种编写线程为佳。

18.调用线程的run方法和start方法的区别

         1. run方法执行不是异步执行的,而是同步执行的,此线程对象不交给线程规划器规划。
         2. start方法是一般启动线程的方式,是异步执行的。执行start的顺序不代表线程执行的顺序

19.线程的interrupted和isInterrupted的区别

         1. interrupted 测试当前线程是否已经是中断状态,执行后将状态标志清除为false。
         2. isInterrupted 测试当前线程是否已经是中断状态,但不清除状态标志。

      

    

        

猜你喜欢

转载自my.oschina.net/u/2615530/blog/1630013