JAVA面试题积累(重要)【实时更新:2022/09/22】

发布于:2023-02-06 ⋅ 阅读:(814) ⋅ 点赞:(0)

目录

随时学,随时加 

 1.throws和throw的区别:

​编辑

2.代码块执行顺序:

 3.try ... catch、finally执行顺序:

4.三个字符串String  StringBuffer  StringBuilder的区别 : 

5.抽象类与接口的区别:

 6.this和super的区别:

7.方法重载和方法重写的区别:

8.Thread和Runnable的区别: 

9.sleep和wait的区别:

10. Collection和Map接口的区别:

11.ArraysList和LinkedList的区别:

12.ArrayList和Vector的区别:

13.List和Set的区别:

14.HashSet和LinkedHashSet和 TreeSet 三者的对比:

15.Hashtable和HashMap的区别:

16.Comparator和Comparable的区别:

Comparable和Comparator怎么选择?

17.当有哈希冲突时,HashMap是如何查找并确认元素的?

18.加载因子是来判断什么时候进行扩容

19.异常分类:

 20.IO流:

21.创建线程的几种方式:

22.线程的生命周期:

23.什么是守护线程

24.什么是Threadlocal变量?

25.volatile有什么用?能否用一句话说明下volatile的应用场景?

26. synchronized和 volatile的区别是什么?

27.什么是阻塞队列?

28.TCP三次握手:

 29.TCP四次挥手:

30.TCP和UDP的区别:

31.垃圾回收(守护线程)的三种算法:

32.什么是反射机制:

33.Java反射API(反射 API 用来生成 JVM 中的类、接口或则对象的信息)

34.获取Class对象的3种方法:

35.什么是单例模式:

36.单例模式的两种模式:

37.如何编译和运行Java文件?

 38. final、finally、finalize有什么区别?

 39.是否可以从一个static方法内部发出对非static方法的调用?

40.  Integer与int的区别?

 41.abstract的方法是否可同时是static、native和synchronized?

42. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

43. Error和Exception有什么区别?

44. Java 中堆(heap)和栈(stack)有什么区别?

45. io流怎样读取文件的?

46.Java自动装箱与拆箱?

 47.Java线程池中submit()方法和execute()方法有什么区别?

48.  HTTP的长连接和短连接?

49.请求转发和重定向的区别:

50.GET请求和POST请求的区别:

 51.数据库的隔离级别:

52.MVC三层架构:

 53.Spring是什么?

54.Spring的优点?

55.什么是Mybatis

 56.#{}和${}的区别是什么?

 57.通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

58.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?


随时学,随时加 

 1.throws和throw的区别:

         throws:在方法后边声明异常,其实就是自己不想对异常做出任何的处理,告诉别人自己可能出现的异常,交给别人处理,然别人处理

package com.xinkaipu.Exception;
class Math{
    public int div(int i,int j) throws Exception{
        int t=i/j;
        return t;
    }
}


public class ThrowsDemo {
    public static void main(String args[]) throws Exception{
        Math m=new Math();
   }
}

throw:  就是自己处理一个异常,有两种方式要么是自己捕获异常try...catch代码块,要么是抛出一个异常(throws 异常) 

package com.xinkaipu.Exception;
 
public class TestThrow
{
    public static void main(String[] args) 
    {
        try
        {
            //调用带throws声明的方法,必须显式捕获该异常
            //否则,必须在main方法中再次声明抛出
            throwChecked(-3);            
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        //调用抛出Runtime异常的方法既可以显式捕获该异常,
        //也可不理会该异常
        throwRuntime(3);
    }
    public static void throwChecked(int a)throws Exception
    {
        if (a > 0)
        {
            //自行抛出Exception异常
            //该代码必须处于try块里,或处于带throws声明的方法中
            throw new Exception("a的值大于0,不符合要求");
        }
    }
    public static void throwRuntime(int a)
    {
        if (a > 0)
        {
            //自行抛出RuntimeException异常,既可以显式捕获该异常
            //也可完全不理会该异常,把该异常交给该方法调用者处理
            throw new RuntimeException("a的值大于0,不符合要求");
        }
    }
}

2.代码块执行顺序:

    代码块执行顺序:静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
    继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器

 3.try ... catch、finally执行顺序:

                finally永远是在最后执行的
                如果在try ... catch语句中有return,        
                catch可以写多个异常(可以捕获多个异常)
                顺序问题:先写小的,再写大的

4.三个字符串String  StringBuffer  StringBuilder的区别 : 

5.抽象类与接口的区别:

