高频java基础面试题

对面向对象的理解:

        面向对象是Java中的一种编程思想,规定设计了对象的创建  实现,方法的生成  属性的赋值等实现过程及原理  

    面向对象的三大特征:封装  继承  多态  

1、JDK  JRE  JVM分别是什么?以及他们之间的关系

        JDK全程是java development kit,是Java中常用的工具包,有多个版本,版本之间功能不同,主要是程序开发人员使用

        JRE全称是java runtime environment,是运行java程序  主要是java程序使用的使用

        JVM:JVM虚拟机   

        JRE=JVM+类库

        JDK=JRE+JAVA工具类

2、JDK1.8和1.8之后的区别:

        1.8之前 接口只能定义静态常量和抽象方法

        1.8之后 接口可以有默认方法和静态方法

如何使用:

        静态常量和静态方法:通过接口名使用

        默认方法:有实现类调用

3、 接口和抽象类的区别:

        语法区别:抽象类不一定要有抽象方法,但有抽象方法的类一定是抽象类

        功能区别:jdk1.8之前,接口只能定义抽象方法和静态常量

4、final、finally,以及finalize的区别:

        final的意思为最终,被它修饰的类不能被继承,被它修饰的方法不能被重写,被他修饰的常量需要有初始值才能被调用,且只能调用一次;

        finally一般用在抓取异常中try...chah...,在它的代码块内的代码可以被执行

        finalize一般用在是在Object中定义的方法,垃圾回收器在将对象从堆内存中回收之前,会调用对象的finalize方法

5、局部变量和成员变量的区别:

        定义位置:局部变量在方法内定义,成员变量在类中定义

        作用范围不同:局部变量只能在本方法内使用,而成员变量则分为静态成员变量和非静态成员变量,静态成员可以在所有方法中使用,而非静态成员之能在非静态方法中使用

        默认值不同:局部变量有默认值,基本类型为0,

                             成员变量无默认值,需要手动赋值

        生命周期不同:局部变量随着方法入栈而生成,随着方法的出栈而销毁

                                成员变量随着类的加载而加载 随着类的销毁而销毁

                                非静态成员变量随着对象的创建而生成,随着对象被回收而销毁

6、值传递和引用传递的区别

        值传递:方法被调用时,将实参传递给形参

        值传递:基本数据类型存储的是数值本身

        引用传递:引用数据类型存储的是对象的地址值

7、==号和equals的区别:

        ==:如果比较基本数据类型,则是比较数据本身  如果比较的是引用数据类型,则比对的是它的地址值

        equals:是Object类中的方法,是一个运算符 用来比较变量的内容是否相同

        该方法默认实现的是当前对象和传进来的对象是否指向同一个对象

8、hashcode和equals的区别:

        相同点:都是Object类中的方法  

        不同点:equals比对的是对象地址值是否一样   

                      hashcode是基于native方法实现的,底层是通过hash函数返回一个hash值;

注意:该问题通常会结合HashSet和HashMap为何要要求元素重写hashCode和equals方法

9、重载和重写的区别:

        重载:在一个类中定义多个方法名相同,参数列表不同的方法,目的是方便调用,并且可以达到调用区分  

        重写:子类声明父类的方法名,形参列表相同,返回值类型如果是引用类型,可以是父类方法和返回值的子类类型  返回值如果是基本类型 必须子父类保持一致。

        访问权限修饰符:子类方法  >=父类方法

        异常抛出声明:抛出异常可以是父类异常的子类异常

        private修饰的方法无法被重写

10、java数据类型一共几种:

        基本数据类型:整数类:  byte  short  int  long 

                                 浮点数:float  double

                                 字符:char

                                 布尔:boolean

        引用数据类型:类  接口  数组  注解  

11、包装类和基本数据类型的区别:

        包装类就是对基本数据类型的封装 

11、为什么要提供包装类?

        作用:方便操作   提供了基本数据类型对应的最大值、最小值等属性,及相关方法

12、包装类和基础类型怎么转换?

        1、基本类型转化为包装类型--->装箱      格式:包装类.valueOf(基本类型);

        2、包装类型转化为基本类型--->拆箱      格式:对象.xxValue();                 

        3、jdk1.5后提供了自动拆箱和自动装箱 

13、   构造器代码块、局部代码块、静态代码块执⾏顺序和执⾏次数?

        执行顺序:

                静态代码块:当类加载时执行  如果类中有多个静态代码块,则按顺序执行

                构造器代码块:对象被创建之前执行,优先于构造方法,如有多个按顺序执行

                局部代码块:当方法执行的时候执行,如果方法中有多个  则按顺序执行

       执行次数:  

                静态代码块:一次

                构造代码块:每次创建对象都会执行

                局部代码块:每次调用方法都会执行

