当前位置: 首页 > news >正文

专门做销售培训的网站网站支付页面怎么做的

专门做销售培训的网站,网站支付页面怎么做的,企业为什么做企业网站和推广,公司想推广做网站有用引言 本文是java面试时的一些常见知识点总结归纳和一些拓展#xff0c;笔者在学习这些内容时#xff0c;特地整理记录下来#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类#xff0c;Integer和int区别是什么#xff1f; 使用封装类的目的 对象化:…引言 本文是java面试时的一些常见知识点总结归纳和一些拓展笔者在学习这些内容时特地整理记录下来以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类Integer和int区别是什么 使用封装类的目的 对象化: 基本数据类型如int、double不是对象无法直接利用面向对象的特性如方法扩展、继承等。封装类将基本类型转化为对象允许它们具有方法可以更容易地操作和传递。 空值处理: 基本数据类型必须有值而封装类可以为null这在某些情况下非常有用比如数据库查询结果可能为null时。 自动装箱与拆箱: Java提供了自动装箱和拆箱功能使得基本类型和封装类之间可以无缝转换方便编程。 集合框架兼容性: Java集合框架如List、Set、Map不能直接存储基本类型只能存储对象。封装类使得基本类型能够被放入集合中。 Integer与int的区别 类型: int是Java的一个基本数据类型而Integer是int的封装类属于对象。 内存分配: int变量直接存储在栈上空间小且效率高Integer对象存储在堆上需要额外的空间用于存储对象信息并且创建和回收对象有一定的开销。 初始化默认值: int类型的默认值为0Integer类型的默认值为null表示未指向任何对象。 可变性: int一旦赋值后不可更改而Integer作为对象虽然其内部的值通常视为不变但作为对象本身是可以被替换的。 自动装箱与拆箱: Java会自动在int和Integer之间转换这个过程称为自动装箱和拆箱。例如可以直接将int值放入需要Integer的集合中反之亦然。 1.2 Integer类型下为什么1000 1000是false“100 100” 是true 以下是代码 public static void main(String[] args) {Integer a 100, b 100,c 1000,d 1000;System.out.println(100 100 :(a b));System.out.println(1000 1000 :(c d));}运行结果如下 为什么呢这要分析Integer的源码了 Integer中有个方法valueOf()从源码可以看到当i值处于一定范围时返回的其实是IntegerCache缓存里的值并没有new Integer对象当不在这个范围时返回新对象。 再看下面的代码IntegerCache是一个内部类 IntegerCache.low -128IntegerCache.hign 127其实就是-128~127之间的数都缓存到IntegerCache.cache数组里面了。 Integer a 100b 100100位于-128~127之间。a和b都是从IntegerCache.cache数组中取得同一个对象所以a b是true即 100 100 是true。 而1000不在-128~127之间Integer c 1000d 1000c和d是创建的两个不同的对象因此c d是false即1000 1000是false。 1.3 new String(“hello”)创建了几个对象 这是一个很经典的面试题目了主要考察字符串和字符串常量池的掌握深度。 我们一般声明并赋值一个字符串常量表达式如下 String a hello这种方式首先会在字符串常量池中查找是否已经存在值为 “hello” 的字符串。如果不存在会在池中创建一个新对象如果存在则直接引用这个已存在的对象。这种方式更高效且有助于节省内存。当常量池中已经存在字符串常量时就不需要创建新的实例了。 再看另外一种创建字符串的方式 String b new String(hello)当使用 String b new String(“hello”) 这种方式创建字符串时具体过程如下 检查常量池首先Java 虚拟机JVM会检查字符串常量池中是否已经存在值为 “hello” 的字符串。如果不存在JVM 会在常量池中创建一个字符串对象存储内容为 “hello”。堆上创建对象不论常量池中是否已有 “hello”都会在堆heap上创建一个新的 String 实例。这个新创建的对象包含对常量池中对应字符串的引用如果之前步骤在池中创建了字符串的话。变量 b 最终会指向堆上这个新创建的 String 对象。 也就是说 new String(“hello”)这种方式至少在堆中会创建一个new String()实例至于会不会先在常量池中创建字符串常量需要看字符串是否存在于常量池。 1.4 String、StringBuilder、StringBuffer的区别是啥 关于这三个常用操作字符串的类可以从以下四个方面来比较 值可变性方面 String内部是final修饰的它是不可变类。每次对一个字符串的修改操作都会产生一个新的字符串对象。StringBuilder、StringBuffer是可变类一般用于字符串的拼接操作字符串变更时不会产生新对象都是在原有的字符串基础上变化。 线程安全 String 是不可变类其内部的许多方法都不会对原始字符串做修改而是返回新字符串对象即使多个线程访问这个字符串也不用担心修改问题所以它是线程安全的。StringBuffer是线程安全的因为它的每个方法几乎都加了synchronized关键字而且它也是final修饰的不可变类。StringBuilder不是线程安全的。因为其内部没有同步机制多线程环境下使用StringBuffer操作字符串单线程下才使用StringBuilder 性能方面 String的性能最低因为其内部不可变性总是生成新对象分配内存。然后是StringBuffer因为它的可变性使得字符串可以直接修改不需要创建新对象。但是StringBuilder性能是最高的因为内部没有加锁的同步机制性能自然最高。 数据存储 String通常存储在字符串常量池中而StringBuffer和StringBuilder存储在堆内存中。 二、Object对象 2.1 如何理解java对象的创建过程 声明引用变量首先在代码中声明一个引用变量该变量的类型指定为某个类或接口。此时变量还没有关联到实际的对象。 Student student;分配内存当使用 new 操作符实例化一个对象时Java 虚拟机 (JVM) 会执行以下操作 计算大小JVM 计算该对象及其内部成员变量所需的空间。分配空间在堆内存中找到足够的连续空间来存储对象。如果内存不足会触发垃圾回收器尝试释放空间。初始化零值为对象的所有成员变量分配默认值如 int 为 0boolean 为 false引用类型为 null。 初始化 执行构造函数JVM 调用对应的构造函数来初始化对象。构造函数可以设置成员变量的初始值执行其他必要的初始化操作。父类构造函数如果构造函数中没有显式调用超类构造函数编译器会自动插入对超类无参构造函数的调用。如果有参数传递给 super()则按照指定参数调用。 关联引用构造函数执行完毕后新创建的对象的地址被赋给之前声明的引用变量。这时引用变量才真正“指向”了堆内存中的对象实例。 student new Student();对象可达性分析新创建的对象如果被任何变量引用那么它就是可达的不会被垃圾回收。否则如果没有任何引用指向它它将成为垃圾回收的候选对象。 2.2 深克隆和浅克隆 深克隆和浅克隆是Java中对象复制的两种方式它们主要区别在于对对象引用类型的处理上 浅克隆Shallow Clone 定义浅克隆仅复制对象的基本数据类型属性值和引用类型的引用地址。这意味着原始对象和克隆对象将共享引用类型的对象。如果修改其中一个对象中的引用类型属性另一个对象中的对应属性也会受到影响。 实现通过实现 Cloneable 接口并重写 clone() 方法来实现浅克隆。默认的 clone() 方法执行的是浅复制。 特点 基本数据类型和 String 类型的属性会被完整复制。引用类型的属性仅复制引用地址不复制引用的对象本身。 深克隆Deep Clone 定义深克隆不仅复制对象本身还递归地复制对象内部的所有引用类型属性创建这些引用对象的新实例确保原始对象和克隆对象之间完全独立修改一个对象不会影响到另一个对象。 实现实现深克隆通常需要手动编写逻辑或者利用序列化和反序列化的方式来完成。手动实现时需要对每个引用类型的属性也进行克隆操作如果是复杂对象则需递归地进行深克隆。 特点 无论基本数据类型、String 类型还是引用类型都会创建全新的副本。引用类型的属性会被完全复制包括它们指向的对象从而实现完全独立的复制。 总结 浅克隆速度快因为它只是复制了对象的引用但可能导致数据一致性问题。深克隆更耗时因为它复制了整个对象树但提供了对象的完全隔离适用于需要完全独立副本的场景。 2.3 强引用、弱引用、软引用、虚引用的区别 对于这四种引用类型我们实际开发中好像并不太去关注而且实际开发中我们大部分使用的都是强引用。下面逐一介绍并通过代码示例深入说明。 强引用 (Strong Reference) 定义最常见的引用类型如 Object obj new Object(); 中的 obj 就是一个强引用。只要强引用存在垃圾收集器永远不会回收被引用的对象即使在内存不足的情况下JVM也会宁愿抛出OutOfMemoryError错误也不会回收这样的对象。用途用于维护程序的关键对象这些对象在程序逻辑中通常是必须存在的。 下面是一个代码示例 package com.execute.batch.executebatch;public class StrongReference {public static void main(String[] args) {new StrongReference().method1();}public void method1() {Object object new Object();Object[] objArr new Object[Integer.MAX_VALUE];} } 报错如下 当运行至Object[] objArr new Object[Integer.MAX_VALUE]时如果内存不足JVM会抛出OOM错误也不会回收object指向的对象。不过要注意的是当method1运行完之后object和objArr都已经不存在了所以它们指向的对象都会被JVM回收。 只要还有强引用指向一个对象垃圾收集器就不会回收这个对象。当然如果你显示的把引用object 设置 为 null或者超出对象的生命周期比如方法调用结束此时就可以回收这个对象。具体回收时机还是要看垃圾收集策略。 软引用SoftReference 定义使用 java.lang.ref.SoftReference 类来创建。软引用指向的对象在内存充足时不会被垃圾回收器回收但在内存不足时将被回收因此软引用主要用于实现一些内存敏感的缓存。 用途适合用于构建可牺牲的缓存如图片缓存、文档缓存等可以在内存紧张时自动释放以避免OutOfMemoryError。 package com.execute.batch.executebatch;import java.lang.ref.SoftReference; import java.util.Objects;public class SoftRef {public static void main(String[] args){System.out.println(start);Obj obj new Obj();SoftReferenceObj sr new SoftReference(obj);obj null;System.out.println(Objects.requireNonNull(sr.get()).obj.length);System.out.println(end);} }class Obj{int[] obj ;public Obj(){obj new int[1000];} }先创建了一个强引用在内存充足时把这个强引用放置到软引用中接着把强引用置为null被gc回收了。我们取数据就可以从软引用中获取速度更快。当然内存不足时软引用中就会被gc回收。 被软引用关联对象的回收主要看内存是否充足充足就不回收不充足就回收在提升性能和效率的同时兼顾了资源释放 弱引用 定义通过 java.lang.ref.WeakReference 类创建。弱引用的对象无论内存是否足够只要发生垃圾回收都会被回收。 用途适用于非必须的对象比如映射表中的键这样当键不再有强引用指向时垃圾回收器可以自动清理映射表中的条目避免内存泄漏。 package com.execute.batch.executebatch;import java.lang.ref.WeakReference;public class WeakRef {public static void main(String[] args) {WeakReferenceString sr new WeakReference(new String(hello));System.out.println(sr.get());System.gc(); //通知JVM的gc进行垃圾回收System.out.println(sr.get());} } 代码中手动通知了jvm进行垃圾回收即弱引用关联的对象在gc回收时是一定被回收的。 有个注意点: 代码中把new String(“hello”)改为“hello就不回收了都会打印出hello 为什么呢解释如下 代码从 new String(“hello”) 改为 “hello” 时实际上是在直接引用字符串常量池中的那个唯一的hello实例而不是像之前那样创建一个新的String对象。 使用new String(“hello”)时 这会创建两个String对象一个是常量池中的hello另一个是堆上通过new操作新生成的对象。由于这个新对象只被WeakReference引用所以在执行System.gc()后这个堆上的对象可能被垃圾回收器回收因为WeakReference不会阻止其引用的对象被回收。 使用hello时 此时直接引用常量池中的字符串没有额外的堆对象创建。字符串常量池中的对象不会被垃圾回收因为它们的生命周期与应用程序的运行期相同并且存在对它们的隐式强引用即类加载器和字符串字面量的引用。因此即使在调用System.gc()之后通过sr.get()获取到的引用仍然有效因为它指向的是不可被回收的常量池中的字符串。 虚引用 等同于没有引用对象被回收时会收到通知。虚引用不会决定对象的生命周期它提供一种确保对象被finalize以后去做某些事情的机制。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象的内存之前把这个虚引用加入与之关联的引用队列中程序可以通过判断引用队列是否已经加入了虚引用来决定被引用对象是否要被垃圾回收器回收。然后我们就可以在引用对象回收前执行一些必要的操作**。所以虚引用必须和引用队列一起使用**。 package com.execute.batch.executebatch;import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue;public class PhantomReferenceExample {public static void main(String[] args) {Object referent new Object();ReferenceQueueObject queue new ReferenceQueue();PhantomReferenceObject phantomRef new PhantomReference(referent, queue);// 将referent设置为null使其仅被虚引用引用referent null;// 触发垃圾回收但注意我们无法直接控制GC何时运行System.gc();// 检查引用队列看是否已经回收了referent对象while (queue.poll() ! null) {System.out.println(对象被回收了可以从队列中获取通知);referent null; // 队列处理后重置referent确保逻辑正确}// 注意这里只是演示逻辑实际回收发生和队列通知的时间取决于JVM的GC行为} } 代码中垃圾回收触发后对象不是立刻被回收具体要看gc自己的回收时间。 2.4 一个空的Object对象占多大内存 对象是存储在堆内存中的那么一个对象在虚拟机中的内存布局是什么样的呢 对象头Header: 包含了对象的元数据如对象的哈希码、GC分代年龄、锁状态标志、类型指针等。这部分的大小依赖于具体的JVM实现和操作系统。在64位的HotSpot JVM中对象头通常占用12或16字节具体取决于是否启用了压缩指针。 实例数据Instance Data: 对于一个没有任何实例变量的空Object这部分实际上是0字节。 对齐填充Padding: JVM为了保持对象的内存地址对齐通常是8字节对齐可能会在对象末尾添加额外的字节。这取决于上述两部分总和后的字节是否已经满足对齐要求。 根据以上的结果大概总结出如下规则 一个java空对象开启压缩指针的情况下占12字节_mark(Markdown) 占8字节**_class(类元指针)**占4字节为了避免伪共享问题jvm会按照8字节的倍数进行填充所以会在对齐填充区填充4字节变为16字节。 在关闭压缩指针的情况下Object默认会占16字节。其中Markdown占8字节 类元指针就占8字节正好是16字节是8 的倍数不需要填充了。 所以结论是一般情况下一个空的Object对象占用16字节的内存空间。 2.5 为什么重写equals()就一定要重写hashCode()方法 主要有以下几个原因 相等性一致性 当两个对象通过equals()方法比较时被认为是相等的那么它们的hashCode()方法必须返回相同的值。这是为了确保当对象用作哈希表的键时能够正确地定位和管理这些键值对。 集合操作的正确性 在HashMap、HashSet等集合中元素的存储位置由其hashCode()决定。如果两个逻辑上相等的对象即equals()返回true具有不同的哈希码它们可能会被错误地视为两个独立的元素导致诸如contains()、remove()等操作出现意料之外的结果。 性能考虑 哈希表的高效查找依赖于较低的哈希冲突率。当hashCode()方法没有正确实现时可能导致哈希冲突增多进而影响集合的插入、查询等操作的性能。 遵守Java规范 Java官方文档明确指出如果你重写了equals()方法而没有重写hashCode()那么你的类将违反Object类的通用约定这可能导致难以预料的行为特别是在集合框架的使用中。 以下是示例代码: package com.execute.batch.executebatch;import java.util.HashSet; import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}// 重写equals方法Overridepublic boolean equals(Object obj) {if (this obj) return true;if (obj null || getClass() ! obj.getClass()) return false;Person person (Person) obj;return age person.age Objects.equals(name, person.name);}// 重写hashCode方法Overridepublic int hashCode() {return Objects.hash(name, age);}public static void main(String[] args) {Person person1 new Person(Alice, 30);Person person2 new Person(Alice, 30);HashSetPerson set new HashSet();set.add(person1);set.add(person2);System.out.println(person1.equals(person2)); // 应输出true因为name和age都相同System.out.println(person1.hashCode() person2.hashCode()); // 应输出true因为hashCode也应该相同System.out.println(set);} } Peson类中有两个属性name和age分别重写了equals()和hashCode()方法此时打印结果如下 可以看到对于相同name和age两个对象的hashCode是一致的HashSet中也只存在一个对象去重了 当我们把hashCode方法注释直接使用Object类本身的hashCode()方法时打印结果如下 此时会发现两者的equals()比较为true因为只是比较了name和age的值而hashCode比较则返回false因为没有重写所以二者都是使用父类Object中继承而来的方法各自随机生成值并不相同比较结果自然为false。因为HashCode不同自然也就是两个不同的对象了HashSet集合也就存储两个person对象无法去重了。 三、其他特性 3.1 什么是受检异常和非受检异常 受检异常表示在编译的时候强制检查的异常这种异常需要显示的通过try/catch来捕捉或者通过throws抛出否则程序无法通过编译。 非受检异常表示编译器不需要强制检查异常这种异常不需要显示的捕捉。 java中所有的异常都继承自Throwable类Throwable有两个直接子类----Error和Exception Error用来表示程序底层或者硬件相关的错误这种错误和程序本身无关比如常见的OOM异常。这种异常和程序本身无关所以不需要检查属于非受检异常。 Exception表示程序中的异常可能是由于程序不严谨导致的比如NullPointerException。 Exception下面派生了RuntimeException和其他异常其中RuntimeException是运行时异常属于非受检异常。其他的比如IOException和SQLException等都属于受检异常。 之所以要设置一些受检异常比如数据库异常、文件读取异常这些异常都是程序无法提前预料的但是一旦出问题就会造成资源被占用导致程序出现问题所以我们需要主动捕获这些异常从而在异常情况下可以做出对应的处理比如关闭数据库连接释放文件流等。 3.2 failed-fast机制和failed-safe机制有什么作用 fail-fast快速失败和fail-safe安全失败机制在Java中主要用于处理迭代器在遍历集合时遇到的并发修改问题。这两种机制分别在不同的场景下提供不同的行为和性能特性。 Fail-Fast快速失败 定义在fail-fast机制中如果在迭代器遍历集合的过程中集合被其他线程修改如添加、删除或修改元素迭代器会立即抛出ConcurrentModificationException异常。这种机制确保了迭代器的遍历状态不会被破坏从而避免了潜在的数据不一致或错误。 作用 安全性它提供了一种机制来检测和报告并发修改防止迭代器继续使用可能已失效的迭代状态。强制同步fail-fast机制鼓励程序员在多线程环境中使用适当的同步策略如锁或其他同步工具以确保数据的一致性和完整性。 Fail-Safe安全失败 定义在fail-safe机制中迭代器在遍历集合时不会因集合被修改而抛出异常。即使在迭代过程中集合被修改迭代器仍能安全地完成遍历不会中断。 作用 并发安全允许在迭代过程中对集合进行并发修改而不会中断迭代过程这对于读多写少的场景尤其有用。 性能在某些情况下fail-safe机制可以避免使用锁从而提高并发性能。 实现细节 Fail-Fast通常通过在集合中维护一个modCount变量来实现每当集合被修改时modCount就会递增。迭代器在创建时会记住modCount的初始值在迭代过程中会检查modCount的变化如果发现变化就会抛出异常。Fail-Safe通常通过在迭代开始时复制整个集合或者使用线程安全的数据结构如CopyOnWriteArrayList来实现这样迭代器可以独立于集合的当前状态进行遍历。 3.3 如何理解序列化和反序列化 之所以需要序列化是需要解决网络通信中的对象传输问题如何把对象从一个jvm进程里跨网络传输到另外一个jvm进程里。 序列化就是把内存里面的对象转换为二进制字节流便于存储和传输。 反序列化就是根据从文件或者网络读取的对象字节流依据字节流里保存的对象描述信息和状态重新构建一个新的对象。 其次序列化的前提还要保证通信双方对于对象的可识别性。比如数据的格式一般转换为json或者xml再把他们转换为数据流在网络上传输实现跨平台和跨语言的可识别性。 序列化技术选择考虑因素 序列化后数据的大小序列化的速度是否支持跨平台、跨语言技术成熟度 3.4 什么是SPI有什么作用 这里的SPI是Service Provider Interface的简称是基于接口的动态扩展机制它的主要作用是允许在不修改现有代码的情况下动态地加载和使用由第三方提供的服务实现。这使得应用程序或框架能够灵活地支持多种不同的服务实现而无需在编译时硬编码具体的实现类。 SPI的工作原理大致如下 定义接口 开发者首先定义一个接口这个接口描述了服务的行为和功能。 提供服务实现 第三方开发者可以创建该接口的实现并将其打包到自己的库中。通常实现类的信息会通过META-INF/services目录下的一个文本文件来描述文件名与接口的全限定名相同文件内容是实现类的全限定名。 服务发现和加载 在运行时应用程序可以使用ServiceLoader类来发现并加载所有可用的服务实现。ServiceLoader会读取META-INF/services目录下的配置文件找到所有声明的实现类并实例化它们。 使用服务实现 应用程序或框架可以通过ServiceLoader获取服务实现的迭代器然后遍历并使用这些实现。 SPI机制广泛应用于各种Java框架和库中例如JDBC驱动程序的加载、日志框架的配置等它提供了一种标准且灵活的方式来扩展和替换组件。 这里笔者搞了个示例代码首先我创建了一个springboot项目 在resources下手动创建META-INFO/services路径这个路径是因为它被ServiceLoader类默认识别从而能够自动加载和发现服务实现我们不要去改动它这是jdk的SPI机制默认服务发现的路径。 待扩展的接口 package com.execute.batch.executebatch.spi;public interface GreetingService {void greet(); } 服务实现类ChineseGreeting package com.execute.batch.executebatch.spi;public class ChineseGreeting implements GreetingService {Overridepublic void greet() {System.out.println(你好);} } 服务实现类EnglishGreeting package com.execute.batch.executebatch.spi;public class EnglishGreeting implements GreetingService {Overridepublic void greet() {System.out.println(Hello!);} } 在刚才创建的META-INFO/services下创建一个文件名com.execute.batch.executebatch.spi.GreetingService就是待扩展接口的全限定路径名在里面写上两个服务实现类的全限定文件名 com.execute.batch.executebatch.spi.ChineseGreeting com.execute.batch.executebatch.spi.EnglishGreeting加载测试类ServiceLoaderDemo package com.execute.batch.executebatch;import com.execute.batch.executebatch.spi.GreetingService;import java.util.ServiceLoader;public class ServiceLoaderDemo {public static void main(String[] args) {// 加载所有的GreetingService实现ServiceLoaderGreetingService loader ServiceLoader.load(GreetingService.class);// 遍历并使用所有实现for (GreetingService service : loader) {service.greet();}} } 测试结果如下 可以看到两个服务实现类都被成功加载。 我们对springboot项目进行打包打包成jar可以看到classpath下自动生成了我们的META-INF/services文件路径其中包含了创建的待扩展的全限定接口名的文件 再看下mysql的jdbc驱动 其中java.sql.Driver就是jdk提供的jdbc驱动待扩展接口com.mysql.cj.jdbc.Driver就是mysql实现了Drive接口的服务实现扩展类。 再比如logback日志框架就扩展了slf4j的接口SLF4JServiceProvider 实际开发中当我们开发一个基础组件时为了方便第三方扩展就可提供一个接口规范供第三方使用SPI机制去扩展自己实现基本原理如上应该很好理解。 3.5 finally语句快一定会执行吗 这个问题挺有意思的再没有学习研究之前笔者也是任务finall语句块实在try catch后一定执行的但是研究一番后我有了不一样的认识实际是否执行还得分情况。具体如下 如果try块中的代码正常执行结束没有抛出任何异常finally块会紧接着try块之后执行。如果try块中的代码抛出了异常即使这个异常被catch块捕获和处理finally块也会在catch块执行完后执行。 即使try块中的代码抛出的异常没有被catch块捕获导致程序异常终止finally块仍然会被执行除非整个JVM非正常关闭。 但是有以下几种情况finally块可能不会被执行 如果在try或catch块中调用了System.exit(int status)方法这会立即终止JVM导致finally块不被执行。如果JVM因为外部原因如操作系统杀掉进程而非正常关闭finally块也可能不被执行。 总的来说只要程序控制流正常进行finally块几乎总是会被执行这是它用来释放资源、清理环境的核心价值所在。 下面是一些示例代码 正常执行无异常 package com.execute.batch.executebatch.finallyTest;public class FinallyExample {public static void main(String[] args) {try {System.out.println(Inside try block);} finally {System.out.println(Finally block executed);}System.out.println(After try-finally block);} }结果如下finally正常执行 异常被捕获 package com.execute.batch.executebatch.finallyTest;public class FinallyExample {public static void main(String[] args) {try {System.out.println(Inside try block);throw new RuntimeException(Exception thrown);} catch (RuntimeException e) {System.out.println(Caught exception: e.getMessage());} finally {System.out.println(Finally block executed);}} } 结果如下finally正常执行了 异常未被捕获 package com.execute.batch.executebatch.finallyTest;public class FinallyExample {public static void main(String[] args) {try {System.out.println(Inside try block);throw new Error(Uncaught error);} finally {System.out.println(Finally block executed);}} } 结果中可以看到finally任然正常执行 使用 System.exit() package com.execute.batch.executebatch.finallyTest;public class FinallyExample {public static void main(String[] args) {try {System.out.println(Inside try block);System.exit(0);} finally {System.out.println(Finally block executed);}} } 这种就属于强制退出了finally就不会执行 3.6 内存溢出和内存泄漏区别 内存溢出Out of Memory 内存溢出指的是程序运行时请求的内存超过了系统所能提供的最大内存限制。这种情况通常发生在 堆内存溢出当Java堆空间不足无法再分配新的对象时会抛出 OutOfMemoryError。这可能是由于创建了过大的数组或对象或者GCGarbage Collector未能回收足够的内存。 栈内存溢出当线程的栈空间耗尽时比如递归调用过深也会引发内存溢出。 下面这段代码不停的创建对象最后会把jvm内存耗尽报出OOM异常 public class OutOfMemoryExample {public static void main(String[] args) {while (true) {byte[] b new byte[1024 * 1024]; // Allocate 1 MB each time}} } 内存泄漏Memory Leak 内存泄漏指的是程序在动态分配内存后未能释放已不再使用的内存导致这部分内存无法被GC回收。随着时间的推移这种泄漏积累的未释放内存会逐渐消耗系统的可用内存最终可能导致性能下降或程序崩溃。 下面的代码就是内存一直占用资源不释放 public class MemoryLeakExample {private Listbyte[] leaks new ArrayList();public void leak() {leaks.add(new byte[1024 * 1024]); // Allocate 1 MB and never release}public static void main(String[] args) {MemoryLeakExample example new MemoryLeakExample();while (true) {example.leak();}} }
文章转载自:
http://www.morning.kkwgg.cn.gov.cn.kkwgg.cn
http://www.morning.rghkg.cn.gov.cn.rghkg.cn
http://www.morning.tqklh.cn.gov.cn.tqklh.cn
http://www.morning.zycll.cn.gov.cn.zycll.cn
http://www.morning.rkfh.cn.gov.cn.rkfh.cn
http://www.morning.qjlkp.cn.gov.cn.qjlkp.cn
http://www.morning.kjyqr.cn.gov.cn.kjyqr.cn
http://www.morning.sloxdub.cn.gov.cn.sloxdub.cn
http://www.morning.dighk.com.gov.cn.dighk.com
http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn
http://www.morning.wckrl.cn.gov.cn.wckrl.cn
http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn
http://www.morning.yjxfj.cn.gov.cn.yjxfj.cn
http://www.morning.pxbky.cn.gov.cn.pxbky.cn
http://www.morning.hhrpy.cn.gov.cn.hhrpy.cn
http://www.morning.xfxlr.cn.gov.cn.xfxlr.cn
http://www.morning.nynlf.cn.gov.cn.nynlf.cn
http://www.morning.wdshp.cn.gov.cn.wdshp.cn
http://www.morning.xnfg.cn.gov.cn.xnfg.cn
http://www.morning.nrlsg.cn.gov.cn.nrlsg.cn
http://www.morning.huihuangwh.cn.gov.cn.huihuangwh.cn
http://www.morning.txzmy.cn.gov.cn.txzmy.cn
http://www.morning.bwqcx.cn.gov.cn.bwqcx.cn
http://www.morning.ftldl.cn.gov.cn.ftldl.cn
http://www.morning.pbzlh.cn.gov.cn.pbzlh.cn
http://www.morning.cgtfl.cn.gov.cn.cgtfl.cn
http://www.morning.dbqcw.com.gov.cn.dbqcw.com
http://www.morning.ffmx.cn.gov.cn.ffmx.cn
http://www.morning.ypktc.cn.gov.cn.ypktc.cn
http://www.morning.nhbhc.cn.gov.cn.nhbhc.cn
http://www.morning.rddlz.cn.gov.cn.rddlz.cn
http://www.morning.rlqqy.cn.gov.cn.rlqqy.cn
http://www.morning.zztkt.cn.gov.cn.zztkt.cn
http://www.morning.rrms.cn.gov.cn.rrms.cn
http://www.morning.wkknm.cn.gov.cn.wkknm.cn
http://www.morning.zxybw.cn.gov.cn.zxybw.cn
http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn
http://www.morning.djxnn.cn.gov.cn.djxnn.cn
http://www.morning.neletea.com.gov.cn.neletea.com
http://www.morning.fkgct.cn.gov.cn.fkgct.cn
http://www.morning.qswws.cn.gov.cn.qswws.cn
http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn
http://www.morning.xhhqd.cn.gov.cn.xhhqd.cn
http://www.morning.sflnx.cn.gov.cn.sflnx.cn
http://www.morning.qfkxj.cn.gov.cn.qfkxj.cn
http://www.morning.qjlkp.cn.gov.cn.qjlkp.cn
http://www.morning.cgstn.cn.gov.cn.cgstn.cn
http://www.morning.mslsn.cn.gov.cn.mslsn.cn
http://www.morning.fslrx.cn.gov.cn.fslrx.cn
http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn
http://www.morning.jqjnx.cn.gov.cn.jqjnx.cn
http://www.morning.rwtlj.cn.gov.cn.rwtlj.cn
http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn
http://www.morning.dblgm.cn.gov.cn.dblgm.cn
http://www.morning.rhlhk.cn.gov.cn.rhlhk.cn
http://www.morning.pljxz.cn.gov.cn.pljxz.cn
http://www.morning.thrgp.cn.gov.cn.thrgp.cn
http://www.morning.ndfwh.cn.gov.cn.ndfwh.cn
http://www.morning.kpbq.cn.gov.cn.kpbq.cn
http://www.morning.btpzn.cn.gov.cn.btpzn.cn
http://www.morning.kryr.cn.gov.cn.kryr.cn
http://www.morning.ymyhg.cn.gov.cn.ymyhg.cn
http://www.morning.ltpph.cn.gov.cn.ltpph.cn
http://www.morning.hxfrd.cn.gov.cn.hxfrd.cn
http://www.morning.qcrhb.cn.gov.cn.qcrhb.cn
http://www.morning.iuibhkd.cn.gov.cn.iuibhkd.cn
http://www.morning.dgknl.cn.gov.cn.dgknl.cn
http://www.morning.krtky.cn.gov.cn.krtky.cn
http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn
http://www.morning.hpkgm.cn.gov.cn.hpkgm.cn
http://www.morning.brxzt.cn.gov.cn.brxzt.cn
http://www.morning.drmbh.cn.gov.cn.drmbh.cn
http://www.morning.wncb.cn.gov.cn.wncb.cn
http://www.morning.ldfcb.cn.gov.cn.ldfcb.cn
http://www.morning.wnhml.cn.gov.cn.wnhml.cn
http://www.morning.qynpw.cn.gov.cn.qynpw.cn
http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn
http://www.morning.zdxss.cn.gov.cn.zdxss.cn
http://www.morning.dnycx.cn.gov.cn.dnycx.cn
http://www.morning.zqmdn.cn.gov.cn.zqmdn.cn
http://www.tj-hxxt.cn/news/280431.html

