Java笔试总结(问答题)

1、final、finalize和finally的不同之处?

解析:final是Java中的关键字,修饰符,用于声明 属性(属性不可交变)、方法(方法不可覆盖)、类(类不可继承)。

finally 是 异常处理语句结构 的一部分,不管是否有异常,他的语句总是执行。

finalize 是Object类的一个方法,主要是在收集器执行的时候会调用被回收对象的此方法,进行资源回收,例如关闭文件等。

2、Java中队列接口的方法poll()和remove()的区别?

解析: remove() 和 poll()都是用来从队列头部删除一个元素。
在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。

3、谈谈List、Set与Map的区别?遍历一个List有哪些不同的方式?

解析:

1、List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;

2、List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。

List遍历的方式:

public static void main(String[] args) {
    List<Integer> list = Lists.newArrayList();
    list.add(1);
    list.add(2);
    list.add(3);

    //方法一 普通for循环遍历
    System.out.println("普通for循环遍历");
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }

    //方法二 增强for (也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。
    //内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
    System.out.println("增强for");
    for (int i : list) {
        System.out.println(i);
    }

    //方法三 Lambda
    System.out.println("Lambda");
    list.forEach(e -> {
        System.out.println(e);
    });

    list.stream().forEach(e -> {
        System.out.println(e);
    });

    //方法四 倒序遍历
    System.out.println("倒序遍历");
    for (int i = list.size() - 1; i >= 0; i--) {
        System.out.println(list.get(i));
    }

    //方法五 迭代器遍历
    System.out.println("迭代器遍历");
    Iterator<Integer> it = list.iterator();
    while (it.hasNext()) {
        System.out.println(it.next());
    }

    //方法六 List集合自带迭代器
    System.out.println("List集合自带迭代器");
    ListIterator<Integer> listIterator = list.listIterator();
    while(listIterator.hasNext()){
        System.out.println(listIterator.next());
    }
}

4、Java中创建线程有几种方式?

解析:

1、继承Thread类,重写run方法

2、实现Runnable接口,重写run方法

3、 使用Callable接口 和 FutureTask类创建线程

4、通过线程池创建线程

5、谈谈String、SpringBuffer和StringBuilder的区别?

解析:

(1)String为固定长度的字符串,StringBuffer和StringBuilder为变长字符串;

(2)String中的对象是不可变的,也可以理解为常量,线程安全。

StringBuffer是线程安全的,它的所有公开方法都是同步的(Synchronized),而StringBuilder 是没有对方法加锁同步的,因此StringBuilder的性能要大于StringBuffer。

(3)String适用于少量的字符串操作的情况。

StringBuilder适用于单线程下在字符缓冲区进行大量操作的情况。

StringBuffer适用多线程下在字符缓冲区进行大量操作的情况。

6、sleep()和wait()有什么区别?

解析:

1、相同点:sleep()和wait()都可以暂停线程的执行。

2、不同点:

所在类不同

sleep()是Thread类的静态方法;wait()是Object类的方法。

锁释放不同

sleep()是不释放锁的;wait()是释放锁的。

用途不同

sleep()常用于一定时间内暂停线程执行;wait()常用于线程间交互和通信。

用法不同

sleep()方法睡眠指定时间之后,线程会自动苏醒。

wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。

7、synchronized和Lock的区别?

解析:

Lock是一个接口,而synchronized是关键字。

synchronized会自动释放锁,而Lock必须手动释放锁。

Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。

通过Lock可以知道线程有没有拿到锁,而synchronized不能。

Lock能提高多个线程读操作的效率。

synchronized能锁住类、方法和代码块,而Lock是块范围内的

8、Java异常处理中的try、catch、throw、throws和finally分别代表什么意义?

解析:

try指定预防所有“异常”的程序;

catch来指定要捕捉的“异常”类型;

throw 用来明确地抛出一个“异常”;

throws用来声明可能抛出的异常;

finally为确保一段代码不管发生什么“异常”都被执行。

9、Mybatis是如何防止SQL注入的?

解析:编写mybatis的映射语句时,尽量采用#{xxx}这样的格式

10、谈谈token和jwt的区别?

