我是靠谱客的博主 大气毛衣,最近开发中收集的这篇文章主要介绍java笔试题(题目+解析)测试一,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

测试一

  • 选择题(不定项,每题2分,共20分)

1.不能用来修饰interface的有( ACD )

A.private

B.public

C.protected

D.static

解答:ACD

修饰接口可以是public和默认

2.在关系数据库系统中,为了简化用户的查询操作,而又不增加数据的存储空间,常用的方法是创建( C )

A.表(table)

B.游标(cursor)

C.视图(view)

D.索引(index)

解析:数据库试图具有以下几个作用:简化用户操作;使用户能以多种角度看待同一数据;支持重构数据库的逻辑独立性;视图能够提供安全保护同时不增加数据的储存空间

3.下面有关SPRING的事务传播特性,说法错误的是?( B )

A.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行

B.PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常

C.PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起

D.PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚

解析:Spring的API设计很不错,基本上根据英文翻译就能知道作用:Required:必须的。说明必须要有事物,没有就新建事物。supports:支持。说明仅仅是支持事务,没有事务就非事务方式执行。mandatory:强制的。说明一定要有事务,没有事务就抛出异常。required_new:必须新建事物。如果当前存在事物就挂起。not_supported:不支持事物,如果存在事物就挂起。never:绝不有事务。如果存在事物就抛出异常

4.下面有关struts1和struts2的区别,描述错误的是?(  B  )

A.Struts1要求Action类继承一个抽象基类。Struts 2 Action类可以实现一个Action接口

B.Struts1 Action对象为每一个请求产生一个实例。Struts2 Action是单例模式并且必须是线程安全的

C.Struts1 Action 依赖于Servlet API,Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试

D.Struts1 整合了JSTL,Struts2可以使用JSTL,但是也支持OGNL

解析:从action类上分析:
1.  Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 
   2. Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。
从Servlet 依赖分析: 
   3. Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 
   4. Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
从action线程模式分析: 
   5. Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 
   6. Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

5.以下关于子查询和Group By的描述正确的有(   A B C D   )

A.没有出现在Group By子句后面的列名不能出现在Select字句非合计函数表达式中

B.在Select子句的后面,只能有两种类型的表达式,一种是合计函数,一种是出现在Group By子句后面的列名

C.不能在子查询中包含Order By 子句

D.如果子查询的结果为空,那么外查询条件始终不会成立

解析:group by:在select子句中只能有两种类型表达式,一种是合计函数,一种是出现在group by子句后面的列名,没有出现在group by子句后面的列名不可以出现在select 子句的非合计函数表达式中。如果在select语句中没有出现group by子句,则不能在select子句中同时出现单个列名和合计函数的混合现象。如果要限制分组中的数据,则可以使用having子句而不能使用where子句

6.以下选项属于进程间通信的是(   ABD   )

A.管道

B.套接字

C.内存

D.消息队列

解析:进程中的几种通信方式:

1)管道:管道是一种半双工的通信方式,数据只能单向流动。而且只能在具有血缘关系(父子进程之间)的的进程间使用。

2)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问

3)消息队列:消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识

4)信号:信号是有一种比较复杂的通信方式,用于通知接收进程某一事件已经发生

5)共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问

6)套接字:即Socket,是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行

7.下面程序运行之后,x的值是( A  )

void swap(int a, int b)

{

    int t = a;

    a = b;

    b = t;

}

    …

int x = 2;

int y = 3;

swap(x, y);

A. 2           B.3          C.5          D.6

解析:值参数传递不能实现交换两个整数,所以X最后还是2,想要实现两个值交换可以已数组的形式实现

8.看以下代码:

文件名称:forward.jsp

  <html>  

     <head><title> 跳转  </title> </head

     <body>  

         <jsp:forward page="index.htm"/>     

     </body>

 </html

如果运行以上jsp文件,地址栏的内容为(  A  )

A.http://127.0.0.1:8080/myjsp/forward.jsp

B.http://127.0.0.1:8080/myjsp/index.jsp

C.http://127.0.0.1:8080/myjsp/index.htm

D.http://127.0.0.1:8080/myjsp/forward.htm

解析:

forward和redirect是最常问的两个问题

forward,服务器获取跳转页面内容传给用户,用户地址栏不变

redirect,是服务器向用户发送转向的地址,redirect后地址栏变成新的地址

因此这个题是A

redirect:请求重定向:客户端行为,本质上为2次请求,地址栏改变,前一次请求对象消失。举例:你去银行办事(forward.jsp),结果告诉你少带了东西,你得先去警察局办(index.html)临时身份证,这时你就会走出银行,自己前往警察局,地址栏变为index.html.

forward:请求转发:服务器行为,地址栏不变。举例:你把钱包落在出租车上,你去警察局(forward.jsp)报案,警察局说钱包落在某某公司的出租车上(index.html),这时你不用亲自去找某某公司的出租车,警察局让出租车自己给你送来,你只要在警察局等就行。所以地址栏不变,依然为forward.jsp

9.下列说法错误的有(  ACD  )

A. 在类方法中可用this来调用本类的类方法

B. 在类方法中调用本类的类方法时可直接调用

