Java面试题一

(此系列试题来源于Java面试宝典书籍)

一、选择题

1. Java中,负责对字节码解释执行的是

  • A. 应用服务器
  • B. 虚拟机
  • C. 垃圾回收器
  • D. 编译器

解析:

1) 程序员写java程序时,写的都是.java格式文件,当以txt格式文件直接写java文件,文件名格式为.java,由cmd写入javac编译文件(成.class--二进制文件),最后由java + "文件名"可运行编译成后的.class文件。当直接使用编译软件写程序时,写的原始程序的格式也是.java,只不过运行时先编译成.class再进行运行的

2) 字节码文件由虚拟机进行执行

2. 一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈输出的序列的是

  • A. 5 4 1 3 2
  • B. 2 3 4 1 5
  • C. 1 5 4 3 2
  • D. 2 3 1 4 5

解析:注意的是输入序列不能代表进栈顺序,栈是后进先出

  • A. 当5最先出栈,则栈的输出序列必然是5 4 3 2 1 
  • B. 1 2先进栈,2出栈,3进栈,3出栈,4进栈,4出栈,1出栈,5进栈,5出栈,最后为2 3 4 1 5
  • C. 1进栈,1出栈,2 3 4 5进栈,5 4 3 2出栈,最后为1 5 4 3 2
  • D. 1 2进栈,2出栈,3进栈,3出栈,1出栈,4进栈,4出栈,5进栈,5出栈,最后为2 3 1 4 5

3. 下列哪一个选项按照顺序包括了OSI模型的7个层次

  • A. 物理层、数据链路层、传输层、网络层、会话层、表示层、应用层
  • B. 物理层、数据链路层、会话层、网络层、顺序层、表示层、应用层
  • C. 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
  • D. 网络层、传输层、物理层、数据链路层、会话层、表示层、应用层

解析:OSI  open system interconnection

https://www.cnblogs.com/qishui/p/5428938.html   作者:钛白Logic

  • 物理层:建立、维护和断开物理连接
  • 数据链路层:建立逻辑连接、解析硬件地址寻址、差错校验等功能
  • 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择
  • 传输层:定义传输数据的协议端口号,以及流控和差错校验
  • 会话层:建立、管理、终止会话
  • 表示层:数据的表示、安全、压缩
  • 应用层:网络服务与最终用户的一个接口

TCP/IP五层模型

4. 当客户端关闭一个从连接池中获取的连接,会发生下面哪一种情况

  • A. 连接不会关闭,只是简单地归还给连接池
  • B. 连接被关闭,但又被重新打开并归还给连接池
  • C. 连接永久性关闭

解析:

关系数据库中连接池的机制

  • 从连接池获取或创建可用连接

  • 使用完毕之后,把连接返回给连接池

  • 在系统关闭前,断开所有连接并释放连接占用的系统资源

  • 能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值

5. 以下哪些不是javascript的全局函数

  • A. eval
  • B. escape
  • C. setTimeout
  • D. parseFloat

解析:

https://www.runoob.com/jsref/jsref-obj-global.html   菜鸟教程

6. 使用mkdir命令创建一个临时的文件夹/tmp/aaa,并将一些文件复制其中,使用完后要删除/mnt/tmp文件夹及其中的所有文件,应该使用命令

  • A. rm /tmp/aaa
  • B. rm -r /tmp/aaa
  • C. rmdir -r /tmp/aaa
  • D. rmdir /tmp/aaa

解析:

  • rm 文件名:可以删除文件
  • rmdir 文件名:可以删除文件夹,但是文件夹里面的内容不为空的话无法执行
  • rm -r 文件名:会删除文件夹和里面的内容
  • mkdir -p test/test2/test3:创建多层文件夹
  • rmdir -p test/test2/test3: 删除多层文件夹

7. UML图,用于按数据顺序描述对象间的交互的图是

  • A. 协作图
  • B. 网络图
  • C. 序列图
  • D. 状态图

解析:

  • 用例图:描述角色以及角色与用例之间的连接关系。说明的是谁要使用系统,以及他们使用该系统可以做些什么。一个用例图包含了多个模型元素,如系统、参与者和用例,并且显示了这些元素之间的各种关系,如泛化、关联和依赖
  • 类图: 类图是描述系统中的类,以及各个类之间的关系的静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。类图是一种模型类型,确切的说,是一种静态模型类型
  • 对象图:与类图极为相似,它是类图的实例,对象图显示类的多个对象实例,而不是实际的类。它描述的不是类之间的关系,而是对象之间的关系
  • 活动图:描述用例要求所要进行的活动,以及活动间的约束关系,有利于识别并行活动。能够演示出系统中哪些地方存在功能,以及这些功能和系统中其他组件的功能如何共同满足前面使用用例图建模的商务需求
  • 状态图:描述类的对象所有可能的状态,以及事件发生时状态的转移条件。可以捕获对象、子系统和系统的生命周期。他们可以告知一个对象可以拥有的状态,并且事件(如消息的接收、时间的流逝、错误、条件变为真等)会怎么随着时间的推移来影响这些状态。一个状态图应该连接到所有具有清晰的可标识状态和复杂行为的类;该图可以确定类的行为,以及该行为如何根据当前的状态变化,也可以展示哪些事件将会改变类的对象的状态。状态图是对类图的补充
  • 序列图(顺序图):序列图是用来显示你的参与者如何以一系列顺序的步骤与系统的对象交互的模型。顺序图可以用来展示对象之间是如何进行交互的。顺序图将显示的重点放在消息序列上,即强调消息是如何在对象之间被发送和接收的
  • 协作图:和序列图相似,显示对象间的动态合作关系。可以看成是类图和顺序图的交集,协作图建模对象或者角色,以及它们彼此之间是如何通信的。如果强调时间和顺序,则使用序列图;如果强调上下级关系,则选择协作图;这两种图合称为交互图
  • 构件图: 描述代码构件的物理结构以及各种构建之间的依赖关系。用来建模软件的组件及其相互之间的关系,这些图由构件标记符和构件之间的关系构成。在组件图中,构件时软件单个组成部分,它可以是一个文件,产品、可执行文件和脚本等
  • 部署图:是用来建模系统的物理部署。例如计算机和设备,以及它们之间是如何连接的。部署图的使用者是开发人员、系统集成人员和测试人员

