java面试题2018(详细)

1.java基本数据类型:8种
    四种整数类型(byte、short、int、long):
        byte:8 位,用于表示最小数据单位,如文件中数据,-128~127
        short:16 位,很少用,-32768 ~ 32767 
        int:32 位、最常用,-2^31-1~2^31  (21 亿)
        long:64 位、次常用    注意事项:    int i=5; // 5 叫直接量(或字面量),即 直接写出的常数。    整数字面量默认都为 int 类型,            所以在定义的 long 型数据后面加 L或 l。 
    两种浮点数类型(float、double):       
        float:32 位,后缀 F 或 f,1 位符号位,8 位指数,23 位有效尾数。
        double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾    
    一种字符类型(char):    
        char:16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0~2^16-1                        (65535) 。    注意事项:    不能为 0个字符。
    一种布尔类型(boolean):
        boolean:true 真  和 false 假。
2.JDK、JRE、JVM关系是什么?
    JDK:(Java Development Kit):Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。
    JRE:(Java Runtime Environment)即为Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)
    和丰富的系统类库。
    
    JVM:(Java Virtual Machines)即为Java虚拟机,提供了字节码文件(.class)的运行环境支持。 
    
    关系:JDK包含JRE包含JVM。
    
3.javac:是java语言编程编译器。
    全称java compiler。将java文件编译成字节代码的class文件。

4.面向对象的四大基本特性:
    (1)抽象
    (2)封装
    (3)继承
    (4)多态
5.列举几个常见的java的设计模式
    工厂模式 
    抽象工厂模式 
    单例模式 
    原型模式 
    享元模式 
    策略模式 
    观察者模式 
    装饰者模式 
    桥接模式 
    组合模式 
    职责链模式 
6.重写(Overriding)和重载(Overloading)的区别?
    重写:子类重新定义了父类的方法。方法重写必须有相同的方法名,参数列表和返回类型。
    重载:发生在同一个类里面多个方法的方法名相同但是参数列表不同。
7.接口和抽象类的区别是什么?
    (1)一个类可以实现多个接口,但是只能继承一个抽象类。
    (2)抽象类可以有自己的方法,而接口不能,抽象类中可以包含静态方法,接口内不能包含静态方法。
    (3)抽象类里可以有构造方法,而接口内不能有构造方法。
    (4)抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为
        public abstract类型。
8.15.用最有效率的方法计算2乘以8?

答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

9.Java8新特性
    (1)实现了函数式编程
    (2)封装了多线程
    (3)流式处理 Streams

10.HashMap与HashTable有什么区别?

11.多线程的实现方式
    
12.线程的生命周期(5种状态):
    (1)新建(New)
    (2)就绪(Runnable)
    (3)运行(Running)
    (4)阻塞(Blocked)
    (5)死亡(Dead)

13.List、Set、Map三种集合的区别https://www.cnblogs.com/IvesHe/p/6108933.html
    List:1.可以有重复的对象。
        2.可以插入多个空值。
          3.是有序的,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
          常用的实现类有:
                ArrayList:的底层是一个object数组,所以是有序的,查找块,增删比较慢,
                LinkedList:底层是以链表的形式进行排序的。
                Vector:是线程安全的(线程同步的),而arralist线程是异步的也就是说他是不安全的,效率比arralist低
    Set: 1.不允许有重复的对象
        2. 是无序的,无法保证每个元素的存储顺序,但是TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。
                这里的无序是针对放入顺序而言
          3. 只允许有一个空值
          实现类是:
          HashSet:的底层是hashmap,他有着hashmap中键的特性,那就是,无序,不可重复性,和hashmap的区别:hashset键值都不允许重复
          TreeSet:实现了sortset接口,sortedset有排序能力,也就意味着treeset也有着排序的能力,他是使用二叉树进行排序的。
14.如何实现多线程?
    多线程实现的四种方式:https://blog.csdn.net/u011480603/article/details/75332435
        1.继承Thread类,重写run方法
        2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
        3.通过Callable和FutureTask创建线程
        4.通过线程池创建线程


15.父类与子类之间的调用顺序(打印结果)

    a) 父类静态代码块

    b) 子类静态代码块

    c) 父类构造方法

    d) 子类构造方法

    e) 子类普通方法

    f) 重写父类的方法,则打印重写后的方法