C. 在类方法中只能调用本类中的类方法

D. 在类方法中绝对不能调用实例方法

解答:ACD

A.在类方法中不能使用this关键字

C.在类方法中可以调用其它类中的类方法

D.在类方法中可以通过实例化对象调用实例方法

10.下面能让线程停止执行的有(多选)(  ABDEF  )

A. sleep();

B. stop();

C. notify();

D. synchronized();

E. yield();

F. wait();

G. notifyAll();

解答:ABDEF

sleep:导致此线程暂停执行指定时间

stop: 这个方法将终止所有未结束的方法,包括run方法。

synchronized():对象锁

yield:当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield。

wait:当前正在被服务的线程需要睡一会,醒来后继续被服务

  • 填空题(每题2分,共20分)

1 Java语言的各种数据类型之间提供两种转换,自动转换和    强制转换    
2 Java 中使用关键字 定义抽象类      abstract             
3 java方法中参数传递的原则有2种,一种是    按值传递  ,另一种是   按引用传递   
4 用static修饰的方法,称为静态方法。它们不是对象的方法,而是整个类的方法。静态方法只能处理用关键字    static    修饰的数据。

5 在Java中有一种叫作  构造函数  特殊方法,我们在程序中用它来对类的对象成员进行初始化。
6 被关键字___final_______修饰的方法是不能被当前类的子类重新定义的方法
7 Java程序中整数常量默认是    int    类型,浮点数默认的是    double   类型 
8 main方法的声明格式     public static void main(String[] args)    
9 Java中所有类都是    java.lang.object    的子类。
10 定义接口的关键字是      interface     

  • 简答题(每题5分,30分)

1.什么叫死锁,怎么解决死锁

  死锁:有两个进程A和B,A持有资源a等待b资源,B持有资源b等待a资源,两个进程都在等待另一个资源的同时不释放资源,就形成死锁。

形成死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

 解决:

1.首先一个可行的做法是释放所有锁,回退,并且等待一段随机的时间后重试。这个和简单的加锁超时类似,不一样的是只有死锁已经发生了才回退,而不会是因为加锁的请求超时了。

2.回退和等待,但是如果有大量的线程竞争同一批锁,它们还是会重复地死锁(注:原因同超时类似,不能从根本上减轻竞争)。

3.一个更好的方案是给这些线程设置优先级,让一个(或几个)线程回退,剩下的线程就像没发生死锁一样继续保持着它们需要的锁。如果赋予这些线程的优先级是固定不变的,同一批线程总是会拥有更高的优先级。为避免这个问题,可以在死锁发生的时候设置随机的优先级。

2.什么是事务,事务的特性,什么叫ACID

  事务:逻辑单元内的一系列操作,要么全部完成执行,要么全部不执行。

