面试题——Java基础

一、谈谈你对面向对象的理解?

面向对象的三大特征:封装、继承、多态。
封装:将属性和方法都封装到一个类中,外界必须使用这个类创建对象,才能调用方法。
继承:子类继承父类的特征和行为。
多态:一种事物的多种形态,父类引用指向子类对象。
例如:List list = new ArrayList();

二、抽象类、继承和接口

1. 抽象类和接口的区别

不同点:
1. 抽象类要被子类继承,接口要被类实现
2. 接口只能做方法声明;抽象类中可以做方法声明,也可以做方法实现。
3. 接口里定义的常量只能是公共的静态常量,抽象类中的变量是普通变量
相同点:
都不能实例化对象,都可以包含抽象方法,抽象方法必须被继承的类全部实现。
应用场景:
抽象类的应用场景一般用于抽取不同事物的共有特性,然后可以用接口实现不同事物的不同行为。遇到需求,先分析不同的对象是否有共同点,比如门,都可以开和关,这个就可以抽取出来定义一个抽象类,而有的门有门铃可以摁,有的门没有,那就将有门铃的对象实现摁门铃的这个动作定义为接口。

2. 继承(extends)和接口(interface)的区别

implement是实现接口的关键字
  1. 接口定义不能包含任何属性(如:public、private等),但是在实现接口的类定义中,可以包含必须标记为public。
  2. 继承可以使用一个接口继承多个接口,通过implement语句可以使用一个类继承多个接口。
    只能继承一个类,但是可以实现多个接口。继承某个类之后可以使用父类的方法,也可以重写父类的方法。

三、重写和重载的区别是什么?

重写:子类中有跟父类一样的方法,方法名,参数列表,返回值类型都相同,对方法体进行修改和重写。
重载:方法名相同,参数列表不同。跟返回值类型,参数名无关。
参数列表:参数个数,参数类型,参数类型顺序。

四、==和equals区别

(1)==
如果比较的是引用数据类型,比较的是地址值。(两个对象是否指向同一个内存)
如果比较的是基本数据类型,比较的是变量的值。
(2)equals
如果没重写equals方法比较的是两个对象的地址值。
如果重写了equals方法比较的是对象中属性的内容。
equals方法是从Object类中继承的,默认的实现就是使用==。String也是继承了Object类。

public boolean equals(Object obj) {
	return (this == obj);
}

五、Final、Finally、Finalize区别

final:可以修饰类、方法、变量。修饰类,类不能被继承;修饰方法,方法不能在子类被重写;修饰变量,变量在使用中不能被改变,在声明时要给定初始值。
finally:通常放在try…catch的后面构造成最终执行代码块。无论正常执行还是发送异常,只有jvm不关闭都能执行,可以将释放资源的代码写在finally中。
finalize:Object类中定义的方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

六、Object中的方法

(1)equals(Object obj) --> 某个其它对象是否与此对象“相等”。
(2)finalize()
(3)getClass() --> 返回一个对象的运行时类。
(4)hashcode() --> 返回该对象的hash值。
(5)wait(long timeout):当前线程等待。带参数,指定线程等待的时间。
(6)notify():唤醒等待的单个线程。
(7)notifyAll():唤醒等待的所有线程。

七、常见的异常

(1)java.lang.NullPointerException 空指针异常。出现原因:调用了未初始化的对象或不存在的对象。
(2)java.lang.ClassCastException 数据类型转换异常。
(3)java.lang.ClassNotFoundException 找不到指定的类。出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
(4)java.lang.NumberFormatException 字符串转换为数字异常。出现原因:字符型数据中包含非数字型字符。
(5)java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操作数组对象时发生。
(6)java.lang.IllegalArgumentException 方法传递参数错误。

八、集合

(1)集合体系
在这里插入图片描述

1. List、Set和Map的区别

  1. List和Set都是实现Collection接口的;Map既不是Collection的子接口也不是它的继承类,Map只是一个接口。
  2. List中插入的元素是有序可重复的,可以有多个null值。
  3. Set存储元素是无序的,不能有重复对象,只允许一个null元素。
  4. Map是一个键一个值;值对象可能相同,但键对象必须是唯一的;Map可以随意拥有多个null值,但最多只能有一个null键。

在这里插入图片描述

2.Collection和Collections有什么区别?

java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

3.List集合都有哪些

  1. ArrayList:底层是动态数组,线程不安全,效率高;(查询、修改优于LinkedList)
    第一次添加数据的初始空间是10,扩容规则是原容量的1.5倍
  2. LinkedList:底层是双向链表(增加、删除优于ArrayList)
  3. Vector:底层是数组,线程安全(不绝对),效率低;
    实例化对象初始空间为10,扩容规则是原容量的2倍

4.Set集合都有哪些

  1. HashSet
    a. HashSet是根据Hash值来确定元素的位置.
    b. HashSet依赖于内部的hashCode与equals方法保证存储元素的唯一性.
    c. HashSet的底层是一个HashMap
  2. TreeSet
    TreeSet是二叉树实现的

5.HashMap的实现原理

HashMap的底层是数组+链表+红黑树
在实例化对象的时候,数组空间是没有开辟的。在第一次添加数据的时候,先开辟数组的空间为16,临界值为12,再添加数据。
添加数据的原理:

  1. 计算key的hash值
    
  2. 根据key的hash值和数组的长度计算索引位置
    
  3. 判断该位置是否有值
    没有:将键值对数据封装成Node对象添加到数组中
    有 :
    
  4. 判断两个key值的hash值是否一致
    不一致:
      则继续往下判断该链表后的数据,如果有重复直接覆盖,如果没有则链接到末尾
    一致:
    
  5.  判断两个key值的地址是否一致
          一致:则直接覆盖原来的value值
          不一致:
    
  6. 则继续判断equals是否一样
         一样:则执行覆盖操作
         不一样:则继续往下判断,只到没有重复的,链接到末尾
    

当两个key值的hash值一致,地址也一致,则可以确定key值重复
当两个key值的hash值一致,地址不一致,但是equals一致,则可以确定key值重复
在添加数据的过程中,如果添加完数据之后,数据的个数超过临界值(0.75),则进行扩容,扩容的机制是原容量的2倍!
HashMap的初始容量都是2的n次幂的形式存在的,而扩容也是2倍的原来的容量进行扩容,也就是扩容后的容量也是2的n次幂的形式存在的。

6.HashMap和HashTable的区别

  1. HashMap是线程不安全的,效率高;HashTable是线程安全的,效率低,使用synchronize修饰。在多线程并发的情况下,可以直接使用HashTable,但是使用HashMap时必须自己增加同步处理。
    ConcurrentHashMap既保证了线程安全,又保证了运行效率
  2. HashMap只有containsKey和containsValue方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。
    Contains:当前列表若包含某元素,返回结果为true, 若不包含该元素,返回结果为false。
  3. Hashtable中,key和value都不允许出现null值。HashMap可以随意拥有多个null值,但最多只能有一个null键。(因为值对象可以相同,键对象必须唯一)
  4. HashTable默认容量为11,扩容机制是原容量的2倍加1。
    HashMap默认容量为16,扩容机制是原容量的2倍。

7.如何实现数组和 List 之间的转换?

  1. List转数组:toArray(arraylist.size()方法
  2. 数组转List:Arrays的asList(a)方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值