  1. 抽象类是半抽象的,接口时完全抽象的
  2. 抽象类中有构造方法,接口没有构造方法
  3. 接口与接口之间支持多继承,类与类之间只支持单继承
  4. 一个类可以实现多个接口,但一个抽象类只能继承一个类
  5. 接口中只允许有常量和抽象方法(java7之前)

 6.this和super的区别:

1.属性的区别:
this访问本类中的属性,如果本类没有此属性则从父类中继续查找。super访问父类中的属性。
2.方法的区别:
this访问本类中的方法,如果本类没有此方法则从父类中继续查找。super访问父类中的方法。
3.构造的区别:
this调用本类构造,必须放在构造方法的首行。super调用父类构造,必须放在子类构造方法首行。
4.其他区别:
        this表示当前对象。super不能表示当前对象
        A、this. 变量和super.变量
                this.变量 调用的当前对象的变量;
                super.变量 直接调用的是父类中的变量。
        B、this(参数)和super(参数)方法
                this(参数) 调用(转发)的是当前类中的构造器;
                super(参数) 用于确认要使用父类中的哪一个构造器。

7.方法重载和方法重写的区别:

区别点            重载方法        重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
范围 在一个类中 发生在继承类中

8.Thread和Runnable的区别: 

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

9.sleep和wait的区别:

二者都会让线程进入阻塞状态,有以下区别:

  1. wait是Object的方法 sleep是Thread的方法
  2. wait会立即释放锁 sleep不会释放锁
  3. wait后线程的状态是Watting sleep后线程的状态为 Time_Waiting
  4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常(终端异常

     5.

  • Thread.sleep只会让出CPU,不会导致锁行为的改变
  • Object.wait不仅让出CPU,还会释放已经占有的同步资源锁

10. Collection和Map接口的区别:

Map没有继承Collection接口

        Collection接口,包含list和set子接口
        Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字键值对。
        在Map对象中,每一个关键字最多有一个关联的值。

11.ArraysList和LinkedList的区别:

        1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)

        2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

        3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

12.ArrayList和Vector的区别:

        1. ArrayList 是线程不安全的,Vector 是线程安全的

        2.ArrayList 使用默认构造器创建对象时是在调用 add() 方法时对 ArrayList 的默认容量进行初始化的,Vector 在调用构造器时就对容量进行了初始化

        3. ArrayList 存储数据的 Object 数组使用了 transient 关键字,Vector 的 Object 数组没有

        4. ArrayList 和 Vector 的扩容机制不同

13.List和Set的区别:

(1)重复对象
list方法可以允许重复的对象,而set方法不允许重复对象
(2)null元素
list可以插入多个null元素,而set只允许插入一个null元素
(3)容器是否有序
list是一个有序的容器,保持了每个元素的插入顺序。即输出顺序就是输入顺序,而set方法是无序容器,无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序

14.HashSet和LinkedHashSet和 TreeSet 三者的对比

         1、HashSet、LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。

        2、HashSet、LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。

HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。

LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。

TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。

        3、底层数据结构不同又导致这三者的应用场景不同。

HashSet 用于不需要保证元素插入和取出顺序的场景,

LinkedHashSet 用于保证元素的插入和取出顺序满足 FIFO 的场景,

TreeSet 用于支持对元素自定义排序规则的场景。

15.Hashtable和HashMap的区别:

1.HashMap是线程异步,线程不安全的,Hashtable是线程同步,线程安全

2.HashMap的key是可以为null的,Hashtable是不可以为null


16.Comparator和Comparable的区别:

参数 Comparable Comparator
排序逻辑 排序逻辑必须在待排序对象的类中,故称之为自然排序 排序逻辑在另一个实现
实现 实现Comparable接口 实现Comparator接口
排序方法 int compareTo(object o1) int compare(Object o1,Object o2)
触发排序 Collection.sort(List) Collections.sort(List,Comparator)
接口所在包 java.lang.Comparable java.util.Comparator

Comparable和Comparator怎么选择?

当比较规则不会发生改变的时候,建议选择实现Comparable接口。
如果比较规则有多个,并且需要多个比较规则频繁切换,建议选择使用Comparator 

17.当有哈希冲突时,HashMap是如何查找并确认元素的?

当哈希冲突时需要通过判断key值是否相等,才能确认此元素是不是我们想要的元素

解决哈希冲突的方法:开放定址法,链地址法

18.加载因子是来判断什么时候进行扩容

