面试题.03

1. 接口和抽象类的区别?平时的使用场景?

区别:

  • 抽象类是类,在Java中只能单继承,而一个类可以实现多个接口
  • 抽象类中可以包含普通方法,和成员变量
  • 接口中只能包含抽象方法和default修饰的方法和静态方法
  • 抽象类中可以有构造方法,接口中不能有构造方法
  • 抽象类更注重代码的复用,概括同一类别但存在差异的类,例如学生有小学生,中学生,大学生。
  • 接口则是对不同类别中共同行为的概括,例如,鸟会飞,飞机也会飞,但鸟和飞机不能是一类,飞机和鸟就可实现 "飞"这个接口,鸟还会跳,可以同时再实现跳这个接口。

使用场景:

  • 在有一些代码是多个相关类通用的,但具体实现各有不同时,可以考虑使用抽象类。
  • 在多个类并不相通,但是存在一些共同行为时可以使用接口。

2. 介绍一下HashMap 和HashTable

  • HashMap,HashTable都是Java标准库中的数据结构,都使用了key-value的存储形式,其中key不能重复,value可以重复,存储的元素是无序的。
  • HashMap中key和value都可以为null,HashTable中key和value都不能为null
  • HashTable是线程安全的

3. 什么是浅拷贝,深拷贝,如何实现?

  • 浅拷贝深拷贝都是复制对象时的概念。
  • 浅拷贝是指复制对象时,只复制每个属性的值,如果有引用类型则直接复制该引用的值,这就导致复制完成后,两个对象中的引用类型是指向同一个对象。
  • 深拷贝复制时,则会把引用属性指向的对象也复制一份,作为属性值。
  • 浅拷贝可以通过实现Cloneable接口重写clone方法,调用clone方法即可完成拷贝过程。
  • 深拷贝则可以在浅拷贝的基础上使被拷贝对象中的引用属性也实现Cloneable接口重写clone方法,并在本类的clone方法中手动调用引用属性的clone方法来完成深拷贝

4. synchronized 和 volatile 的区别

  • volatile用于保证内存可见性和防止指令重排序。
  • synchronized也可以实现这两个功能,只是原理有所不同。
  • 当一个线程写一个 volatile 变量时,它会将修改后的值立即刷新到主内存。当其他线程读取同一个 volatile 变量时,它会从主内存中读取最新的值。volatile通过这样的方式保证可见性
  • synchronized则是通过使代码串行执行,并且每次加锁都会读取主存中最新的数据,释放锁时又会把工作内存中共享变量的数据刷新到主存,以此来保证线程访问到的都是最新的数据
  • volatile 是通过禁止重排序来解决重排序引起的问题,synchronized则是通过使代码块串行执行,即使进行了重排序,其他加锁的代码块也感知不到。

5. 构造方法能同步吗?

Java语法规定构造方法不能加synchronized ,因为在方法上加synchronized关键字相对于对当前对象加锁,也就是调用该构造方法创建的对象,那么这个锁一般情况下是不会有锁冲突的(除非在实例代码块中把this传出去),也就没有意义,如果构造方法内会操作外部的内存,那么可以使用synchronized对该类的class对象加锁,这样就可以确保每次调用构造方法都是对同一个对象加锁。

相关推荐
jimy113 分钟前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
ss27316 分钟前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
菜鸟~noob23320 分钟前
【电子战】第20篇:凸优化与对数障碍法【含matlab代码】
开发语言·matlab
Wang's Blog29 分钟前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
小小龙学IT44 分钟前
Python SQLAlchemy 2.0 深度解析:从 Core 到 ORM 的数据访问双引擎
开发语言·数据库·python
2601_962885721 小时前
如何用 Python 计算 ROC 变动率指标做动量分析?
开发语言·python·算法
DongQiShanRen1 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
潼心1412o1 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i1 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
cpolar技术支持2 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors