Java基础面试题

1,简述什么是 JDK、JRE 和 JVM

JDK 开发工具包
JRE 运行时环境
JVM java虚拟机


2,写出Java的四类八种基本数据类?

整数   小数(浮点数)  布尔 字符  
byte float boolean char
short double
int
long


3,& 和 && 的区别 

   &  符号的左右两边,无论真或假都要执行
   && 符号的左边如果为假,符号的右边不再执行,提高了代码的执行效率


4,switch的参数可以是什么类型


int 及以下整数包含 字符 char  byte short int char  
String   
枚举   

5,简述什么是标识符,及其定义的规则


标识符就是名字  
数字不能开头
不能使用关键字起名字 
特殊符号只有 _ $
26个大小写英文字母
数字0-9
其他国家的语言文字   

6,说出成员变量和局部变量的区别


1, 物理位置
     成员变量: 类中方法外
     局部变量: 方法中或方法定义的小括号里面
2, 内存位置
     成员变量: 在堆内存中
     局部变量: 在栈内存中
3, 生命周期
     成员变量: 随着对象创建而产生,随着对象的消失而消失
     局部变量: 随着方法的调用而产生,随着方法调用结束而消失
4,有无默认值 
     成员变量: 有默认值, 整数0,小数0.0 字符 ‘\u0000’ 布尔 false 引用数据类型 null
     局部变量: 没有默认值,使用的时候,必须先赋值


7,static关键字都能修饰什么? 都有什么特点


1, 修饰成员变量, 叫静态变量 具有共享性,节省内存空间
 2, 修饰方法: 静态方法: 可以直接使用类名.进行调用,
 3, 修饰代码块: 静态代码块 ,给静态变量进行赋值
 4, 修饰类: 静态内部类


8 ,什么是封装,为什么要封装


        就是将事物的属性和行为 通过 private进行修饰,外界无法直接进行访问,需要提供公共的setter 和 getter 进行间接的访问,提高代码的安全性和复用性 


9, 什么是面向对象,请详细说明(分别解释 封装 继承和多态)

面向对象是一种以事物为中心的编程思想,具体分为封装继承和多态

封装: 通过private关键字将事物的属性和行为封装起来,对外通过setter和getter提供公共的访问方式,提高了代码的安全性

继承: 让类与类之间产生子父级的关系,子类可以去使用父类的资源,提高了代码的复用性

多态: 事物的多种形态,发生多态的前提,必须有继承,有方法的重写,有父类的引用指向子类对象


10,  overload和override的区别

overload 是重载

要求在同一个类中,方法名相同,参数列表不同与返回值类型无关

参数列表不同表现在: 个数不同, 数据类型顺序不同,数据类型不同

override是重写 要求发生在子父级的继承关系中,方法名相同,参数列表相同,返回值类型是父类返回值类型本身或其子类, 异常等于父类本身异常类型或小于父类本身异常


11, final 和 finally的区别

    final 是权限修饰符, 表示最终的, 能修饰 变量, 方法,和类

      修饰变量: 变成了常量

      修饰方法: 变成了最终的方法,不能被重写,但是可以被正常调用

      修饰类: 变成的最终的类,不能有子类,但是可以被正常创建对象

    finally 是一个代码块,只能与我们的 try代码块连用,表示无论代码是否发生异常,finally里面的代码都要执行


12, this和super都能用到哪些地方

this

super

可以区分成员变量与局部变量重名问题,如果本类没有这个成员变量,也可以调用父类的成员变量

可以区分本类成员变量与父类成员变量重名问题,只能调用父类的成员变量

可以调用本类的成员方法,如果本类没有这个成员方法,也可以调用父类的成员方法

只能调用父类的成员方法

可以通过this() 或 this(参数) 让其本类的构造方法直接相互调用

子类通过super() 或 super(参数) 调用父类的构造方法


13,  接口与抽象类的区别

抽象类

接口      

有成员变量

没有成员变量,都是常量默认被 public static final修饰