解析:token和jwt都是用来访问资源的令牌凭证,需要验证来确定身份信息

服务端验证客户端发送的token信息要进行数据的查询操作,Jwt验证客户端发来的token就不用,在服务端使用密钥校验就可以了,不用数据库的查询。

11、Redis中有哪些数据类型?

解析:常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。扩展【随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。】

12、请从软件原理分析spring mvc框架比struts框架优势在哪里?

解析:

1、springMVC安全性更高,structs2框架是类级别的拦截,每次request请求structs2都会为之创建一个action,然后将数据注入到实体been中,所以在structs2中,一个action对应一个request上下文。springMVC是方法级别的拦截,每个request对应一个方法,然后通过注解将数据注入到对应的实体中,所以在springMVC中,一个方法对应一个request上下文,粒度更小,所以说springMVC更安全

2、springMVC直接使用注解的方式,配置更加的简洁清晰,structs2将所有路径配置放在structs.xml文件中,多人开发的时候更容易产生冲突,配置相对复杂,但这也是structs2的一个优点,就是可以在这个文件中找到所有的路径。

3、springMVC的异常处理机制更加的优秀。Structs2因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理;在springMVC中采用统一的异常处理框架,配置异常处理之后直接在执行方法中抛出对应的异常,更加的准确,显示更加友好的用户界面提示。

4、相对于Structs2,springMVC的参数传递更加方便。springMVC直接使用对应的实体去接收form提交的表单信息,而structs2要在form中指定对应的实体,否则structs无法区分form中的数据对应哪个实体

13、Ajax作用有哪些?请写出Ajax请求流程

解析:

Ajax主要作用:

1.不刷新页面而更新网页(局部刷新)
2.在页面加载后从服务器请求数据
3.在页面加载后从服务器接收数据
4.在后台向服务器发送数据

ajax请求的基本流程

要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤:

1.创建 XMLHttpRequest 请求对象, 即创建一个异步调用对象。( new XMLHttpRequest() )

2.打开请求地址,指定请求方式。(open)

3.设置响应HTTP请求状态变化的函数.

4.发送HTTP请求。(send)

5.监听对应的请求状态的变化。( readystatechange事件 )

6.读取响应数据,使用 JavaScript 和 DOM 实现局部刷新。

14、从虚拟机原理分析实现Java虚拟机的好处是什么?

解析:

1、JVM 是Java平台的核心组件。JVM 的作用是执行 Java 字节码,它是一种解释器,负责执行 Java 程序。JVM 是跨平台的,因此 Java 程序可以在任何具有 JVM 的系统上运行,而无需对代码进行修改。
2、JVM 是一种字节码解释器,通过将 Java 程序编译成字节码,并在 JVM 上运行这些字节码来执行程序。JVM 提供了一组标准的指令集,并通过管理内存来实现自动内存管理,消除了内存泄漏的风险。
3、JVM 也具有很强的安全性。它限制了 Java 程序的权限,确保它不能损害系统的安全或隐私,并确保程序不能访问不属于它的资源。
4、此外,JVM 还提供了一组管理工具,以监控和管理 Java 程序的性能。例如,它可以监控程序的内存使用情况,并自动回收不再使用的内存,以确保程序始终保持高效。

15、根据线程安全的相关知识,分析以下代码,当调用test方法时,i>10时是否会引起死锁?并简要说明理由。

public void test (int i)
{
         lock(this)
     {
       if ( i>10)
         {
           i--;
           test( i );
          }
      }
 }

解析:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

16、Session有几种存储方式,有什么不同?

17、面向对象的核心思想是什么?请你谈谈你在实战中是如何应用好这些核心思想的?

解析:将对象作为程序的基本单元,将程序和数据封装在其中,以提高软件的复用性,灵活性以及可扩展性

18、请你谈谈你对软件架构、框架的理解,并谈谈他们之间的区别和联系。

29、float f =3.4;是否正确? short s1=1;s1=s1+1;有错吗? short s1=1;s1+=1;有错吗?

20、Spring Boot的核心配置文件有哪几个?核心注解是哪个?它主要由哪几个注解组成的?