        当加载因子设置比较大时,扩容发生的频率比较低且占用的空间会比较小,但这样的话发生hash冲突的几率就会增大,因此需要更复杂的数据结构去存储数据,这样对元素的操作时间 增加,运行效率会降低;

        当加载因子设置较小的时候,会发生频繁的扩容且占用空间增大,此时hash冲突的可能性 就比较小,操作性能会提高。,但占用空间会比较大。

19.异常分类:

 

 20.IO流:

21.创建线程的几种方式:

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口

4.基于线程池

22.线程的生命周期:

1.NEW:   新建状态

2.RUNNABLE: 就绪状态

3.RUN:运行状态

4.BLOCKED:   阻塞状态

        4.1WAITING:   等待状态

        4.2TIMED_WAITING:    计时等待状态

5.TERMINATED:终止状态(死亡状态)

23.什么是守护线程

为用户提供公共服务,也叫后台进程

24.什么是Threadlocal变量?

        ThreadLocal是一个本地线程副本变量工具类,可以理解为线程的本地变量。

        主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,实现了线程的数据隔离,是线程独有的所以本身就是线程安全,特别适用于各个线程依赖多个不同的变量值完成操作的场景

25.volatile有什么用?能否用一句话说明下volatile的应用场景?

volatile保证内存可见性和禁止指令重排。

volatile用于多线程环境下的一写多读.

26. synchronized和 volatile的区别是什么?

1.volatile是变量修饰符:synchronized是修饰类、方法、代码段

2.volatile仅能实现变量的修改可见性,不能保证原子性: 而 synchronized则可以保证变量的修改可见性和原子性)

3.volatile不会线程的阻塞:synchronized可能会造成线程的阻塞

27.什么是阻塞队列?

阻塞队列是一个支持两个附加操作的队列:

                1.在队列为空时,获取元素的线程会等待队列变为非空。

                2.当队列满时,存储元素的线程会等待队列可用。

28.TCP三次握手:

1. 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

2. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

3. 第三次握手,客户端再次向服务器端发送确认信息,确认连接

 29.TCP四次挥手:

 (双方需要确认两次) 发送端和接收端断开逻辑连接

1.TCP客户端发送数据,用来关闭客户到服务器的数据传送。

2.服务器收到这个数据,它发回一个数据,确认序号为收到的序号加1

3.服务器关闭客户端的连接,发送一个数据给客户端。

4.客户端发回数据确认,并将确认序号设置为收到序号加1。

30.TCP和UDP的区别:

1.TCP面向连接,UDP面向非连接即发送数据前不需要建立链接 

2.TCP数据传输慢,UDP数据传输快

3.TCP数据传输安全,UDP数据传输不安全

31.垃圾回收(守护线程)的三种算法:

1.标记-清除算法

2.标记-复制算法

3.标记-整理算法

32.什么是反射机制:

        在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方 法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用 对象方法的功能成为Java 语言的反射机制。

33.Java反射API(反射 API 用来生成 JVM 中的类、接口或则对象的信息)

1. Class 类:反射的核心类,可以获取类的属性,方法等信息。

2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。

3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。

4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。

34.获取Class对象的3种方法:

1.调用Object的 getClass()方法

        Person p=new Person(); Class clazz=p.getClass();

2.调用某个类的 class 属性来获取该类对应的 Class 对象

        Class clazz=Person.class;

3.使用 Class 类中的 forName()静态方法(最安全/性能最好)

        Class clazz=Class.forName("类的全路径"); (最常用)

35.什么是单例模式:

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。 

36.单例模式的两种模式:

  • 懒汉式:在真正需要使用对象时才去创建该单例类对象
  • 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用

37.如何编译和运行Java文件?

使用javac命令来编译.java文件(比如Test.Java),

运行之后会生产对应的Test.class文件
使用Java命令来运行java文件

 38. final、finally、finalize有什么区别?

1.final可以修饰类、变量、方法,修饰类时表示该类不能被继承、修饰方法时表示该方法不能被重写、修饰变量时表示该变量是一个常量不能被重新赋值。
2.finally一般作用在try-catch代码块中,在处理异常的时候,通常将一定要执行的代码放在finally代码块中。表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
3.finalize是Object类的一个方法,它是用来实现垃圾回收的。在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。

 39.是否可以从一个static方法内部发出对非static方法的调用?

        在static方法内部不可以直接调用非static方法,因为static方法被调用时无需创建对象,而非static方法需要创建对象后才能被调用。要想在static方法内部调用非static方法,可以在static方法内部先创建一个对象,然后通过对象来调用非static方法。

