Java:每天三道大白话面试题(001)

前言

大白话讲面试题,每天更新三题,提倡每日积累而不是临阵磨枪,我的目的不是为了背题,而是通过这种方式来更好的巩固自身所掌握的知识。

题目的星星代表难度等级,五星为满,并且我会列出需要掌握的前置知识。

大家一起,冲鸭!

Java 面向对象有哪些特征?⭐

目的:了解你的基础,有些人干了三年都有可能答不好或答不出这个问题。

回答这题你还需要理解:什么是面向对象,什么是类,什么是对象,他们之间的关系。

  • 封装
  • 继承
  • 多态

封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界来说,它的内部细节是隐藏的,暴露给外界的只是它的访方法。

对于一个类来说,封装了自己的属性和方法,想要访问属性的值,只能通过事先写好的方法去访问,可以通过控制方法的逻辑来限制对属性的不合理操作;同时,方法的封装可以让调用者不必关心方法的内部实现逻辑,便于使用便于修改。

继承是从已有类中派生出新的类,新的类继承了已有类的属性和方法,并且可以扩展新的能力。

派生出来的类叫子类(或派生类),原有类叫父类(或基类);比如经典的 Animal 和 Cat,Dog,由 Animal 类派生出猫和狗,他们有共同的特征是跑跳叫,但狗可以扩展自己的动作,比如吃屎……

多态是指两个类由继承关系,存在有方法的重写,故而可以在调用时有父类引用指向子类对象。比如 Animal animal = new Dog。

ArrayList 和 LinkedList 之间有什么区别?⭐

目的:考察数据结构的基础,以及对基础集合有没有比较深入的了解,这个题目是一个很经典的对比。

回答这题你还需要理解:数组和链表,他们的特点、特性、原理等。

ArrayList 和 LinkedList 都实现了 List 接口,他们之间有以下的不同点:

  1. 底层数据结构上:前者底层使用了数组;后者使用了链表,因此后者所占用的内存空间要更大一些,因为要存储前后节点的位置。
  2. 效率上:前者使用索引访问数据,取数贼快,但插入和删除需要移动后面的数据,效率较慢;后者由于链表的特性,插入和删除特别快,但查询需要从头开始遍历,效率较慢。

线程安全的集合类都有哪些?⭐⭐⭐

目的:考察多线程方面的基础,往往以这个问题为入口,越问越深

*回答这题你还需要理解:关键字 synchronized、*volatile,什么是 CAS(容易被追问)。

第一代线程安全集合类:

  • Vector(Since: JDK1.0)
  • Hashtable(Since: JDK1.0)

底层使用 synchronized 关键字来保障线程安全,效率低下。

第二代集合类:

  • ArrayList(Since: JDK1.2)
  • HashMap(Since: JDK1.2)

那如果需要线程安全怎么办呢?

在写这两个集合类的时候,作者还写了一个 Collections 集合工具类,比如 Collections.synchronizedListCollections(List<T> list) 就可以创建一个线程安全的 List 对象,底层任然使用的是关键字synchronized ,但由于锁的是方法,性能上有一定提升。

第三代线程安全集合类:
从 JDK1.5 开始,引入了包 java.util.concurrent.* ,JUC 中多数类是通过 volatile关键字和 CAS 来实现,线程安全且高效
在这个包下的所有集合类都是线程安全的,比如常用的 ConcurrentHashMap

引用

在这里我会放上所有我参考的资料链接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值