深克隆和浅克隆有什么区别?它的实现方式有哪些?使用克隆可以为我们快速地构建出一个已有对象的副本,它属于 Java 基础的一部分,也是面试中常被问到的知识点之一。
典型回答浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是共享给原型对象和克隆对象的。
简单来说就是浅克隆只会复制原型对象,但不会复制它所引用的对象,如下图所示:
深克隆(Deep Clone)是将原型对象中的所有类型,无论是值类型还是引用类型,都复制一份给克隆对象,也就是说深克隆会把原型对象和原型对象所引用的对象,都复制一份给克隆对象,如下图所示:
在 Java 语言中要实现克隆则需要实现 Cloneable 接口,并重写 Object 类中的 clone() 方法,实现代码如下:
12345678910111213141516171819202122232425262728293031323334353637public class CloneExample ...
谈谈你对锁的理解?如何手动模拟一个死锁?在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性,对开发者的要求也提高了一个档次。而锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。当然,在所有的面试中也都少不了关于“锁”方面的相关问题。
典型回答死锁是指两个线程同时占用两个资源,又在彼此等待对方释放锁资源,如下图所示:
死锁的代码演示如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243import java.util.concurrent.TimeUnit;public class LockExample { public static void main(String[] args) { deadLock(); // 死锁 }/** * 死锁 */private stat ...
如何实现本地缓存和分布式缓存?缓存(Cache) 是指将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度。
以目前的系统架构来说,用户的请求一般会先经过缓存系统,如果缓存中没有相关的数据,就会在其他系统中查询到相应的数据并保存在缓存中,最后返回给调用方。
缓存既然如此重要,那本课时我们就来重点看一下,应该如何实现本地缓存和分布式缓存?
典型回答本地缓存是指程序级别的缓存组件,它的特点是本地缓存和应用程序会运行在同一个进程中,所以本地缓存的操作会非常快,因为在同一个进程内也意味着不会有网络上的延迟和开销。
本地缓存适用于单节点非集群的应用场景,它的优点是快,缺点是多程序无法共享缓存,比如分布式用户 Session 会话信息保存,由于每次用户访问的服务器可能是不同的,如果不能共享缓存,那么就意味着每次的请求操作都有可能被系统阻止,因为会话信息只保存在某一个服务器上,当请求没有被转发到这台存储了用户信息的服务器时,就会被认为是非登录的违规操作。
除此之外,无法共享缓存可能会造成系统资源的浪费,这是 ...
Redis 中如何实现的消息队列?实现的方式有几种?细心的你可能发现了,本系列课程中竟然出现了三篇都是在说消息队列,第10篇时讲了程序级别的消息队列以及延迟消息队列的实现,而第15篇讲了常见的消息队列中间件 RabbitMQ、Kafka 等,由此可见消息队列在整个 Java 技术体系中的重要程度。本课时我们将重点来看一下 Redis 是如何实现消息队列的。
典型回答早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种:
使用 List 类型实现使用 ZSet 类型实现其中使用List 类型实现的方式最为简单和直接,它主要是通过 lpush、rpop 存入和读取实现消息队列的,如下图所示:
lpush 可以把最新的消息存储到消息队列(List 集合)的首部,而 rpop 可以读取消息队列的尾部,这样就实现了先进先出,如下图所示:
命令行的实现命令如下:
12345678127.0.0.1:6379> lpush mq "java" #推送消息 java(integer) 1127.0.0.1:6379> lpush mq &qu ...
Redis是如何实现高可用的?高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 Redis 作为一款普及率最高的内存型中间件,它的高可用技术也非常的成熟。
典型回答Redis 高可用的手段主要有以下四种:
数据持久化
主从数据同步(主从复制)
Redis 哨兵模式(Sentinel)
Redis 集群(Cluster)
其中数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了系统不可用的时间(省去了手动恢复数据的过程);而主从数据同步可以将数据存储至多台服务器,这样当遇到一台服务器宕机之后,可以很快地切换至另一台服务器以继续提供服务;哨兵模式用于发生故障之后自动切换服务器;而 Redis 集群提供了多主多从的 Redis 分布式集群环境,用于提供性能更好的 Redis 服务,并且它自身拥有故障自动切换的能力。
考点分析高可用的问题属于 Redis 中比较大的面试题了,因为很多知识点都和这个面试题有关,同时也属于比较难的面试题了。因为涉及了分布式集群,而分布式集群属于 Redis 中比较难懂的一个知识点。和 ...
NCC架构参照开发源码研究1.参照 在界面开发过程中,经常会出现需要引用系统中已定义的数据场景。在编辑界面通过弹出一个参照展示界面供选择参照来源数据。在开发过程中,会经常重复使用相同的 数据选择界面,例如单据上一般都会引用组织。因此需要提供一套统一的数据选择控件及服务,在业务单据开发时,只需要直接使用,减少业务开发的工作量。其次是基于表单模版进行开发时,框架需要一套标准的数据选择控件,已便于动态的进行控制。当需要引用数据时,使用统一的前端控件即可完成数据的选择,而不需要开发。为此,在yonbip中提供了统一公共的数据选择控件及服务框架,简称为参照。 参照管理,即管理各个领域服务中注册的参照信息,提供各个领域的参照查询、编辑、新增功能,简单来说,一个实体依赖另外一个实体的数据,另外一个实体就叫参照,参照是主要用于其他页面选择使用的。
参照,就是对其他实体信息的参照和对照
YonBIP高级版参照:
前端JS:通过配置属性控制参照的界面显示。
后端Java:拼接查询参数数据的具体SQL语句。
2.参照的业务场景使用参照的场景通常满足以下几个要求:
第一,用户需要填写的数据不可以随意 ...
TCP 为什么需要三次握手?TCP 协议是我们每天都在使用的一个网络通讯协议,因为绝大部分的网络连接都是建立在 TCP 协议上的,比如你此刻正在看的这篇文章是建立在 HTTP(Hypertext Transfer Protocol,超文本传送协议) 应用层协议的基础上的,而 HTTP 协议的“底层”则是建立在 TCP 的传输层协议上的。因此可以理解为,你之所以能看到本篇文章就是得益于 TCP 协议的功劳。
典型回答在回答这个问题之前,首先我们需要搞清楚两个概念,第一,什么是 TCP?第二,什么是 TCP 连接?只有搞明白了这两个问题,我们才能彻底搞懂为什么 TCP 需要三次握手?
什么是 TCP?首先来说 TCP(Transmission Control Protocol,传输控制协议)是一个面向连接的、可靠的、基于字节流的传输层协议。从它的概念中我们可以看出 TCP 的三个特点:面向连接、可靠性和面向字节流。
TCP 的特点面向连接:是指 TCP 是面向客户端和服务器端连接的通讯协议,使用它可以将客户端和服务器端进行连接。
可靠性:是指无论网络环境多差,TCP 都可以保证信息一定能 ...
用户分类统计接口(10.23)接口名称:用户分类统计接口
开发内容:这是我在实习中的第一个开发接口,主要实现用户的分类统计功能。接口通过执行 SQL 查询从数据库中获取用户信息(如用户类型和用户名),并根据用户类型进行分组统计。
具体实现步骤:
定义SQL查询
编写SQL语句:通过SQL语句查询sm_user表中查询用户类型和相应的用户数量。
1SELECT user_type, COUNT(*) AS user_count FROM sm_user GROUP BY user_type
执行查询
使用BaseDAO的executeQuery方法执行SQL查询,并将结果转换成List<UserTypeCountVo>对象列表,每个对象列表表示一种用户类型和相应数量,输出示例:
12345[ new UserTypeCountVo("admin", 20), new UserTypeCountVo("user", 10), new UserTypeCountVo("guest", 1)]
数据转 ...
你知道哪些设计模式?分别对应的应用场景有哪些?典型回答设计模式从大的维度来说,可以分为三大类:创建型模式、结构型模式及行为型模式,这三大类下又有很多小分类。
创建型模式是指提供了一种对象创建的功能,并把对象创建的过程进行封装隐藏,让使用者只关注具体的使用而并非对象的创建过程。它包含的设计模式有单例模式、工厂模式、抽象工厂模式、建造者模式及原型模式。
结构型模式关注的是对象的结构,它是使用组合的方式将类结合起来,从而可以用它来实现新的功能。它包含的设计模式是代理模式、组合模式、装饰模式及外观模式。
行为型模式关注的是对象的行为,它是把对象之间的关系进行梳理划分和归类。它包含的设计模式有模板方法模式、命令模式、策略模式和责任链模式。
下面我们来看看那些比较常见的设计模式的定义和具体的应用场景。
1. 单例模式单例模式是指一个类在运行期间始终只有一个实例,我们把它称之为单例模式。
单例模式的典型应用场景是 Spring 中 Bean 实例,它默认就是 singleton 单例模式。
单例模式的优点很明显,可以有效地节约内存,并提高对象的访问速度,同时避免重复创建和销毁对象所带来的性能消耗,尤 ...