40.  Integer与int的区别?

  1. Integer是int的包装类,int则是java基本数据类型中的一种,Integer变量必须实例化后才能使用,而int变量不需要。
  2. Integer是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,而int是直接存储数据值。
  3. Integer的默认值是null,int的默认值是0

 41.abstract的方法是否可同时是static、native和synchronized?

都不可以。

  1. abstract是指抽象方法,只有方法声明没有方法实现,不能被直接调用。
  2. static是类方法, 它可以不生成类的实例直接被类调用,而abstract方法不能被调用,所以static与abstract不能同时使用。
  3. native用来声明本地方法,一般用于java与外环境的交互。它与抽象方法类似,只有方法声明没有方法实现,native与abstract本身就是相冲突的,所以不能同时使用。
  4. synchronized是同步方法,然而同步是需要有具体操作才能实现的,但abstract只有方法声明,无法实现同步,所以static和synchronized不能同时使用

42. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?

        Math.round方法表示“四舍五入”,即将原来的数字加上0.5后再向下取整,所以Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

43. Error和Exception有什么区别?

        Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出或者捕获,它是异常处理机制的基本组成类型。
        Exception是Java程序运行中可预料的异常,可以获取到这种异常和进行业务外的处理。
        Error是Java程序运行中不可预料的异常,这种异常发生以后,会直接导致JVM出现不可处理或者不可恢复的情况,所以这种异常不可能抓取到。

44. Java 中堆(heap)和栈(stack)有什么区别?

  1. 栈内存用来存储局部变量和方法调用,堆内存用来存储Java中的对象,无论是成员变量、局部变量还是类变量,它们指向的对象都存储在堆内存中,栈内存要远远小于堆内存。
  2. 栈内存属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,栈内存可以理解成线程的私有内存。
  3. 堆内存中的对象对所有线程可见,可以被所有线程访问。

45. io流怎样读取文件的?

        io流使用File对象获取文件路径,通过字符流Reader加入文件,使用字符缓冲流BufferedReader处理Reader,最后定义一个字符串循环遍历输出文件。

46.Java自动装箱与拆箱?

        自动装箱就是自动将基本数据类型转换为包装器类型,比如调用Integer的valueOf() 方法将int类型转换为Integer类型
        自动拆箱就是自动将包装器类型转换为基本数据类型,比如调用Integer的intValue()方法将Integer类型转换为int类型

 47.Java线程池中submit()方法和execute()方法有什么区别?

  1. submit()方法和execute()方法都可以向线程池提交任务。
  2. execute()方法的返回类型是void,它定义在Executor接口中,。
  3. submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,扩展了Executor接口 

48.  HTTP的长连接和短连接?

HTTP的长连接和短连接本质上是TCP长连接和短连接。
短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。长连接不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间。

49.请求转发和重定向的区别:

            1.重定向是两次请求,请求转发是一个请求
            2.重定向是客户端行为,请求转发是服务器行为
            3.重定向浏览器地址会发生改变,转发不会
            4.重定向可以定向到任意地址,转发只能项目内转发

50.GET请求和POST请求的区别:

         GET:请求的参数会在浏览器的地址栏中显示,不安全;请求的长度限制在1K之内。
               没有请求体,无法通过request去设置一些参数。
         POST:请求的参数不会在浏览器的地址栏中显示,相对安全。
               把请求的参数封装成几个数据报文(请求体)。请求参数的长度没有限制。

 51.数据库的隔离级别:

(1)读未提交

(2)读已提交

(3)可重复读

(4)串行化

52.MVC三层架构:

三层架构之间的关系:

 53.Spring是什么?

Spring是一个轻量级的IoC和AOP容器框架。

54.Spring的优点?

(1)spring属于低侵入式设计,代码的污染极低;

(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;

(3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。

(4)spring对于主流的应用框架提供了集成支持。

55.什么是Mybatis

(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。

(2)作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

 56.#{}和${}的区别是什么?

${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性。

Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

 57.通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

   Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象 MappedProxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。

58.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。


网站公告

今日签到

点亮在社区的每一天
去签到