21、Spring Boot有几种读取配置的方式?SpringBoot的Actuator是做什么的?

22、Mybatis的缓存机制有哪些?和Redis的缓存机制相比有什么不同?

23、Activiti工作流的核心对象是什么?

24、RepositoryService、RuntimeService、TaskService、HistoryService、ldentityService分别表示什么操作?

25、谈谈你对数据库中的事务的理解。

26、介绍一下volatie的特征

27、介绍一下Callable和Future的用法

28、说明一下mybatis的#和$的区别

29、如何实现负载均衡,有哪些算法可以实现

30、什么是乐观锁和悲观锁

31、Spring框架用到哪些设计模式,请详细描述。

32、在多线程中如何线程同步?

33、下面一段程序会输出什么?

 class A
{      
        protect int val = 1000;
       
         static
         {
                  System.out.println("A  static");
          }
         public  A (  )
         {
                       val++;  
                        System.out.println("A  construtor( ),val="+val);
          }
         public void display( )
         {
      val++;
      System.out.println("A display( ),val="+val);
          }
}
class B extends A
{
        static 
       {
             System.out.println("B  static");    
       }
        public B(  )
       {
            val++;
            System.out.println("A  display( ),val="+val);
        }
        public void display(  )
       {
             val++;
             System.out.println("B  display( ),val="+val);
        }
}
public class Test
{
     public static  void main (String args[ ])
     {
          A    a = new B( );
           a.display (  );
     }
}

34、简述JSP的内置对象及方法

36、列出常用JSTL标签

37、列举使用过的jQuery插件

38、介绍一下jQuery的选择器

39、说出几种vue当中的指令和它的用法

40、Vue父子组件如何传递参数

41、v-show和v-if指令的共同点和不同点

42、请详细说下你对vue生命周期的理解

43、列举ORACLE中常用的函数

44、谈谈MVC的理解

45、列举一些常用的JAVA开源项目及作用

46、浅谈系统之间接口数据交互处理方案

47、浅谈JDK8特性的理解

48、浅谈Tomcat单体应用快速改造集群的方案

49、浅谈系统优化和迭代

50、浅谈对单体应用、集群、分布式系统的理解

51、浅谈MybatisPlus2 和MybatisPlus3的区别

52、浅谈Docker的理解和经验

53、浅谈Bladex使用

54、浅谈Hibernate使用经验

55、浅谈多模块项目构建

56、请简述如何使用关系型数据库实现实体多对多关联关系和继承关系

57、如下代码,有什么错误,请说明原因,并修改为正确代码(Number是Integer的父类)

public class Playground {
    public static void printList(List<Number> list) {
    	//TODO
	}

    public static void main(String[] args) {
        List<Integer> li = Arrays.asList(1, 2, 3);
        printList(li);
    }
}

58、如下代码是否合法,请从语法角度解释如下代码,并修改为Java 8函数式写法:

Runnable mRunnable = new Runnable() { 
	@Override 
    public void run() { 
          System.out.println("Run!");
    } 
}; 

59、请简述你了解的排序算法及原理

60、当对一个相对有序的数组进行排序时,使用哪种排序算法更好,并阐述理由。

61、Linux中,如何创建用户和设置密码

62、请描述Spring有bean的声明方式和几种依赖注入方式,并每一种举一个例子,包括配置和获取代码(可以使用基于XML的配置方式,基于注解的配置方式,基于Java的配置方式中任何一种)。

63、SpringMVC接收客户端请求参数的方式有几种,请写出示例代码。

64、你用过哪些设计模式?在什么场合下用的?请举例说明
65、假如让你去开发一个系统,你会如何估算系统的最大并发数﹖以及给出对应的解决方案?

66、面向对象编程中的类有哪些特性?

解析:封装、继承、多态、抽象。

67、什么是双亲委派机制?tomcat如何打破双亲委派机制?

68、请列举数据结构中常用的线性结构和非线性结。

69、请将excel中的学生成绩表(十万条)批量导入到数据库中(oracle或mysql任选其一),如果使用工具请说明操作步骤,如果是编程实现,请列出关键代码。

70、java中final修饰变量,方法,类的时候有什么不同?

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值