JAVA一些学习文章

12 篇文章 0 订阅

四种引用方式有哪些,有哪些应用?

引用类型也分为四种:强引用、软引用、弱引用和虚引用

只要强引用存在,垃圾回收器将永远不会回收被引用的对象

软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收

「基础」四种引用类型:强引用、软引用、弱引用、虚引用 - 百里浅暮 - 博客园

(一)四种引用类型_tan1231的博客-CSDN博客

Fork-join框架是什么?

Fork/Join框架是Java7提供了的一个用于并行执行的任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

Fork 递归地将任务分解为较小的独立子任务,直到它们足够简单以便异步执行。

Join 将所有子任务的结果递归地连接成单个结果,或者在返回void的任务的情况下,程序只是等待每个子任务执行完毕。

Fork/Join框架其实就是指由ForkJoinPool作为线程池、ForkJoinTask为任务、ForkJoinWorkerThread作为执行任务的具体线程实体这三者构成的任务调度机制。

ForkJoinPool是fork/join框架的核心,是ExecutorService的一个实现,用于管理工作线程,并提供了一些工具来帮助获取有关线程池状态和性能的信息。

工作线程一次只能执行一个任务。ForkJoinPool线程池中的每个线程都有自己的双端队列用于存储任务(double-ended queue 或 deque),这种架构使用了一种名为工作窃取(work-stealing)算法来平衡线程的工作负载。

工作窃取(work-stealing)算法:空闲的线程试图从繁忙线程的deques中窃取工作

默认情况下,每个工作线程从其自己的双端队列中获取任务。但如果自己的双端队列中的任务已经执行完毕,双端队列为空,工作线程就会从另一个忙线程的双端队列尾部或全局入口队列中获取任务,因为这是最大概率可能找到工作的地方。

这种方法最大下限度地减少了线程竞争任务地可能性。它还减少了工作线程寻找任务地次数,因为它首先在最大可用地工作块上工作。

通常会使用双端队列,被窃取任务线程永远从双端队列的尾部拿任务执行,而窃取任务的线程永远从双端队列的头部拿任务执行。

工作窃取算法的优点是充分利用线程进行并行计算,并减少了线程间的竞争,其缺点是在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且消耗了更多的系统资源,比如创建多个线程和多个双端队列。

Fork/join框架_safe_u的博客-CSDN博客

Fork/Join框架_爱我所爱0505的博客-CSDN博客_forkjoin流程图

Java Fork/Join框架_LiZhen798的博客-CSDN博客

为什么要重写hashcode和equals?

重写equals方法是为了比较两个不同对象的值是否相等

重写hashCode是为了让同一个Class对象的两个具有相同值的对象的Hash值相等。

同时重写hashCode()与equals()是为了满足HashSet、HashMap等此类集合的相同对象的不重复存储。

举例:

hashmap的get方法,会经过hash方法确定这个元素在数组列表的位置,

如果没有重写hashcode,会导致两个内容相同的对象的hash值不一样,会有问题;

如果没有重写equals,在链表查找时,equals对比结果会不一样,也有问题

为什么要重写hashCode和equals方法【深入分析版】_pocher的博客-CSDN博客

为什么要重写hashcode和equals_谎话大方的博客-CSDN博客

深拷贝浅拷贝区别是什么?

深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存

深拷贝和浅拷贝的区别_qq_25073223的博客-CSDN博客_深拷贝和浅拷贝的区别

Error和exception有什么区别?

1、Exception和error都继承了throwable类,java中只有throwable类的实例才能被抛出或者捕获异常,是异常处理机制的基本类型;

2、Exception是指在程序正常的运行过程中,可以预料的意外情况,可以事先捕获并且处理的异常;

Exception又分为必检异常和免检异常:

必检异常:在编译期,必须显式捕获处理。

免检异常:指运行时异常,根据需要来判断是否需要捕获的异常,是可以通过规范代码避免发生的;例如NullPointerException,ArrayIndexOutOfBoundsException

3、Error是java程序运行中不可预料的异常情况,是程序出现的非正常,不可恢复的状态,此状态不需要捕获。例如OutOfMemoryError

常见的runtimeexception有哪些?

RuntimeException是Exception类的子类,Exception类对象是Java程序处理或抛弃的对象,它有各种不同的子类分别对应于不同类型的例外。其中类RuntimeException代表运行时由Java虚拟机生成的例外,如算术运算异常 ArithmeticException(例如除以 0)、数组索引越界异常ArrayIndexOutOfBoundsException等;其他则为非运行时异常,例如输入输出异常IOException等。

NullPointerException:空指针异常

ArrayOutOfBoundsException:数组索引越界异常

ClassCastException:类型强制转换异常

IOException:输入输出异常

FileNotFoundException:文件未找到异常

(十五)、常见的几种RuntimeException - 黎先生 - 博客园

 

异常体系是怎样的?

java异常体系_捻玖的博客-CSDN博客_java异常体系

Selvlet生命周期?

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 初始化后调用 init () 方法。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 销毁前调用 destroy() 方法。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

java servlet的生命周期_Java Servlet系列之Servlet生命周期_吉祥受的博客-CSDN博客

Java/dubbo/spring SPI机制

Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。

为某个接口寻找服务实现的机制

调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略

比较常见的例子:

数据库驱动加载接口实现类的加载

JDBC加载不同类型数据库的驱动

日志门面接口实现类加载

SLF4J加载不同提供商的日志实现类

优点:

使用Java SPI机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。

相比使用提供接口jar包,供第三方服务模块实现接口的方式,SPI的方式使得源框架,不必关心接口的实现类的路径,可以不用通过下面的方式获取接口实现类

缺点:

虽然ServiceLoader也算是使用的延迟加载,但是基本只能通过遍历全部获取,也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。获取某个实现类的方式不够灵活,只能通过Iterator形式获取,不能根据某个参数来获取对应的实现类。

多个并发多线程使用ServiceLoader类的实例是不安全的。

高级开发必须理解的Java中SPI机制 - 简书

一文读懂Spring的SPI机制_听到微笑的博客-CSDN博客

面试常问的dubbo的spi机制到底是什么?

Dubbo - Dubbo的SPI机制_无法无天过路客的博客-CSDN博客

双亲委派模型

双亲委派模型_大头菜~的博客-CSDN博客

什么是双亲委派模型?_学一次的博客-CSDN博客

 

Fail-fast是什么?

迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedModCount值,是的话就返回遍历;否则抛出异常,终止遍历。

看异常ConcurrentModificationException,JDK中是这么介绍该异常的:当检测到一个并发的修改,就可能会抛出该异常,一些迭代器的实现会抛出该异常,以便可以快速失败。但是你不可以为了便捷而依赖该异常,而应该仅仅作为一个程序的侦测

什么是fail-fast - 程序员自由之路 - 博客园

fail-fast 机制是什么?(详解)_OYMN的博客-CSDN博客

Happens-before是什么?

happens-before是什么?JMM最最核心的概念,看完你就懂了_王9911的博客-CSDN博客

什么是 happens-before? - 腾讯云开发者社区-腾讯云

什么是happens-before原则?_Shockang的博客-CSDN博客

反射会什么比比较慢?

Java反射到底慢在哪?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值