实现方法和抽象方法

jdk1.8之前都是抽象方法 jdk1.8之后可以有静态和默认方法

有构造方法

没有构造方法


14,  静态变量与成员变量的区别


          内存位置 : 静态变量在方法区中,成员变量在堆内存中
          生命周期 : 静态变量随着.class文件加载而产生,随着.class文件结束而结束; 成员变量随着对象的创建而产生,随着对象的结束而结束
          调用方式: 静态变量既可以通过 类名.直接进行调用, 也可以通过对象名.进行调用; 成员变量只能通过 对象名.进行访问


15, throw和throws 的区别

throw 是具体抛出一个异常对象,在方法的内部, 后面有且只能有一个异常对象,代码一旦遇到了throw证明出现了问题,代码就会停止
throws 是异常的声明, 在方法定义的小括号后面,后面可以跟多个异常的类型,方法有throws,代码不一定发生异常


16 String,StringBuilder 与 StringBuffer 的区别

String 是不可变的字符串序列, StringBuilder和StringBuffer是可变的字符串序列
StringBuilder 是线程不安全的,从jdk1.5版本开始的,效率高
StringBuffer 是线程安全的,从jdk1.0开始的,效率低


17, == 和 equals的区别

== 既可以比较基本数据类型,也可以比较引用数据类型,比较基本数据类型,比较的是具体的值,比较引用数据类型比较是地址值
equals 只能比较引用数据类型,重写之前比较的是引用数据类型的地址值,重写之后,比较的是引用数据类型的内容

   
18, 包装类拆箱装箱

      基本数据类型转换成对应的引用数据类型,为装箱,把引用数据类型转换为对应的基本数据类型为拆箱,jdk1.5之后可以实现自动拆装箱


19,常见的几个异常类型

        数组索引下标越界异常,空指针异常,文件找不到异常,类型转换异常,算数异常

        ArithmeticException                                 算术异常,如除以0
        ArrayIndexOutOfBoundsException          数组下标出界
        IOException                                             I/O异常的根类  
        FileNotFoundException                           不能找到文件
        NullPointerException                               空指针异常

       
20, HashSet 的去重原理

     不同的对象,地址值肯定不同,地址不同,直接插入数据成功
     如果地址值相同,不能证明是同一个对象
     需要通过equals 的方法继续比较,比较的是对象中的每一个内容
     如果内容相同证明是同一个对象,插入失败
    如果内容不同,证明不是同一个对象,数据插入成功

21, jvm内存划分

    jvm分为方法区,堆内存,栈内存,本地方法栈,程序计数器,

    方法区: 主要存.class字节码文件,静态变量,字符串常量

    堆内存: 主要存new出来的对象,数组也在堆内存中

    栈内存: 存正在执行的方法,局部变量也在栈内存中


22, 构造方法是否可以被重写?为什么?

       构造方法不能被重写,因为构造方法要求,方法名与类名保持一致。


23, Collection 与 Collections  的区别

     collection是单列集合的顶层父接口,Collections 是处理集合的工具类


24, 集合与数组的区别

     集合与数组都是容器
数组 既可以存基本数据类型也可以存引用数据类型,数组的长度固定不能发生改变
集合 只能存引用数据类型,可以存任意的引用数据类型,长度可变

25, 多线程的三种实现方式

   1, 继承Thread,重写run方法,最后创建Thread 的子类对象,调用start()方法开启线程任务

   2, 实现Runnable接口,重写run方法,创建Runnable 的实现类对象,通过Thread 的构造传递,调用start() 方法开启线程任务

   3, 实现Callable接口,重写call方法,创建Callable的实现类对象,将Callable 的实现类对象,传递到FutureTask的构造方法中,最后将FutureTask传递到Thread 的构造方法中,通过start()方法开启线程任务