14、构造代码块的作用:

           可以把所有构造代码块公共的代码放在构造代码块中

           匿名内部类的初始化操作,匿名内部类没有明显的构造方法     

15、Integer String 是否可以被继承?为什么? 

        不可以   因为public final class Integer extends Number ,被final就是的 

16、Integer缓存区间?什么时候触发缓存区间?        

       [-128,127]范围的Integer实例    

        基本数据类型转化为包装类型的时候,如果基本数据类型范围[-128,127]从数组中返回Integer实例,否则创建Integer实例

17、String str = "abc" 和 String str = new String("abc")区别?

 String str = "abc"   如果常量池中没有”abc“  则在常量池中创建   str 指向常量池的”abc“

String str = new String("abc")  

如果常量池中没有”abc“  则创建;在堆中创建对象  将参数”abc“复制到堆中  str指向队中对象

18:String、StringBuffer、StringBuilder区别?是否线程安全?怎么做的到线程安全?

String 底层维护的是char[ ]数组,用final修饰,无法赋值,String中的方法,替换,拼接 分割都是返回一个新的字符串,是不可变的字符串,线程安全

StringBuffer  StringBuilder  底层同样维护的是char[ ]数组,没有使用final修饰,方法都是远在对象字符数组的基础上进行操作,不会产生新的对象

StringBuffer 的所有方法上有加的synchronized进行修饰  线程安全

StringBuilder 线程不安全

使用场景:如果不经常使用字符串拼接   使用string  

                  如果有拼接字符串的需求,没有线程安全需求的  用Builder   否则用Buffer

19、包装类型  Math  String类的常用方法有那些?

        包装类:常用方法有两大类   1.将包装类转为基本类型数据  2.将字符串转为基本类型数据 

包装类转基本类型数据的方法有XXXValue()/如 intValue();而字符串转基本类型数据有

Integer.parseInt(String s)  将字符串转int

Math常用方法有:

        取绝对值:Math.abs

        向上取整:Math.ceil/向下取整Math.floor

        取最大值Math.max/取最小值Math.min

        返回大于等于0.0小于1.0的随机小数Math.random

20、Comparable 和Comparator的区别,分别说出使⽤场景?

            Comparable自然排序,排序逻辑写在需要排序的类上,该类要实现Comparable接口,重写int compareTo(E o1)方法  

          Comparator比较器排序,排序逻辑在另一个类中实现,重写int comparable(E o1,E o2)   方法

        使用场景:TreeSet、Collections.sort(List<E> list)、Collections.sort(List<E> list,Comparator<E> comparator)

21、JDK1.8之后有哪些新特性?

        lambda表达式

        stream

        接口增强

        并行数组排序

        Optional

        可重复注解

        新的时间和日期API

22、Java中深克隆和浅克隆的区别?怎么实现?

       浅克隆,对当前对象进行克隆,并克隆该对象所包含的8种基本数据类型和String类型属性,如果该对象中有除8种基本数据类型以外的数据类型 或String类型属性以外的属性,那么不能克隆

       深克隆,深克隆是在浅克隆的基础上,递归地克隆除8种基本数据类型和String类型属性以外的数据。即为这些属性重新分配内存而非引用原来对象中的属性

        特点:被克隆的对象的类应实现 Cloneable 接口,并重写 clone() 方法


23、Object类和范型的区别,说出范型的执⾏机制,为什么要使⽤范型?

       编译时自动检查类型安全。如果使用Object类的话,你没法保证返回的类型一定是String,也许是其它类型。这时你就会在运行时得到一个类型转换异常

24、   Error 和Exception 有什么区别?

        1、从继承体系来看,Error和Exception都是Throwable的子类、

        2、从功能来说  Error是程序无法处理的异常,Exception出现的异常可以被处理

25、什么是反射?

        在运行状态中。对于任意一个类,能够调用它的任意属性和方法  对任意一个对象,都能够调用它的任意属性和方法,这种动态获取信息及动态调用对象的功能就是反射机制

简单理解:

        利用反射可以无视就是符,获取类里面所有属性和方法

        动态获取配置文件信息,通过反射撞见对象调用方法

26、设计模式

        创建型模式:提供了对象创建过程中的各种问题的解决办法   有 单例模式  抽象工厂模式  原型模式  构建这模式  工厂方法模式

        结构性模式:对类在设计上总结,比较关注类继承  组合关系  有代理模式(静态代理  动态代理) 适配器模式  桥接模式 

        行为型模式:对象直接的交互和职责划分总结   包括 观察者模式  模板模式  策略模式  职责模式  迭代器模式  状态模式  访问者模式  

    27、java中常用的容器有哪些?

        Collection  包含  Queue      

        1、List : Vector---->Stack  Arrarylist  linekdList  

        2、Set :    HashSet   TreeSet

        3、Queue: PriorityQueue   ArrayDeque  LinekdList

        Map 

        HashMap   TreeMap   HashTable

  28、Collection和Collections的区别?

        Collection

        1、是集合的顶级接口,定义了集合中统一的接口方法

        2、Collection接口有很多常用的实现类  

        3、Collection的意义是为了具体的集合提供了最大化的统一操作方法

        4、其直接继承的接口有List和Set及Queue

        Collections

        1、集合的工具类

        2、提供了很多静态方法用于对集合元素进行排序,搜索及线程安全等操作