8. 系统并发访问数据估算数据哪一个最有效

  • A. 高峰时段日处理业务量 100000

  • B. 高峰时段平均每秒请求数 80

  • C. 同时在线用户 100

  • D. 平均每秒用户请求 50

解析:这题是搞笑的吗?前提条件呢。。。

https://blog.csdn.net/apensu/article/details/50921051   作者:apensu

9. 不同级别的用户对同一对象拥有不同的访问权力或某个客户端不能直接操作到某个对象,但有必须和那个对象有所互动,这种情况最好使用什么模式

  • A. Bridge
  • B. Facade
  • C. adapter
  • D. proxy

解析:

http://c.biancheng.net/view/1359.html   

10. 哪个Set是排序的

  • A. LinkedHashSet
  • B. HashSet
  • C. TreeSet
  • D. Abstract

解析:

https://blog.csdn.net/xiaofei__/article/details/53138681   作者:晓锋残月

Set集合是无序的,但是TreeSet支持两种排序方式(它继承于AbstractSet,实现了NavigableSet<E>,Cloneable,Serializable接口)

  • 自然排序:会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合的元素按升序排列
  • 定制排序:自定义比较器

二、编程题

1. 用1 2 2 3 4 5这6个数字,用java写一个main函数,打印所有不同的排列,如 512234,412345,要求4不能再第三位,3与5不能相连

import java.util.Iterator;
import java.util.TreeSet;

public class NumberRandom {

    private String[] stra = {"1","2","2","3","4","5"};
    private int n = stra.length;
    private boolean[] visited = new boolean[n];
    private String result = "";
    private TreeSet<String> ts = new TreeSet<>();
    private int [][] a = new int[n][n];

    private void searchMap(){
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                if (i == j){
                    a[i][j] = 0;
                }else {
                    a[i][j] = 1;
                }
            }
        }

        // 3和5不能相连
        a[3][5] = 0;
        a[5][3] = 0;

        // 开始遍历
        for (int i=0;i<n;i++){
            search(i);
        }
        // 第一种迭代方式
//        Iterator<String> it = ts.iterator();

//        while(it.hasNext()) {
//            String str = it.next();
//
//            // 4不能在第三位
//            if (str.indexOf("4")!= 2){
//                System.out.println(str);
//            }
//        }
        // 第二种迭代方式
        for (String str:ts) {
            // 4不能在第三位
            if (str.indexOf("4")!= 2){
                System.out.println(str);
            }
        }


    }

    private void search(int startIndex) {
        visited[startIndex] = true;
        result = result + stra[startIndex];
        if (result.length() == n){
            ts.add(result);
        }

        for (int j=0;j<n;j++){
            if (a[startIndex][j] == 1 && !visited[j]){
                search(j);
            }
        }

        // 一个 result 结束后踢掉最后一个,寻找别的可能性,若没有的话,则继续向前踢掉当前最后一个
        result = result.substring(0,result.length()-1);
        visited[startIndex] = false;
    }

    public static void main(String[] args) {
        new NumberRandom().searchMap();
    }
}
public class NumberRandom2 {

    private static String[] includeNums = new String[]{"1","2","2","3","4","5"};

    private static boolean isValidNumber(String str){
        // 检查是否包含12345这5个数,不包含返回false
        for (String s:includeNums) {
            if (str.indexOf(s) < 0){
                return false;
            }
        }

        // 检查是否有两个2,只有一个返回false
        if (str.lastIndexOf("2") == str.indexOf("2")){
            return false;
        }
        
        // 检查4在不在第三位,返回false
        if (str.charAt(2) == '4'){
            return false;
        }
        
        // 检查35是否在一起,在返回false
        if (str.indexOf("35") >=0 || str.indexOf("53") >= 0){
            return false;
        }
        
        return true;
    }

    public static void main(String[] args) {
        for (int i = 122345;i<=543221;i++){
            if (isValidNumber(String.valueOf(i))){
                System.out.println(i);
            }
        }

    }
}

2. 一个数如果恰好等于它的因子之和,这个数称为"完整"。例如6=1+2+3。编程找出1000以内的所有的完数。

import java.util.ArrayList;
import java.util.List;

public class wanshuTest {

    private static int isWanshu(int num){

        int sum = 0;

        List<Integer> l = new ArrayList<>();
        for (int i=1;i<num;i++){
            if (num % i == 0){
                l.add(i);
            }
        }

        // 遍历List
        for (int i:l) {
            sum += i;
        }

        if (sum == num){
            return sum;
        }

        return 0;
    }

    public static void main(String[] args) {

        for (int i = 1;i<=1000;i++) {
            if (isWanshu(i)!=0){
                System.out.println(i);
            }
        }

    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值