26, 多线程的生命周期

     多线程的生命周期有5种状态,分别是 新建态,就绪态,运行态,阻塞态和死亡态

     新建态: 刚new出来的时候

     就绪态: 已经.start(),没有获取到cpu资源

     运行态: 获取到cpu资源进入运行态

     阻塞态: 线程遇到sleep(),遇到wait() 或者io流阻塞让cpu资源丢失

     死亡态: 线程正常结束,线程任务出现异常


27, TreeSet和HashSet的区别

       TreeSet 和 HashSet 一样都有 无序无索引不能重复

       TreeSet 可以进行根据一定的排序规则进行排序

       HashSet 没有排序的规则


28, TreeMap如何去重

      TreeMap去重 是利用key值的 compareTo 方法,compareTo方法为0,就证明是同一个元素,进行去重

29,所学习的io流一共分为几类

IO流根据流向 有输入流和输出流两种

IO流根据类型分类有 字节输入输出流 和 字符输入输出流  

字节输入流  InputStream

字节输出流 OutputStream

字符输入流 Reader

字符输出流 Writer


30, 目前学习的最高效的文件复制方式

高效缓冲流+字节数组 字节数组的大小一般是1024的倍数 最高一般不超过8倍


31,String abc = new String("abc")有几个对象

有两个对象,一个对象"abc"在方法区的字符串常量池中,一个在堆内存中,是new String()


32,map的两种遍历方式

map不能直接遍历,想要遍历有两种间接的方式

   1, 通过map方法的 keySet() 方法, 将map中的key 取出来,存到set集合里面,之后遍历set集合,通过map中的 get(key key) 方法取出每一个value值

   2, 通过map中的 entrySet() 方法, 将map中的key 和 value 存到 map的内部类 entry中,之后将entry对象存到set集合里面,之后通过遍历set集合,通过entry内部类中的 getKey, 和 getValue 获取每一个值

33,HashMap与HashTable 的区别

HashMap 是线程不安全的,允许有空的键值对
Hashtable 是线程安全的,不允许有空的键值对 

34,什么是反射?

   反射就是在程序运行时期,动态的获取类中成员信息(构造方法,成员变量,成员方法)的过程!

35,  字节流与字符流有什么区别

       字节流是万能流,可以处理任意的文件

       字符流不是万能流,只能处理纯文本文件

36, Java的线程池有哪些?那你最常用的线程池是哪个?


      newCachedTheadPool 动态的线程池
      newFixedThreadPool 固定线程数的线程池
      newSingleThreadExecutorPool 固定只有一条线程的线程池
      newSCheduledThreadPool 以固定频率执行的线程池
      一般来说,这四种线程池都不使用,一般使用ThreadPoolExecutor来自定义线程池


 37, sleep wait notify notifyAll的作用


       sleep方法是Thread类的静态方法
            调用sleep方法可以让当前正在运行的线程进入睡眠状态,即暂时停止运行指定的单位时间。并且该线程在睡眠期间不会释放对象锁。
       wait是Object提供的一个方法
             调用wait方法可以让当前线程进入等待唤醒状态,并释放锁。该线程会处于等待唤醒状态直到另一个线程调用了object对象的notify方法或者notifyAll方法。
       notify也是Object提供的一个方法
              当其它线程调用该对象的notifyAll()方法(唤醒所有wait线程)或notify()方法(只随机唤醒一个wait线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去公平竞争该对象锁。


  38,HashMap的底层数据结构是什么?那什么时候变为红黑树呢?


         在JDK1.7的时候是数组+链表;
         在JDK1.8的时候是数组+链表+红黑树;
          当链表的长度大于8的时候,就会变成红黑树


   39, final,finally,finalize有什么区别?


       final用于修饰类,变量,方法
            1.final修饰类,类不能被继承了。
            2.final可以修饰方法,方法就不能被重写了。
            3.final修饰变量总规则:变量有且仅能被赋值一次。
        finally用于try-catch捕获异常,无论代码是否发生异常,finally中的代码一定会被执行,通常用来关闭资源
        finalize属于Object类中的一个方法,当对象被回收的时候,会调用此方法

你可能感兴趣的:(java)