相关文章:

  • wordpress更改登录地址关键词优化意见
  • 是什么网站建设2345网页游戏官网
  • 网站建设服务哪便宜如何销售做网站
  • 做视频网站赚钱吗如何下载网站模版
  • 网站没排名要怎么做邢台视频推广
  • 网站如何查看浏览量网站建设实习
  • 网站排名优化策划创意矿泉水瓶子设计
  • 昆山网站建设公司苏州爬虫科技如何用社交网站开发客户
  • 南山医院网站建设做网站需要注意的地方
  • 可以在什么网站做二建题目网站关键词优化遇到的情况和解决方法
  • 网页截图快捷键ctrl+shiftseo发帖论坛
  • 汕头制作手机网站wordpress能否做网站
  • 网站优化加盟杭州网站做的好公司哪家好
  • 网站注册怎么做怎么做网站子页
  • 网站建设的战略作用网络营销专业属于什么类别
  • eclipse 网站开发教程wordpress多站点不显示
  • 小公司做网站需要ps做网站要多大
  • 网站建设常用的方法php网站开发实例电子版
  • 青岛seo整站优化哪家专业网站建设市场占有率
  • 建设网站需要分析什么wordpress的开发文档下载
  • 沈阳有做网站的吗龙岗网站价格
  • 昆明网站建设培训班视频制作公司拍摄
  • 网站设计方面有什么公司达令的网站建设
  • 网站建设怎样宣传比较好wordpress首页屏蔽插件
  • 竹业网站建设网站建设与制作布局
  • 重庆大足网站制作公司推荐网站建设公司的经营范围
  • 注册网站流程及资料网易邮箱官方网
  • 合肥网站模板建站网站方案建设书
  • 厚街外贸网站建设公司赣州网站建设顺企网
  • 食品营销型网站wordpress下载面板样式