事务的结果有两种:当事务中的所有步骤全部成功执行完成时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消之前到事务开始时的所有操作。

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。事务分为数据库级别的事务和应用程序级别的事务,数据库管理员处理的是数据库级别的事务,Java程序员处理的是应用程序级别的事务。Spring 事务管理分为 编程式事务管理 和 声明式事务管理 的两种方式。

    事务的四大特性(ACID):原子性(Atomicity一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 原子性A-Atomicity  事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
  • 一致性(C-Consistency)   事务开始前和结束后,数据库的完整性约束没有被破坏 。
  • 持久性(I-Isolation)  事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
  • 隔离性(D-Durability)   同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰

3.Activiti和Shiro的作用

Shiro: 

      用户认证  登录   拦截器

 资源授权    资源表示系统中所有的可访问的菜单

Activiti:

      解决多个任务人共同完成复杂的业务流。 他是一个业务框架

4.TCP和UDP协议的区别,什么是三次握手。

1.基于连接与无连接;
2.对系统资源的要求(TCP较多,UDP少);
3.UDP程序结构较简单;
4.流模式与数据报模式 ;
5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

 所谓的“三次握手”:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。

5.多线程同步有几种方法。

   多线程的实现方法有继承Thread类,实现Runnable接口,实现Callable接口。

同步可以使用Synchronized关键字,也可以使用可重入锁ReentrantLock,ThreadLocal同步机制也可以实现同步。

6.RPC服务和restful服务的区别(建议加深对rpc和restful的了解)

1、从本质区别上看,RPC是基于TCP实现的,RESTFUL是基于HTTP来实现的。

2、从传输速度上来看,因为HTTP封装的数据量更多所以数据传输量更大,所以RPC的传输速度是比RESTFUL更快的。

3、因为HTTP协议是各个框架都普遍支持的。在toC情况下,因为不知道情况来源的框架、数据形势是什么样的,所以在网关可以使用Restful利用http来接受。而在微服务内部的各模块之间因为各协议方案是公司内部自己定的,所以知道各种数据方式,可以使用TCP传输以使各模块之间的数据传输更快。所以可以网关和外界的数据传输使用RESTFUL,微服务内部的各模块之间使用RPC。

4、RESTFUL的API的设计上是面向资源的,对于同一资源的获取、传输、修改可以使用GET、POST、PUT来对同一个URL进行区别,而RPC通常把动词直接体现在URL上

  • 编程题(每题10分,共30)

1.题目描述

查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天(sqlite里面的注释为--,mysql为comment)

emp_no

birth_date

name

gender

hire_date

10008

1958-02-19

Kalloufi

M

1994-09-15

求:

(1).创建如上employee表,设置emp_no为主键(2分)

     CREATE TABLE `employee`  (

         `emp_no` int(11) NOT NULL,

        `birth_date` date NULL DEFAULT NULL,

       `name` varchar(16) NOT NULL,

      `gender` varchar(16) NOT NULL,

     `hire_date` date NULL DEFAULT NULL,

     PRIMARY KEY (`emp_no`)

)

(2)写SQL语句插入5条数据(2分)

INSERT INTO employee VALUES (1008,'1958-02-19','Kalloufi','M','1994-09-15');

INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');

INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');

INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');

INSERT INTO employee VALUES (VALUE,'VALUE','VALUE','VALUE','VALUE');

(3)查找最晚入职员工的所有信息(3分)

SELECT *

FROM employee

WHERE hire_date = (SELECT MAX(hire_date) FROM employee)

(4) 将编号为1008的员工改名为Mally(3分)

UPDATE employee SET NAME='Mally' WHERE emp_no=1008

2.输入某年某月某日,判断这一天是这一年的第几天?(10分)

  程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

  参考代码:

  

import java.util.*;

public class test {

public static void main (String[]args){

int day=0;

int month=0;

int year=0;

int sum=0;

int leap;   

System.out.print("请输入年,月,日n");   

Scanner input = new Scanner(System.in);

year=input.nextInt();

month=input.nextInt();

day=input.nextInt();

switch(month) /*先计算某月以前月份的总天数*/  

{   

case 1:

sum=0;break;   

case 2:

sum=31;break;   

case 3:

sum=59;break;   

case 4:

sum=90;break;   

case 5:

sum=120;break;   

case 6:

sum=151;break;   

case 7:

sum=181;break;   

case 8:

sum=212;break;   

case 9:

sum=243;break;   

case 10:

sum=273;break;   

case 11:

sum=304;break;   

case 12:

sum=334;break;   

default:

System.out.println("data error");break;

}   

sum=sum+day; /*再加上某天的天数*/  

if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/  

leap=1;   

else  

leap=0;   

if(leap==1 && month>2)/*如果是闰年且月份大于2,总天数应该加一天*/  

sum++;   

System.out.println("It is the the day:"+sum);

}

}

3.题目描述本题知识点:二分法,10分

牛牛从小就有收集魔法卡的习惯,他最大的愿望就是能够集齐 k 种不同种类的魔法卡,现在有 n 张魔法卡,这 n 张魔法卡存在于一维坐标点上,
每张魔法卡可能属于某一种类。牛牛如果想收集魔法卡就需要从当前坐标点跳跃到另外一个魔法卡所在的坐标点,花费的代价是两个跳跃坐标点之间的距离差。

牛牛可以从任意的坐标点出发,牛牛想知道他集齐 k 种魔法卡所花费的最小代价是多少,如果集不齐 k 种魔法卡,输出-1。

第一行输入两个整数 n,k, 分别表示魔法卡的个数和种类个数。
接下来有n行,每行两个数x,y 分别表示属于哪一种魔法卡和魔法卡所在的坐标

示例1

输入

7,3,[[0,1],[0,2],[1,5],[1,1],[0,7],[2,8],[1,3]]

输出

3

说明

样例一:牛牛从坐标点5出发,经过7、8两个点就收集了3张不同种类的魔法卡,达成成就。
所需代价 (7-5)+(8-7) = 3

备注:

其中 1<=n<=10^6, 1<=k<=50
0<=x<k, 0<=y<=1e9

参考代码:  

import java.util.*;

public class Solution {

    /**

     * @param n int整型

     * @param k int整型

     * @param card int整型二维数组

     * @return int整型

     */

   public static int solve (int n, int k, int[][] card) {

        if (card == null || n < k) return -1;

        int minDistance = -1;

        Arrays.sort(card,(o1, o2) -> o1[1] == o2[1] ? o1[0] - o2[0] : o1[1] - o2[1]);

        //Utils.print2DArray(card);

        HashMap<Integer,Integer> map = new HashMap<>();

        int right = -1,left = 0;

        while (right < card.length - 1) {

            right++;

            map.put(card[right][0],map.getOrDefault(card[right][0],0) + 1);

            //left去重

            while (map.get(card[left][0]) > 1) {

                map.put(card[left][0],map.get(card[left][0]) - 1);

                if (map.get(card[left][0]) == 0) {

                    map.remove(card[left][0]);

                }

                left++;

            }

            if (map.size() == k) {

                //已经凑齐

                int end = card[right][1],start = card[left][1];

                minDistance = minDistance == -1 ? end - start : Math.min(minDistance,end - start);

            }

        }

        return minDistance;

    }

}

最后

以上就是大气毛衣为你收集整理的java笔试题(题目+解析)测试一的全部内容,希望文章能够帮你解决java笔试题(题目+解析)测试一所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部