- 博客(36)
- 收藏
- 关注
原创 2 Spring控制反转(IOC)
Spring简介与IOC容器首先IoC:意思是“控制反转”,是Inversion of Control的简写控制什么:控制对象的创建和销毁,指的是控制对象的生命周期。反转什么:之前我们创建一个对象都是new,现在有了IOC了,指的是把对象的控制权交给了IOC容器。容器用于存放Bean对象,Bean对象就是通过Spring框架创建的java对象。没用Spring之前是通过代码new创建对象,现在交给Spring框架创建,并完成对象初始化,以及建立对象之间的依赖。
2023-04-27 16:09:05
259
原创 1.4 线程的状态和基本操作
首先本质上 wait 和 notify 是用于线程之间通信的,wait() 表示当前获取到锁的线程进入休眠状态并释放锁,notify() 表示当前获取到锁的线程去唤醒曾经获取到该锁的 wait() 的休眠线程,这里有一个很关键的点,就是他们通信的基础是获得或者曾经获得的是同一个锁而在 Java 中,锁是放在对象上的,所以可以说这两个线程的通信要依赖于这个对象才行,如果不放在对象上,也可以用 Thread.wait( Object o) 把对象传递进去,但是从设计的角度来说,还不如把方法直接放在对象上。
2023-04-23 14:58:37
304
原创 1.3 创建线程的四种方式
Callable是实现多线程编程的接口,只有一个call()方法,用于执行异步任务并返回一个泛型对象,可以通过Future获取线程执行的结果。Future是一个接口,用于表示一个异步任务计算的结果,常见的Future接口的实现类有FutureTask、CompletableFuture等。Future对象,可以通过get()方法来获取异步任务的执行结果。如果任务还没有执行完成,get()方法会阻塞,直到任务执行完成并返回结果。
2023-04-16 10:20:07
205
原创 1.2 线程和进程区别
线程和进程都是操作系统中的概念,用于描述正在运行的程序的执行状态。进程和线程都是操作系统的基本概念,进程是计算机中运行的程序的一个实例,线程是进程中的一个执行流。进程有自己独立的内存空间和系统资源,进程之间相互独立,互相隔离。线程共享进程的内存空间和系统资源,多个线程可以在同一时间内执行不同的任务。线程的切换和创建的代价比进程要小得多,因此线程的并发度和性能比进程更高。
2023-04-11 20:57:01
129
原创 1.1什么是多线程,多线程的优劣?
每个线程都有自己的执行栈和程序计数器,但它们共享程序的代码段、静态数据、堆和方法区等资源。综上所述,多线程的优点在于提高程序性能、充分利用多核处理器、支持异步编程、提高程序可伸缩性、支持更高的并发度和实现复杂业务逻辑。但同时也存在一些缺点,如线程安全问题、调试和测试困难、线程间的通信和同步、资源占用和调度开销等。:多线程程序需要占用更多的系统资源和内存,线程的调度和切换也会带来一定的开销。:多线程程序需要考虑线程间的通信和同步,编写更复杂的程序逻辑和代码。
2023-04-11 20:45:44
954
原创 1.1并行和并发有什么区别?
在多核处理器上,每个任务可以在不同的 CPU 核心上并行执行,从而提高程序的运行速度。例如,一个大型的图像处理程序可以将图片分成多个部分,每个部分在不同的 CPU 核心上并行处理,从而提高处理速度。在单核处理器上,多个任务使用时间片轮换方式来共享 CPU 时间,看起来像是同时执行。例如,在一个 Web 服务器上,多个客户端同时发送请求,服务器可以并发地处理多个请求。并发通常是为了提高系统的吞吐量和资源利用率,而并行则是为了加快单个任务的处理速度。并发是指多个任务在同一时间段内。
2023-04-11 17:58:47
111
原创 1.1并发编程三要素是什么?
同时,在编写并发程序时,需要遵循并发编程的最佳实践,如避免共享变量、减少锁的粒度、避免死锁等。:可见性指的是多个线程之间对共享变量的修改是可见的。在并发编程中,如果一个线程修改了共享变量的值,其他线程可能无法立即看到这个变化,从而出现数据不一致的问题。:原子性指的是一个操作是不可中断的,即要么操作全部完成,要么操作完全没有执行。:有序性指的是程序执行的顺序是按照代码的顺序执行的。在并发编程中,由于多个线程之间的执行是异步的,所以程序的执行顺序可能会发生变化,从而导致程序出现错误。
2023-04-11 17:46:45
645
原创 1.1 并发编程的优缺点
由于并发编程涉及多个线程之间的相互依赖和同步,容易导致死锁和饥饿现象,需要采用合适的同步机制和算法来避免这些问题的发生。:并发编程需要多个线程同时运行,对CPU和内存等硬件资源的要求较高,需要合理地配置硬件资源来保证程序的运行效率。:Java并发编程可以使用异步编程模型,允许程序在等待I/O操作完成时不会阻塞线程,从而提高程序的并发性。:Java并发编程需要考虑多个线程之间的同步、竞态条件等问题,因此并发编程的复杂度要比单线程编程高得多。
2023-04-11 15:17:17
188
原创 6.3 什么是类加载器,类加载器有哪些?
即当一个类加载器收到加载请求时,它首先会将这个请求委派给父类加载器去处理,只有在父类加载器无法处理时,才由自己来加载类。这样可以避免同一个类被不同的类加载器加载多次,从而保证了类的唯一性。Java虚拟机可以同时使用多个类加载器,每个类加载器负责加载一些特定的类。:用来加载Java的核心类库,位于JRE的lib目录下,是虚拟机的一部分,是由C++实现的,不是Java类。:开发人员可以根据自己的需要编写自己的类加载器,来实现一些特定的需求,例如加载网络上的类文件等。
2023-04-10 21:22:17
237
原创 6.1简述java类加载机制?
Java类加载机制是指JVM在运行时将类的.class文件加载到内存中,并对其进行验证、准备、解析、初始化等一系列操作的过程。此外,JVM还提供了双亲委派模型来保证类加载的顺序和一致性,即先由父类加载器尝试加载类,如果无法加载再由子类加载器加载。需要注意的是,类的加载机制是延迟加载的,即在程序运行过程中,只有使用到某个类时,JVM才会将它加载到内存中。:执行类的初始化代码,包括静态变量赋值、静态块执行等。:将符号引用转换为直接引用,即将类、方法、字段等的引用转换为直接指向内存中的实际对象。
2023-04-10 20:30:41
94
原创 5.1 简述java内存分配与回收策率以及Minor GC和Major GC
对象首先会被分配在Eden区,当Eden区满时,会触发Minor GC,将存活的对象复制到Survivor区或老年代中,并清空Eden区和使用过的Survivor区。在这个过程中,可能会出现对象晋升的情况,即从新生代晋升到老年代。2 回收的速度不同:Minor GC通常比Major GC快,因为新生代中的对象通常比较少,而且使用的是复制算法,回收速度较快。3 对应用程序的影响不同:Minor GC通常只会短暂地停止应用程序的运行,而Major GC则可能会停止应用程序更长的时间,因为它涉及的对象较多。
2023-04-10 17:36:30
254
原创 4.13 简述分代垃圾回收器是怎么工作的?
当Eden区满时,触发一次Minor GC,将存活的对象复制到另一个Survivor区,同时清空Eden区和使用过的Survivor区。当某个Survivor区也满时,会将存活的对象复制到另一个空闲的Survivor区或者老年代,同时清空使用过的Survivor区。分代垃圾回收器的工作原理是通过将对象按照生命周期分配到不同的代中,针对不同代采用不同的垃圾回收策略,以提高垃圾回收效率和应用性能。标记-清除算法会先标记所有存活的对象,然后清除所有未标记的对象,但这可能会导致内存碎片化问题。
2023-04-10 17:31:31
286
原创 4.12 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?
总的来说,新生代垃圾回收器主要是为了快速回收短时间存活的对象,而老年代垃圾回收器则主要是为了回收长时间存活的对象。,主要针对响应时间优先的应用,垃圾回收和应用程序并发执行,可以减少停顿时间,但可能会导致碎片化问题。,主要针对单CPU环境,采用标记-整理算法,垃圾回收时只有一个线程执行,容易造成较长的停顿时间。,采用复制算法,主要针对吞吐量优先的应用,多线程执行垃圾回收,但不能保证最短的停顿时间。,是最简单的垃圾回收器,采用复制算法,单线程执行,适用于小内存环境。
2023-04-10 16:15:08
608
原创 4.11 详细介绍一下 CMS 垃圾回收器?
不过,需要注意的是,由于 CMS 垃圾回收器可能会导致内存碎片的问题,因此对于需要长时间运行的应用程序,可能需要定期执行 Full GC(全局垃圾回收)以避免内存碎片问题影响性能。CMS 垃圾回收器的主要缺点是,在进行垃圾回收时需要占用大量的 CPU 资源,因此可能会影响应用程序的吞吐量。此外,由于 CMS 垃圾回收器采用的是标记-清除算法,因此可能会导致内存碎片的问题,进而影响应用程序的性能。CMS 垃圾回收器的主要优点是可以在应用程序运行的同时进行垃圾回收,因此对应用程序的响应时间影响较小。
2023-04-10 16:10:45
312
原创 4.10 说一下 JVM 有哪些垃圾回收器?
它是JDK11中新引入的一种垃圾回收器,以获取最短回收停顿时间为目标,可以在不超过10ms的停顿时间内进行全堆垃圾回收,适用于超大型的内存应用场景。:它是一种以获取最短回收停顿时间为目标的垃圾回收器,使用分代收集算法进行垃圾回收,在回收过程中只暂停少量的应用线程,适用于大型的内存应用场景。:它是一种以获取最短回收停顿时间为目标的垃圾回收器,使用多线程进行垃圾回收,在回收过程中只暂停少量的应用线程,适用于响应时间敏感的应用场景。
2023-04-10 15:47:45
601
原创 4.9 说一下 JVM 有哪些垃圾回收算法?
这样,在新的区域中,存活对象的地址是连续的,从而可以很方便地进行内存分配。需要注意的是,标记-整理算法中需要大量的移动对象操作,因此它的性能通常比复制算法差一些,尤其是在老年代的内存回收中。在标记阶段,垃圾回收器会从根对象(通常是一些全局变量)开始遍历程序的对象图,标记所有可达对象,即所有可以从根对象到达的对象,而不可达的对象则被视为垃圾。分代算法的优点是可以充分利用对象生命周期的特点,将不同生命周期的对象放在不同的代中,对每个代采用不同的垃圾回收算法,提高了垃圾回收效率。
2023-04-10 12:14:35
94
原创 4.7 在Java中,对象什么时候可以被垃圾回收
如果一个对象只被弱引用或软引用所引用,那么它就可以被垃圾回收。弱引用和软引用是 Java 中的两种特殊的引用类型,它们不会阻止对象被垃圾回收。:如果一个对象没有任何引用指向它,那么它就可以被垃圾回收。可以通过将引用置为 null 来手动释放对象占用的内存。:如果 JVM 中的内存不足,那么垃圾回收器就会被触发,回收一些不再使用的对象,释放内存空间。
2023-04-10 11:32:38
2241
原创 4.8 JVM中的永久代中会发生垃圾回收吗
不过,即使在 JDK 8 之前,JVM 的永久代中也有可能发生垃圾回收。如果使用了大量的动态代理、反射、代码生成等技术,会导致永久代中产生大量的无用类,从而导致永久代的内存溢出。在这种情况下,JVM 会触发 Full GC,尝试回收永久代中的无用类,以释放内存空间。在 JDK 8 及之前的版本中,JVM 中的永久代是存放类信息、常量、静态变量等的区域,不会被垃圾回收。这是因为永久代使用的是永久代内存,不属于堆内存,不受垃圾回收机制的管理。元空间使用的是本地内存,也不属于堆内存,也不会被垃圾回收。
2023-04-09 21:54:15
852
原创 4.5 Java 中都有哪些引用类型?
虚引用不能直接通过 get() 方法访问到它所指向的对象,它主要用于在对象被垃圾回收时收到一个系统通知,或者在一个对象被销毁时进行一些清理工作。软引用可以用来实现缓存等功能,当内存不足时,缓存中的对象可以被回收,避免了 OutOfMemoryError 错误。(Weak Reference):弱引用是一种比软引用更弱化的引用类型。(Strong Reference):指向对象的引用是强引用,它是默认的引用类型,如果一个对象具有强引用,那么垃圾回收器不会回收这个对象,即使 JVM 内存不足也不会回收。
2023-04-09 20:59:05
86
原创 4.3 垃圾回收的优点和原理
1 标记-清除算法:这是垃圾回收最基本的算法,它通过标记所有可以访问的内存,然后清除所有不能访问的内存。在标记阶段,垃圾回收器会标记所有可以访问的内存,并且将存活的对象移到存活区的一端。在整理阶段,垃圾回收器会将存活对象移到存活区的一端,并且将存活区和空闲区合并,从而避免内存碎片的产生。1 简化程序员的工作:垃圾回收可以自动地回收不再使用的内存,从而减轻了程序员手动管理内存的工作量。4 改善程序的性能:尽管垃圾回收会带来一定的性能开销,但由于它可以避免内存泄漏等问题,从而改善了程序的性能。
2023-04-09 20:58:05
403
原创 4.2 GC是什么?为什么要GC
在Java程序中,每当我们创建一个对象时,JVM会在堆内存中为该对象分配一定大小的内存空间。但是,当该对象不再被使用时,这段内存空间就成为了“垃圾”,如果不及时回收这些垃圾,就会导致内存泄漏、内存溢出等问题,进而影响程序的稳定性和性能。因此,引入垃圾回收机制(即GC)可以自动地回收不再使用的对象,释放它们所占用的内存空间,从而提高了程序的可靠性和稳定性。GC是“垃圾回收”(Garbage Collection)的缩写。它是一种自动化的内存管理机制,用于回收不再使用的对象以及释放它们所占用的内存空间。
2023-04-09 16:44:19
108
原创 Java垃圾回收机制
垃圾收集过程:垃圾回收器在运行过程中,通过标记存活对象和回收无用对象的方式来进行垃圾回收。具体来说,垃圾回收器在堆中标记出所有存活的对象,然后清理掉所有未被标记的对象。Java垃圾回收机制是指一种自动化的内存管理方式,Java程序员无需手动管理内存,而是由JVM(Java虚拟机)自动进行垃圾回收。垃圾收集时机:JVM会根据不同的垃圾收集算法和策略,动态地选择合适的时机进行垃圾回收。一般来说,当内存不足时,就会触发垃圾回收。垃圾回收算法:垃圾回收器使用不同的垃圾回收算法来处理内存中的对象。
2023-04-09 16:18:57
344
原创 2.1 对象的创建
链接: Java虚拟机(JVM)面试(2022版)这是创建 Java 对象最常见的方式,通过 new 关键字可以实例化一个类,并且在实例化时可以调用该类的构造函数。例如:2 使用 Class 类的 newInstance() 方法创建对象Java 中的 Class 类提供了一个 newInstance() 方法,可以动态地创建对象。例如这种方式需要通过反射来实现,因此比较灵活,但也存在一定的性能开销。Java 中的 clone() 方法可以创建一个对象的副本。要使用该方法,需要实现 Cloneabl
2023-04-09 11:11:01
54
原创 元空间(Metaspace)
元空间的主要作用是存储类的元数据信息,包括类的结构信息、方法信息、字段信息、注解信息等。与永久代不同,元空间的内存空间并不在虚拟机堆中,而是在本机物理内存中分配,因此元空间的大小不受虚拟机堆的大小限制,也不会触发垃圾收集器的工作。总之,元空间是Java 8引入的一个新的内存区域,用于存储类的元数据信息。永久代的存储的是类的元数据信息,而元空间存储的是类的元数据信息和动态生成的类的元数据信息,如动态代理类、反射生成的类等。永久代的大小是固定的,而元空间的大小可以动态调整。
2023-04-09 10:56:12
5717
原创 try-with-resource
需要注意的是,使用try-with-resource时,资源对象必须实现java.lang.AutoCloseable接口或java.io.Closeable接口,这两个接口定义了close()方法,用于关闭资源。使用try-with-resource时,需要将要自动关闭的资源对象放在try语句的圆括号内,并在try块中使用这些资源。在使用try-with-resource时,可以避免显式地关闭资源对象,减少了代码的冗余和出错的可能性,同时也提高了代码的可读性和可维护性。
2023-04-07 16:11:23
851
原创 c++实现链式栈的基本操作
#include <iostream>#include <stdio.h> #include <stdlib.h>using namespace std;typedef struct NODE{ int data; struct NODE *link;}node, *pnode;pnode creatStack(); //创建一...
2018-04-29 11:44:55
2563
原创 c++实现单向链表基本操作
最近又开始了数据结构的学习,去年下半年也学过一段时间,没能坚持下去,希望这次能坚持久一点,把基础的数据结构都能掌握;这是我最近对单向链表的一些学习情况;我先是听mooc的浙大数据结构的课程,在头脑里建立起数据结构的形象和特征,(这种方法不一定很好,只是目前我对数据结构的一种学习方法)在看完一种数据结构的课程后,就试着根据自己的理解去实现这些数据结构的基本操作,在此之前,我还会先浏览一下他人的博客,...
2018-04-29 11:38:41
294
原创 整数的立方和
【问题描述】给定一个正整数k(1<k<10),求1到k的立方和m,即m=1+2*2*2+...k*k*k.【输入形式】输入只有一行,该行包含一个正整数k。【输出形式】输出只有一行,该行包含1到k的立方和。【样例输入】5【样例输出】225【样例说明】输入5时,输出从1到5这5个数的立方和。#include <stdio.h>#include <stdlib.h>...
2018-04-07 11:34:53
3291
1
原创 Fibonacci Again
【问题描述】There are another kind of Fibonacci number:F(0)=7,F(1)=11,F(n)=F(n-1)+F(n-2) (n>=2).【输入形式】Input an interger n.(n<1000000)【输出形式】Print the word "yes" if 3 divide evenly into F(n).Print the w...
2018-04-07 11:19:56
289
原创 自整除数
【问题描述】对一个整数n(n<10000),如果其各个位数的数字相加得到的数m能整除n,则称n为自整除数。 例如21,21%(2+1)==0, 所以21是自整除数。【输入形式】一个整数n。【输出形式】若n为自整除数,则输出TRUE,否则输出FALSE。【样例输入】42【样例输出】TRUE【样例说明】说明42是自整除数。int main(){ ...
2018-04-07 10:34:10
1978
原创 整数排序
【问题描述】对给定的4个整数进行排序,将由小到大的顺序输出。【输入形式】一行中有4个整数,整数之间用空格分隔。【输出形式】按升序输出,各整数之间用一个空格分隔,最后一位数后也要有空格。【样例输入】25 314 18 27【样例输出】18 25 27 314【样例说明】在控制台输入25 314 18 27,输出结果是18 25 27 314。int main(){ int a[5], i, j,...
2018-04-07 10:25:11
677
原创 颠倒整数
给定一个最多4位的正整数,将其颠倒过来输出,如果是一位数,则按原数输出,例如:输入123,则输出321。如果是100,其颠倒过来是1,不是001.。【输入形式】一个小于10000的正整数。【输出形式】颠倒后的整数。【样例输入】1234【样例输出】4321【样例说明】控制台输入1234,控制台显示4321。int main(){ int n, k = 0; scanf("%d", &n...
2018-04-07 10:11:19
2435
原创 利润提成(书后作业4.10)
【问题描述】企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成...
2018-04-07 09:29:38
875
原创 输出数字(书后作业4.9)
【问题描述】对于给定一个不多于5位的正整数,请按以下要求输出结果:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。【输入形式】输入一行,一个不多于5位的正整数。【输出形式】输出三行。第一行输出是几位数。第二行正序输出每一位数字,各个数字间以空格分隔。第三行逆序输出每一位数字,各个数字间以空格分隔。【样例输入】 12345【样例输出】51 2 3 4 ...
2018-04-07 09:14:27
535
原创 百分制成绩(书后作业4.8)
【问题描述】编一程序,对于给定的一个百分制成绩,输出相应的五分值成绩。设90分以上为'A',80-89分为'B,70-79分为'C',60-69分为'D,,60分以下为'E'(用switch语句实现)。若输入的百分制成绩不在0-100之内,则输出error。【输入形式】输入一行,包括一个百分制成绩,范围在0-100。【输出形式】输出一行,给出这个百分制成绩相应的五分值成绩。【样例输入】100【样例...
2018-04-07 08:59:30
3107
原创 输出最大的数(书后作业4.4)
有3个整数a、b、c,由键盘输人,输出其中最大的数。【输入形式】输入一行,包括3个整数。【输出形式】输出一行,输出三个数中较大的数。【样例输入】1 2 10【样例输出】10int main() { int a, b, c, temp = 0; scanf("%d%d%d", &a, &b, &c); if((a >= b) && (a &g...
2018-04-07 08:51:45
356
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人