技术类—Java笔试题2018

1写一个Singleton出来,你知道几种Singleton模式?
public class Singleton {
    private Singleton(){
    }
    private static volatile Singleton instance = null;
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
根据此单一实例产生的时机不同,可以将其分为懒汉式、饿汉式和登记式。
2.当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法?
可以。synchronized关键字用来给对象和方法或者代码块加锁。当一个线程进入一个对象的一个synchronized方法后,其他线程要访问此方法时都要等待之前的线程执行结束。此时synchronized封锁的时该方法而不是该对象,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。
3.两个对象值相同(x.equals(y)true),但却可有不同的hash code,这句话对不对?
不对。如果两个对象根据equals方法比较是相等的,那么调用两个对象的hashCode方法必须返回相同的整数结果。如果两个对象根据equals方法比较是不等的,则hashCode方法不一定得返回不同的整数。
4.从M个数中随机取N个不重复的数?
int[] x=new int[N];
      x[0]=(int)(Math.random()*M)+1;
         
       for(int j=1;j<N;)
       {
            x[j]=(int)(Math.random()*13)+1;
            int m=0;
            for(int i=0;i<j;i++)
            {
              if(x[j]!=x[i])
                  m++;
              else
                  m=0;
            }
            if(m
j)
              j++;
          } 
5.swtich是否能作用在byte上,是否能作用在long上,能否作用在String上?
可以作用在byte和String上。不能作用在long上。因为long的精度太高,转化为int时会丢失精度。
6.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递。当一个对象被当作参数传递到一个方法,是把这个对象在内存中的地址拷贝了一份传给了参数。
7.heap和stack有什么区别?
每个应用程序运行时,都有属于自己的一段内存空间,用于存放临时变量、参数传递、函数调用时的PC值的保存。这叫stack。 
(2)所有的应用可以从一个系统共用的空间中申请供自己使用的内存,这个共用的空间叫heap。 
(3)stack中的对象或变量只要定义好就可使用了,应用程序结束时会自动释放。 
(4)而要使用heap中申请的变量或对象只能定义变量指针,并要求在运行过程中通过new来动态分配内存空间,而且必须显示地free你申请过的内存,不过Java的垃圾回收机解决了这个问题,它会帮你释放这部分内存。 
(5)stack中变量的大小和个数会影响exe的文件大小,但速度快。堆中的变量大小与exe大小关系不大,但分配和释放需要耗费的时间远大于stack中分配内存所需的时间。
8.ArrayList和Vector的区别,Hash和Hashtable的区别?

Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
线程安全性不同 hashmap线程不安全 hashtable线程安全
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey
Hashtable则保留了contains。
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值
内部实现使用的数组初始化和扩容方式不同
 Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

9.启动一个线程是用run()还是start()?
启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状.当cpu分配给它时间时,才开始执行run()方法(如果有的话)
10.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
11.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来
public class Node {
    public int key;
    public Node left;
    public Node right;
     
    public Node(int key){
        this.key = key;
    }
     
    public String toString(){
        return "my key is "+key;
    }
}
public class Tree {
    public Node root;
     
    public Node findNode(Node node){
        Node current = root ;
        while (current.key != node.key) {
            if (current.key > node.key) {
                current = current.left;
            } else {
                current = current.right;
            }
             
            if (current == null) {
                return null;
            }
        }
         
        return current;
    }
     
    public void insertNode(Node node){
        if (root == null) {
            root = node;
        } else {
            Node current = root;
            Node parent ;
             
            while (true) {
                parent = current;
                 
                if (current.key > node.key) {
                    current = current.left;
                     
                    if (current == null) {
                        parent.left = node;
                        return ;
                    }
                } else {
                    current = current.right;
                     
                    if (current == null) {
                        parent.right = node;
                        return ;
                    }
                }
            }
        }
    }
}

12.多线程有哪些状态?
NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED
13.对哪些数据类型进行过排序,怎么排的序?
Int:冒泡排序
Date:分别对各个部分进行比较,排序
数组;sort
14.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,一是继承Thread类,重写方法run(),二是实现Runnable接口,实现方法run();
同步有两种实现方法,分别是synchronized、wait与notify。
15.什么时候用assert?
在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出.一般来说,assertion用于保证程序最基本、关键的正确性.assertion检查通常在开发和测试时开启.为了提高性能,在软件发布后,assertion检查通常是关闭的.
16.16.垃圾回收的优点和原理?
优点:a.不需要考虑内存管理, b.可以有效的防止内存泄漏,有效的利用可使用的内存, c.由于有垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"
原理:垃圾回收器是作为一个单独的低级别的线程运行,在不可知的情况下对内存堆中已死亡的或者长期没有使用的对象回收,但是不能实时的对某一对象或者所有对象进行垃圾回收。
17.请讲一讲析构函数和虚函数的用法和作用?
析构函数是“反向”的构造函数。它们在对象被撤消(回收)时调用。析构函数的名 称除了最前面的“~”符号外,与类的名称相同。例如,类String的析构函数是~string()。 析构函数通常用于当一个对象不再需要时,完成“消除”功能。
虚拟函数的功能是使子类可以用同名的函数对父类函数进行覆盖,并且在调用时自动调用子类覆盖函数
18.是否知道大小端?
大小端是由硬件决定的,小端主要是x86处理器,大端主要是PowerPC;
大小端是一种字节存储机制;
大端是最重要的字节存储在低地址;
小端是最重要的字节存储在高地址
19.error和exception有什么区别?
Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
20.写一个数据创建表的SQL语句,其中有常见的数据类型。
create table tblstudent(
stuID int primary key,
stuNAME String primary key,
)
21.列一些linux常用的命令,find,grep,ps,sort,top
date du df vim netstat
22.服务器的日志的打印,是否分业务打印过log,性能怎么看?
使用过日志打印,效果不太理想,没有对日志进行分类,日志格式没有固定,看上去繁杂。
23.设计模式知道那些?有哪些是熟练掌握的和使用的?
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。

猜你喜欢

转载自blog.csdn.net/qq_43140093/article/details/83448367