- 博客(379)
- 资源 (3)
- 收藏
- 关注
原创 快速排序小结
1.首先我需要对快速排序算法下个定义:什么是快排呢?或者是排序的指导思想比如一个待排序的数组int iArray[] = {5,4,45,878,45}; 我们需要把这个数组从小到大进行排序。我们首先需要找到一个参数轴 也就是参数的数据 有了参考数据我们就把数据分成2个部分,一个数据全部是大于或者等于当前参考数据,另一部分数据都是小于或者等于当前参考数据的。下面分析快排算法的执行过程。...
2025-03-04 15:58:24
294
原创 剪绳子(动态规划)
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。当绳子的长度大于3时,这之后2/3这种子问题最大dp[i]就是其自身长度,而不再需要考虑剪一刀的问题。剪下一刀后剩下的两段长度是j和i-j,在这个上面还可能继续减(子问题),即关系式为: dp[i]=max(dp[j]·dp[i-j])2. 动态规划解决问题。
2024-03-13 22:03:46
340
2
原创 hashmap put 过程
而红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,引入红黑树就是为了查找数据快,解决链表查询深度的问题,我们知道红黑树属于自平衡二叉树,但是为了保持“平衡”是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。所以当长度大于8的时候,会使用红黑树,如果链表长度很短的话,根本不需要引入红黑树,引入反而会慢。
2023-05-19 14:44:12
547
1
原创 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
从设计和具体编码的角度,还有一个很有效的措施就是缓存历史时间戳,然后在序列生成之前进行检验,如果出现当前时间落后于历史时间的不合理情况,可以采取相应的动作,要么重试、等待时钟重新一致,或者就直接提示服务不可用。如果更加深入到时钟和分布式系统时序的问题,还有与分布式 ID 相关但又有所区别的问题,比如在分布式系统中,不同机器的时间很可能是不一致的,如何保证事件的有序性?前面谈到的方案中,有的是真正意义上的分布式,有得还是传统主从的思路,这一点没有绝对的对错,取决于我们业务对扩展性、性能等方面的要求。
2023-04-28 10:06:26
361
原创 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗
Java NIO 的设计也有类似的特点,开发者需要深入掌握线程、IO、网络等相关概念,学习路径很长,很容易导致代码复杂、晦涩,即使是有经验的工程师,也难以快速地写出高可靠性的实现。对比 Java 标准 NIO 的代码,Netty 提供的相对高层次的封装,减少了对 Selector 等细节的操纵,而 EventLoop、Pipeline 等机制则简化了编程模型,开发者不用担心并发等问题,在一定程度上简化了应用代码的开发。我的一个建议是,可以试着画出相应的示意图,非常有助于理解并能清晰阐述自己的看法。
2023-04-28 10:05:29
398
原创 谈谈Spring Bean的生命周期和作用域?
在之前的分析中,我们已经分析了 AOP Proxy 的实现原理,简单回顾一下,它底层是基于 JDK 动态代理或者 cglib 字节码操纵等技术,运行时动态生成被调用类型的子类等,并实例化代理对象,实际的方法调用会被代理给相应的代理对象。但是,这并没有解释具体在 AOP 设计层面,什么是切面,如何定义切入点和切面行为呢?你能看到,Bean 的生命周期是完全被容器所管理的,从属性设置到各种依赖关系,都是容器负责注入,并进行各个阶段其他事宜的处理,Spring 容器为应用开发者定义了清晰的生命周期沟通界面。
2023-04-28 10:05:25
239
原创 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
串行化(Serializable),并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,如果 SQL 使用 WHERE 语句,还会获取区间锁(MySQL 以 GAP 锁形式实现,可重复读级别中默认也会使用),这是最高的隔离级别。其他可以考察的点也有很多,在准备这个问题时你也可以对比 Java 语言的并发机制,进行深入理解,例如,随着隔离级别从低到高,竞争性(Contention)逐渐增强,随之而来的代价同样是性能和扩展性的下降。
2023-04-28 10:04:50
415
原创 JVM优化Java代码时都做了什么?
JVM 在对代码执行的优化可分为运行时(runtime)优化和即时编译器(JIT)优化。运行时优化主要是解释执行和动态编译通用的一些机制,比如说锁机制(如偏斜锁)、内存分配机制(如 TLAB)等。除此之外,还有一些专门用于优化解释执行效率的,比如说模版解释器、内联缓存(inline cache,用于优化虚方法调用的动态绑定)。JVM 的即时编译器优化是指将热点代码以方法为单位转换成机器码,直接运行在底层硬件之上。
2023-04-28 09:59:15
229
原创 有人说“Lambda能让Java程序慢30倍”,你怎么看?
在上一讲中,我介绍了 Java 性能问题分析的一些基本思路。但在实际工作中,我们不能仅仅等待性能出现问题再去试图解决,而是需要定量的、可对比的方法,去评估 Java 应用性能,来判断其是否能够符合业务支撑目标。今天这一讲,我会介绍从 Java 开发者角度,如何从代码级别判断应用的性能表现,重点理解最广泛使用的基准测试(Benchmark)。今天我要问你的问题是,有人说“Lambda 能让 Java 程序慢 30 倍”,你怎么看?为了让你清楚地了解这个背景,请参考下面的代码片段。
2023-04-28 09:51:39
414
原创 后台服务出现明显“变慢”,谈谈你的诊断思路?
大多数工程师也许并没有全面的性能问题诊断机会,如果被问到也不必过于紧张,你可以向面试官展示诊断问题的思考方式,展现自己的知识和综合运用的能力。目的是让你对性能分析有个整体的印象,在遇到特定领域问题时,即使不知道具体细节的工具和手段,至少也可以找到探索、查询的方向。所谓的细节,就是例如内存的使用情况、最频繁调用的方法是什么,或者上下文切换的情况等。如果你想了解更多细节,可以参考相关。当然,还有更加通用的诊断方向,利用 vmstat 之类,查看上下文切换的数量,比如下面就是指定时间间隔为 1,收集 10 次。
2023-04-28 09:51:06
213
原创 你了解Java应用开发中的注入攻击吗
比如利用哈希碰撞发起拒绝服务攻击(DOS,Denial-Of-Service attack),常见的场景是,攻击者可以事先构造大量相同哈希值的数据,然后以 JSON 数据的形式发送给服务器端,服务器端在将其构建成为 Java 对象过程中,通常以 Hastable 或 HashMap 等形式存储,哈希碰撞将导致哈希表发生严重退化,算法复杂度可能上升一个数量级(HashMap 后续进行了改进,我在。可以进行输入校验,限定什么类型的输入是合法的,例如,不允许输入标点符号等特殊字符,或者特定结构的输入。
2023-04-28 09:46:08
355
原创 Java程序运行在Docker等容器环境有哪些新问题
第二,namespace 对于容器内的应用细节增加了一些微妙的差异,比如 jcmd、jstack 等工具会依赖于“/proc//”下面提供的部分信息,但是 Docker 的设计改变了这部分信息的原有结构,我们需要对原有工具进行。更进一步来说,对于容器镜像大小的问题,如果你使用的是 JDK 9 以后的版本,完全可以使用 jlink 工具定制最小依赖的 Java 运行环境,将 JDK 裁剪为几十 M 的大小,这样运行起来并不困难。这就类似,我以为我住的是整栋别墅,实际上却只有一个房间是给我住的。
2023-04-27 14:14:19
260
原创 Java内存模型中的happen-before是什么
试想,如果处理器对某个共享变量进行了修改,可能只是体现在该内核的缓存里,这是个本地状态,而运行在其他内核上的线程,可能还是加载的旧状态,这很可能导致一致性的问题。当然,这也是以一定的性能开销作为代价的,但毕竟带来了更加简单的多线程行为。但是,显然问题的复杂度被低估了,随着 Java 被运行在越来越多的平台上,人们发现,过于泛泛的内存模型定义,存在很多模棱两可之处,对 synchronized 或 volatile 等,类似指令重排序时的行为,并没有提供清晰规范。你可以从下面示意图,看这两种模型的对应。
2023-04-27 14:13:24
207
原创 谈谈你的GC调优思路
在 G1 实现中,年代是个逻辑概念,具体体现在,一部分 region 是作为 Eden,一部分作为 Survivor,除了意料之中的 Old region,G1 会将超过 region 50% 大小的对象(在应用中,通常是 byte 或 char 数组)归类为 Humongous 对象,并放置在相应的 region 中。下面的示意图说明了相关设计。这里需要思考,选择的 GC 类型是否符合我们的应用特征,如果是,具体问题表现在哪里,是 Minor GC 过长,还是 Mixed GC 等出现异常停顿情况;
2023-04-27 14:12:09
271
原创 java常见的垃圾收集器有哪些
典型回答实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM、Oracle),不同版本的 JVM,提供的选择也不同。接下来,我来谈谈最主流的 Oracle JDK。Serial GC,它是最古老的垃圾收集器,“Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态。当然,其单线程设计也意味着精简的 GC 实现,无需维护复杂的数据结构,初始化也简单,所以一直是 Client 模
2023-04-27 14:11:38
222
原创 如何监控和诊断JVM堆内和堆外内存使用?
这里有一个相对特殊的部分,就是是堆外内存中的直接内存,前面的工具基本不适用,可以使用 JDK 自带的 Native Memory Tracking(NMT)特性,它会从 JVM 本地内存分配的角度进行解读。对于堆内存,我在上一讲介绍了最常见的新生代和老年代的划分,其内部结构随着 JVM 的发展和新 GC 方式的引入,可以有不同角度的理解,下图就是年代视角的堆结构示意图。在 JMC 或 JConsole 的内存管理界面,会统计部分非堆内存,但提供的信息相对有限,下图就是 JMC 活动内存池的截图。
2023-04-27 14:11:04
1761
原创 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
典型回答通常可以把 JVM 内存区域分为下面几个方面,其中,有的区域是以线程为单位,而有的区域则是整个 JVM 进程唯一的。首先,程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。第二,Java 虚拟机栈(Java Virtua
2023-04-27 14:09:56
205
原创 有哪些方法可以在运行时动态生成一个Java类?
我们可以从常见的 Java 类来源分析,通常的开发过程是,开发者编写 Java 代码,调用 javac 编译成 class 文件,然后通过类加载机制载入 JVM,就成为应用运行时可以使用的 Java 类了。为了理解底层的原理,我选取的例子是比较偏底层的、能力全面的类库,如果实际项目中需要进行基础的字节码操作,可以考虑使用更加高层次视角的类库,例如。首先,我们来理解一下,类从字节码到 Class 对象的转换,在类加载过程中,这一步是通过下面的方法提供的功能,或者 defineClass 的其他本地对等实现。
2023-04-27 14:08:26
520
原创 请介绍类加载过程,什么是双亲委派模型?
验证(Verification),这是虚拟机安全的重要保障,JVM 需要核验字节信息是符合 Java 虚拟机规范的,否则就被认为是 VerifyError,这样就防止了恶意信息或者不合规的信息危害 JVM 的运行,验证阶段有可能触发更多 class 的加载。最后是初始化阶段(initialization),这一步真正去执行类初始化的代码逻辑,包括静态字段赋值的动作,以及执行类定义中的静态初始化块内的逻辑,编译器在编译阶段就会把这部分逻辑整理好,父类型的初始化逻辑优先于当前类型的逻辑。这个方面的集大成者是。
2023-04-27 14:07:26
261
原创 AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
这里就是我们所说的,利用 FIFO 队列,实现线程间对锁的竞争的部分,算是是 AQS 的核心逻辑。今天的问题有点偏向于 Java 并发机制的底层了,虽然我们在开发中未必会涉及 CAS 的实现层面,但是理解其机制,掌握如何在 Java 中运用该技术,还是十分有必要的,尤其是这也是个并发编程的面试热点。以非公平的 tryAcquire 为例,其内部实现了如何配合状态与 CAS 获取锁,注意,对比公平版本的 tryAcquire,它在锁无人占有时,并不检查是否有其他等待者,这里体现了非公平的语义。
2023-04-27 14:06:34
177
原创 Java并发类库提供的线程池有哪几种? 分别有什么特点?
前面我说过 newFixedThreadPool 是创建指定数目的线程,但是其工作队列是无界的,如果工作线程数目太少,导致处理跟不上入队的速度,这就很有可能占用大量系统内存,甚至是出现 OOM。往往是不能的,如果线程太多,反倒可能导致大量的上下文切换开销。newSingleThreadExecutor(),它的特点在于工作线程数目被限制为 1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目。
2023-04-27 14:06:03
231
原创 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别
notEmpty、notFull 都是同一个再入锁的条件变量,而 LinkedBlockingQueue 则改进了锁操作的粒度,头、尾操作使用不同的锁,所以在通用场景下,它的吞吐量相对要更好一些。LinkedBlockingQueue,容易被误解为无边界,但其实其行为和内部代码都是基于有界的逻辑实现的,只不过如果我们没有在创建队列时就指定容量,那么其容量限制就自动被设置为 Integer.MAX_VALUE,成为了无界队列。但是,凡事都是有代价的,Concurrent 往往提供了较低的遍历一致性。
2023-04-26 15:19:06
311
原创 Java并发包提供了哪些并发工具类
注意,上面的代码,更侧重的是演示 Semaphore 的功能以及局限性,其实有很多线程编程中的反实践,比如使用了 sleep 来协调任务执行,而且使用轮询调用 availalePermits 来检测信号量获取情况,这都是很低效并且脆弱的,通常只是用在测试或者诊断场景。但是,从具体节奏来看,其实并不符合我们前面场景的需求,因为本例中 Semaphore 的用法实际是保证,一直有 5 个人可以试图乘车,如果有 1 个人出发了,立即就有排队的人获得许可,而这并不完全符合我们前面的要求。
2023-04-26 15:17:15
453
原创 什么情况下Java程序会产生死锁?如何定位、修复?
通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。除了典型应用中的死锁场景,其实还有一些更令人头疼的死锁,比如类加载过程发生的死锁,尤其是在框架大量使用自定义类加载时,因为往往不是在应用本身的代码库中,jstack 等工具也不见得能够显示全部锁信息,所以处理起来比较棘手。今天,我从样例程序出发,介绍了死锁产生原因,并帮你熟悉了排查死锁基本工具的使用和典型思路,最后结合实例介绍了实际场景中的死锁分析方法与预防措施,希望对你有所帮助。
2023-04-26 15:02:11
357
原创 一个线程两次调用start()方法会出现什么情况?
从操作系统的角度,可以简单认为,线程是系统调度的最小单元,一个进程可以包含多个线程,作为任务的真正运作者,有自己的栈(Stack)、寄存器(Register)、本地存储(Thread Local)等,但是会和进程内其他线程共享文件描述符、虚拟地址空间等。我们可以直接扩展 Thread 类,然后实例化。尤其是在多核 CPU 的系统中,线程等待存在一种可能,就是在没有任何线程广播或者发出信号的情况下,线程就被唤醒,如果处理不当就可能出现诡异的并发问题,所以我们在等待条件过程中,建议采用下面模式来书写。
2023-04-26 14:56:34
591
原创 synchronized底层如何实现?什么是锁的升级、降级?
我在对比和分析了 synchronized 和 ReentrantLock,算是专栏进入并发编程阶段的热身,相信你已经对线程安全,以及如何使用基本的同步机制有了基础,今天我们将深入了解 synchronize 底层机制,分析其他锁实现和应用场景。今天我要问你的问题是 ,synchronized 底层如何实现?什么是锁的升级、降级?
2023-04-26 14:45:23
377
原创 synchronized 和 ReentrantLock 有什么区别
9.Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用synchronized 时, 等待的线程会一直等待下去,不能够响应中断。2.ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性。6.底层实现不一样, synchronized 是同步阻塞,使用的是悲观并发策略,lock 是同步非阻塞,采用的是乐观并发策略。2.都是可重入锁,同一线程可以多次获得同一个锁。3.都保证了可见性和互斥性。
2023-04-26 14:32:27
144
原创 谈谈你知道的设计模式
策略模式、解释器模式、命令模式、观察者模式、迭代器模式、模板方法模式、访问者模式。桥接模式、适配器模式、装饰者模式、代理模式、组合模式、外观模式、享元模式等。BeanFactory 和 Application 应用工厂模式。Bean 的创建过程中,提供了单例和原型模式。AOP 中的代理模式,装饰器模式,适配器模式。工厂模式、单例模式、构建器模式、原型模式。类似JdbcTemplate 的模板模式。通过实例学习和理解设计模式。各种事件监听器,观察者模式。
2023-04-26 14:29:58
50
原创 谈谈接口和抽象类有什么区别
接口使用关键字 interface 来定义。抽象类使用关键字 abstract 来定义。定义的关键字不同。子类继承或实现关键字不同。类型扩展不同:抽象类是单继承,而接口是多继承。方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。属性方法控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符。方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;
2023-04-26 14:12:03
207
1
原创 Java有几种文件拷贝方式?哪一种最高效
ava.io的FileInputStream/FileOutputStream或者java.nio的transferTo/transferFrom。nio方式可能更快,因为使用了零拷贝技术,数据传输不需要切换到用户态参与,减少了上下文切换和不必要的内存拷贝。比如应用读取数据时,先在内核态将数据从磁盘读取到内核缓存,再切换到用户态将数据从内核缓存读取到用户缓存。而NIO transferTo则直接在内核中进行数据拷贝。
2023-04-26 14:04:06
376
原创 Java提供了哪些IO方式? NIO如何实现多路复用
Java IO方式由很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分。首先,传统的Java.IO包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式。也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。Java.io包的好处是代码比较简单、直观,缺点是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。
2023-04-26 11:50:13
172
原创 对比Hashtable、HashMap、TreeMap有什么不同
TreeMap则是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、 put、 remove之类操作都是O(log(n))的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。Hashtable是早期Java类库提供的一个哈希表实现,本身是同步的,不支持null键和值,由于同步导致的性能开销,所以已经很少被推荐使用。作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户ID和用户信息对应的运行时存储结构。
2023-04-25 19:31:11
109
原创 对比Vector、ArrayList、LinkedList有何区别
这三者都是实现集合框架中的List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。实现,它本身不是线程安全的,所以性能要好很多。,所以它不需要像上面两种那样调整容量,
2023-04-25 15:59:22
57
原创 int和Integer有什么区别
3.非new生成的Integer变量和new Integer生成的Integer变量比较的时候,结果为false(因为非new生成的Integer变量指向的是Java常量池中的对象,而new出来的对象指向的是堆中新建的对象,两者内存地址不同),下面返回的是false。4.两个非new出来的Integer对象,进行比较的时候,如果两个变量的值区间在-127~128之间的时候,则返回的结果为true,如果两个变量的变量值不在这个区间,则比较的结果为false。下面返回的是true。下面返回的是false。
2023-04-25 15:54:22
1148
原创 动态代理是基于什么原理?
总的来说,这道题目考察的是 Java 语言的另外一种基础机制: 反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
2023-04-25 15:52:26
50
原创 String、StringBuffer、StringBuilder有什么区别
StringBuilder 和 StringBuffer 方法和功能完全一致,只是一个是早期版本(StringBuffer)是线程安全的,由于发现利用多线程堆同一String数据操作的情况是很少的,为了提高效率idk1.5以后有StringBuilder 类。意思是多线程操作同一字符串的时候用StringBuffer 安全,现在一般用StringBuilder。
2023-04-25 15:48:40
48
原创 强引用、软引用、弱引用、幻象引用有什么区别
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。特别注意,在实际程序设计中一般很少使用弱引用与虚引用,使用软用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。
2023-04-25 15:32:39
775
原创 final、finally、finalize 有什么区别
finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收,但在 JDK 9 中已经被标记为弃用的方法(deprecated)。在实际开发中不推荐使用 finalize 方法,它虽然被创造出来,但无法保证 finalize 方法一定会被执行,所以不要依赖它释放任何资源,因为它的执行极不“稳定”。在 JDK 9 中将它废弃,也很好的证明了此观点。
2023-04-25 15:29:23
55
原创 Exception和Error有什么区别?
问题是,实际上可能吗?Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。NoClassDefFoundError是一个错误(Error),而ClassNotFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。
2023-04-25 15:15:09
215
原创 编译型和解释型
由于解释型程序是将翻译过程放到执行过程中,这就导致了解释型程序注定了比编译型程序慢了一大截,而且每次运行程序,都要对源代码进行重新解释,而不是执行最终产品所以效率较低;源代码中一处有错误,就不允许编译,编译过程中出现一处错误,就停止编译。#编译型:用编译型语言写的程序执行之前,需要一个专门的编译过程,针对特定的平台,使用专门的编译器,把高级语言翻译成机器语言,以后直接运行而不需要再编译了。所以可是说java即是编译型的,也是解释型,但是假如非要归类的话,从概念上的定义,恐怕java应该归到解释型的语言中。
2023-04-25 15:13:12
90
MapReduce1.doc
2019-06-20
云计算期末复习
2019-01-03
编译原理复习提纲
2019-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人