16.是否可以继承String类?
    String 类是final类,不可以被继承。
    
17.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    是值传递。Java语言的方法调用只支持参数的值传递。
    
16.String和StringBuilder、StringBuffer的区别
    String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,
    StringBuilder和StringBuffer是变量,是可以更改的。
    StringBuilder是线程不安全的,而StringBuffer是线程安全的
    
    运行速度:StringBuilder > StringBuffer > String
    
    String:适用于少量的字符串操作的情况

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

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

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

18.接口、抽象类、实体类之间的继承和实现关系
    1.接口是否可继承接口?
        接口是可以继承接口的:定义一个泛型接口,然后让其他接口去继承它并定义各自的泛型类,这样就方便很多。
    2.抽象类是否可实现(implements)接口?
        抽象类可以实现接口:抽象类可以有自己的方法实现,所以可以继承接口
    3.抽象类是否可继承实体类(concrete class)?
        抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
        Object就是个实体类,每个抽象类的条目里都明确写着直接或间接继承自Object。
19. sleep 方法和 wait 方法的区别?
    两者都是用来暂停当前运行的线程,sleep()不会释放锁,而 wait() 要释放锁。
20.数组实例化有几种方式?
    1.静态实例化:创建数组的时候已经指定数组中的元素
    2.动态实例化:实例化数组的时候,只指定了数组长度,数组中所有元素都是数组类型的默认值
21.equals和==的区别?
    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
    equals用来比较的是两个对象的内容(值)是否相等
22.如何将字符串反转?
    Stringbuilder或者stringbuffer的reverse方法
23.uper与this表示什么?
    Super表示当前类的父类对象This表示当前类的对象
大题:
1.手写单例模式(饿汉和饱汉模式)和工厂模式?
    第一种:饱汉模式
    public class SingleTon {
        //将构造函数私有化
        private SingleTon(){    
        }
        //实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间    
        private final static SingleTon instance = new SingleTon();
        public static SingleTon getInstance(){
            return instance;
        }
    }

    第二种:饥汉模式
    public class SingleTon {
        //将构造函数私有化
        private SingleTon(){
        }
        private static instance = null;//new SingleTon();
        public static synchronized SingleTon getInstance(){
        if(instance == null){
            instance = new SingleTon();
            }
            return instance;
        }
    }


2.try里有return,若是finally里面有代码会不会执行?什么时候执行?
    会执行,在return之前执行
    
    int x = 1;
    try {
        return x;
    }catch (Exception e) {
        // TODO: handle exception
    }finally {
        x+=1;
        System.out.println(x);
    }
    此时输出的x为2

3.冒泡排序
    public static void bubbleSort(int []arr) {
            for(int i =0;i<arr.length-1;i++) {
                for(int j=0;j<arr.length-i-1;j++) {//-1为了防止溢出
                    if(arr[j]>arr[j+1]) {
                        int temp = arr[j];
                         
                        arr[j]=arr[j+1];
                         
                        arr[j+1]=temp;
                }
                }    
            }
        }

4.mysql级联查询:https://blog.csdn.net/qymufeng/article/details/80934378

5.关于String s = new String("xyz"); 创建几个对象的问题
    https://www.cnblogs.com/dangzhenjiuhao/p/4585389.html

6.设计四个线程,其中共两个线程每次对j增加1,另外两个线程每次对j减少1。循环100次,写出程序。
    https://blog.csdn.net/ankeyuan/article/details/39671979
7.几个数字的全排列:https://blog.csdn.net/aijiaoxiaodetuzi/article/details/70312437
    public static void permutateSequence(char[] strArrs,int i){
          char temp;
          if(strArrs==null||i>strArrs.length||i<0){
              return;
          }
          else if(i==strArrs.length){
             System.out.println(strArrs);
         }
         else{
             for(int j=i;j<strArrs.length;j++){
                 //交换位置
                 temp = strArrs[j];//
                 strArrs[j] = strArrs[i];
                 strArrs[i] = temp;
                 //后续元素递归全排列
                 permutateSequence(strArrs, i+1);
                 //还原成原来的数组,便于下一次的全排列
                 temp = strArrs[j];
                 strArrs[j] = strArrs[i];
                 strArrs[i] = temp;
             }
         }
     }

猜你喜欢

转载自blog.csdn.net/QYmufeng/article/details/81363450