29、HashMap是线程安全的吗?  如何得到一个线程安全的Map? 什么是哈希值?
       1、HashMap底层时Hash表,无序   不可重复  存取不一致   无索引,索引不能通过索引操作元素,

        2、线程不安全,底层是”数组+链表+红黑树“,多线程添加元素时,会导致元素覆盖,所以我们想要得到一个线程安全的HashMap就需要使用ConcurrentHashMap,它通过对桶进行加锁的方式,以较小的性能来保证线程的安全。

        哈希值是JDK根据对象地址,或者属性值,计算出来int类型的值

        Object类中的hashcode方法,根据对象的地址来计算哈希值并返回

对象哈希值的特点:

        1、如果我们没有重写hashcode方法,则根据对象的地址值来计算哈希值,如果重写了hashcode的方法,则根据属性值来计算哈希值

30、List和Set的区别?

        List 和Set继承Collection的接口    

        list:有序  有索引  可重复  有两个实现类  ArrayList 和LinkedList

        ArrayList:可变数组 可保存所有元素,查询快  增删慢

        LinkedList:采用链表结构保存对象,查询慢  增删快

        Set:无序 无索引  不可重复  常用的实现类是 HashSet和TreeSet

        HashSet:底层是HshMap实现的  hashSet的元素储存在HashMap的key ,它的值Value统一采用private static final Object PRESENT = new Object();

31、HashMap 和Hashtable 的区别?

        HashMap:hashmap基于哈希表的Map接口实现的    允许有null值   hashtable不允许

hashtable是线程安全的  hashmap是线程不安全的  

32、如何实现数组和List的之间的转化?

        1、List转化为数组  toArray()T[ ]

        2、数组转化为List  Arrays.asList(T...t) List<T>

33、ArrayList和Vector的区别?

        1、他们底层都是基于数组实现的

        2、线程安全: Vector是线程安全(synchronized)

                                ArrayList不是

                                如果需要一个线程安全的ArrayList,一般推荐CopyOnWriteArrayList

        3、扩容:ArrayList扩容1.5倍  Vector默认扩容2倍

34、Iterator和ListIterator的区别?

        1、Iterator和ListIterator都是迭代器接口,不同的集合有不同的实现  ListIterator是Iterator的子接口  

        2、Iterator可以遍历List也可以遍历Set,因为List和Set接口中都有

        3、ListIterator不能遍历Set  只有List接口中有

        4、ListIterator只能向后遍历(hashNext,next),ListIterator不仅可以向后遍历,还可以向前遍历

        5、Iterator中对集合元素的操作只有删除,ListIterator提供了获取前一个元素索引,后一个元素索引,添加元素,替换元素等方法

    35、HashMap底层数据结构是什么?1.7和1.8有什么区别?

        HashMap底层是Hash表结构,

        1、1.7是数组加链表的形式 而1.8是在之前的基础上加上了红黑树

   36、HashMap链表什么时候转化为红黑树?

        1、如果链表中存储的元素很多,在进行存储和查找的时候效率比较低

        2、对数组进行扩容时

        3、数组扩容有可能解决不了问题  极端情况:如果存入的元素hashcode的值都是一样,元素的同索引一样;变成红黑树  

        数组长度大于等于64,并且链表长度超树化阈值8

      

   37、HashMap存储元素的流程?

        1、当使用put方法存储key value数据

        2、首先会获取key的hashCode

        3、对hashcode进行二次hash

        4、对hash值取模数组的长度,得到数组索引(桶下标)

        5、将key value存入到指定索引的链表或者红黑树中

38、HashMap什么时候扩容

        1、capac 即数组容量默认16

        2、localFactor加载因子,默认时0.75

        3、threshold阈值。阈值=容量*加载因子

        4、当hashMap中元素个数超过阈值,就会触发扩容,没次扩容一倍

39、HashMap同中为什么不直接存放红黑树

        1、链表短的时候就和红黑树性能差不多

        2、红黑树一个节点占用的内存要比链表一个节点占用的内存大

        3、如果hash值很随机,按照罗松分布,长度超过8的链表概率很低

Set的去重原理:       

Set存储自定义类型元素,并要去重时,需要在该元素中重写HashCode 方法和equals方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值