Java
文章平均质量分 64
甜瓜瓜哥
这个作者很懒,什么都没留下…
展开
-
JVM的内存结构和内存分配
Java栈是一个逻辑概念,特点是后进先出。一个栈的空间可能是连续的,也可能是不连续的。最典型的Stack的应用是方法的调用。退出该方法则对应的方法针被弹出。栈中存储的数据也是运行时确定的。Java堆内存的分配意味着以随意的顺序在运行时进行存储空间分配和收回的内存管理模型。堆中存储的数据常常是大小、数量和生命期在编译期时无法确定的。Java对象的内存总是在heap中分配。方法区是静态分配的,编译器将变量绑定在某个储存位置上,并且这些绑定不会在运行时改变常数池源代码中的命令常量。原创 2023-12-13 20:52:12 · 332 阅读 · 0 评论 -
Java程序员常用的自动化代码格式工具
Checkstyle是一个用于检查代码风格和质量的工具,同时也可以用来格式化代码。Spotless是一个通用的代码格式化工具,支持多种语言,包括Java。它可以与各种构建工具集成,如Gradle、Maven等。Eclipse集成开发环境(IDE)自带了代码格式化功能,可以通过配置文件定义代码风格,然后在保存文件时自动进行格式化。由Google开发的Java代码格式化工具,通过使用Google的代码风格规范,可以确保代码在整个项目中具有一致的格式。用户可以通过设置来定义代码风格,并在保存文件时自动应用格式。原创 2023-12-06 22:50:10 · 992 阅读 · 1 评论 -
线程开销为何比进程小
线程共享同一进程的地址空间。因此,在多线程的环境中,线程之间可以更容易地共享数据和资源,像进程那样进行复杂的和。这降低了在进程间传递信息的开销。原创 2023-12-06 14:11:50 · 611 阅读 · 0 评论 -
extends为什么不能多重继承
多重继承指的是一个类可以有多个直接的父类。在某些其他编程语言中,比如C++,是支持多重继承的。原创 2023-12-05 23:53:02 · 230 阅读 · 0 评论 -
Java中protect关键字的作用
在Java中,protected 是一种访问修饰符,用于声明类的成员(字段、方法等)的访问权限。原创 2023-12-05 23:46:08 · 1162 阅读 · 0 评论 -
volatile的可见性是如何实现的
volatile 是一个 Java 关键字,它主要用于确保多个线程能正确地处理共享变量。原创 2023-12-04 15:24:34 · 950 阅读 · 0 评论 -
线程间和进程间传递数据的区别
总体而言,线程适用于轻量级的任务,而进程适用于需要更严格的隔离和独立性的任务。选择线程还是进程取决于具体的应用场景和要解决的问题。原创 2023-12-04 15:18:50 · 247 阅读 · 0 评论 -
减少多线程竞争的技术
减少多线程竞争是为了提高程序的性能和避免因为竞争导致的性能下降或死锁等问题。原创 2023-12-04 15:11:46 · 345 阅读 · 0 评论 -
Java场景题:A想调用B但不想依赖B该如何做
首先,定义一个接口,其中包含a想要使用的方法。// 接口定义。原创 2023-12-04 14:51:55 · 410 阅读 · 0 评论 -
如何实现单例模式线程池
在这个例子中,SingletonThreadPool类采用了懒汉式的单例模式,确保只有在需要时才创建线程池。通过getInstance方法获取线程池实例,并使用execute方法提交任务。最后,在程序结束时,调用shutdown方法关闭线程池。但需要注意的是,这只是一个简单的示例。在实际应用中,可能还需要根据具体的需求调整线程池的配置参数,比如线程池的大小、任务队列的类型等。同时也建议自己构造线程池,不使用现有的4种线程池类型,避免请求(任务)的堆积或大量线程的创建,从而避免OOM。原创 2023-12-02 15:40:59 · 226 阅读 · 0 评论 -
快速上手Java线程池ThreadPoolExecutor
阿里巴巴手册中写明,线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。第一点中的请求可以理解为任务。这里指的是设置阻塞队列的长度(LinkedBlockingQueue)。接受任务的顺序:核心线程 =》阻塞队列 =》非核心线程 =》异常处理。第二点指的是设置最大线程池的数量(maximumPoolSize)。需要将这两个参数设置成准确可控的一个数量值。原创 2023-12-02 15:13:44 · 51 阅读 · 0 评论 -
String为什么设计成不可变
可以发现不可变对象有诸多优点,所以Java中有许多对象都设计成了不可变,比如BigDecimal。如果String的哈希码会改变,那就会影响到这些对象的哈希计算,从而导致预期之外的结果。如果字符串可变,那引用的值就可以随时修改,并能随时影响到其他的引用,从而数据会发生各种错误。C语言中就是用的char数组来表示的字符串,在Java的一切皆对象世界中,将char数组进行了封装,用String类型来表达字符串。然后,String不可变可以保证它的哈希码也不会变,因此计算一次哈希码后,就可以将其缓存。原创 2023-11-27 23:30:12 · 81 阅读 · 0 评论 -
UPDATE操作可能涉及的锁类型
在事务的隔离级别为 READ COMMITTED 或更高级别时,UPDATE 操作可能会引入行级锁,以确保事务的隔离性。如果你关心事务的并发性和性能,可以选择适当的隔离级别,并通过合理的索引设计来减小锁的争用。原创 2023-11-25 13:50:04 · 735 阅读 · 0 评论 -
当newCachedThreadPool线程池遇到接踵而至的任务
如果需要对线程数量进行更严格的控制,可以考虑使用其他类型的线程池,如 FixedThreadPool 或 ScheduledThreadPool,以便更好地管理系统资源。如果线程池中的某些线程因为长时间没有任务而被终止,但是任务一直不断地提交,线程池可能会过度保持一些线程,导致资源释放滞后,影响系统的资源利用效率。由于线程池会根据需要动态地创建新线程,如果任务不断涌入,线程数会不受限制地增长。过多的线程会导致操作系统频繁进行线程上下文切换,这会带来额外的开销,降低系统的整体性能。原创 2023-11-24 20:52:38 · 114 阅读 · 0 评论 -
JOOQ框架初始化时间过长的可能原因
JOOQ是Java对象关系映射工具。原创 2023-11-24 10:06:45 · 101 阅读 · 0 评论 -
说说你对一致性Hash算法的理解
一致性hash算法是一种比较特殊、在原本Hash算法上的一个改良。它会尽可能去减少因我们数据存储节点发生变化时候发生的迁移成本。原创 2023-11-22 20:46:08 · 81 阅读 · 0 评论 -
自动回收内存是如何做的
自动内存回收是指在程序运行时,自动管理不再使用的内存资源的过程。在Java中,这是通过垃圾回收(Garbage Collection)机制来实现的。垃圾回收是一个后台线程运行的过程,它会在虚拟机认为有必要时(比如堆内存达到一定阈值、空闲时间过长等)进行执行。程序员一般不需要显式地管理内存,因为垃圾回收器会自动处理不再使用的对象,释放其占用的内存。原创 2023-11-04 15:59:38 · 73 阅读 · 0 评论 -
Java内存的划分方式和其中线程共享的部分
方法区和堆属于线程共享的内存区域,每个线程都可以访问它们。虚拟机栈、本地方法栈、程序计数器是线程私有的,每个线程都有自己独立的程序计数器。原创 2023-11-04 15:39:09 · 166 阅读 · 0 评论 -
从内存角度分析进程和线程的区别
进程和线程在内存方面的区别主要体现在独立的内存空间资源分配上下文切换和并发性等方面。进程拥有独立的内存空间,资源分配较大,上下文切换开销较大,但可以并行执行在不同的CPU核心上。线程共享相同的内存空间,资源分配较小,上下文切换开销较小,但在同一个进程内执行,依赖于操作系统的线程调度机制。原创 2023-11-04 14:43:41 · 358 阅读 · 0 评论 -
Java和Python的底层实现原理和如何保证跨平台性
总的来说,Java和Python都通过不同的技术实现了跨平台性,分别是通过虚拟机和解释器。选择使用哪种语言取决于项目的特定需求和开发者的偏好。原创 2023-11-04 13:00:43 · 237 阅读 · 0 评论 -
Java复习题
【代码】Java复习题。原创 2023-11-02 23:15:11 · 55 阅读 · 0 评论 -
字符串排序
每个字符串至少含有一个数字字符,按如下规则降序排序:(1) 按照字符串中字母字符个数和数字字符个数(字母数字比)的比值大小进行排序。(2) 若两个字符串的字母数字比相同。则按照字符串本身大小进行排序。输入值:[“abc123”,“abc+1234”,“abcabab–1”]返回值:[“abcabab–1”,“abc123”,“abc+1234”]原创 2023-11-02 23:15:42 · 1468 阅读 · 0 评论 -
nextLine和next的区别
nextLine() 用于读取整行文本或句子,包括空格。next() 用于读取下一个以空格分隔的单词。在选择使用哪一个方法时,要根据需要读取的内容来决定。原创 2023-10-31 15:59:15 · 631 阅读 · 0 评论 -
String与StringBuffer存储字符串的效率的对比
因此,在频繁进行字符串修改的情况下,StringBuffer 的效率通常比 String 高,尤其是当需要对一个字符串进行多次修改时。然而,在不需要频繁修改字符串内容的情况下,使用 String 也是合适的。原创 2023-10-30 08:56:14 · 434 阅读 · 0 评论 -
lambda表达式
函数式思想就是尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做。而实际上只有方法体是关键的,传递一段代码才是我们的目的。Thread类需要以Runnable接口作为参数,为了指定run的方法体,需要Runnable接口的实现类或者使用匿名内部类。使用lambda必须实现了接口,并且接口中有且仅有一个抽象方法。大括号内是方法体,如果只有一条语句,可以把大括号,return,和语句的分号一起省略。面对对象的思想是:找一个解决这个事情的对象,调用对象的方法。中间的箭头表示将前面的参数传递给后面的代码。原创 2023-10-29 20:52:18 · 45 阅读 · 0 评论 -
缓存与数据库到底先更新哪一个
缓存和数据库一致性的问题,最好的方式就是先更新数据库,再删除缓存,再加个补偿措施。参考资料面试官问我到底是先更新缓存还是先更新数据库?原创 2023-10-29 20:15:04 · 374 阅读 · 0 评论 -
常见的集合类以及优劣
优点:1)使用动态数组实现,可以动态扩展容量。优点:1)基于哈希表实现,具有快速的插入、删除和查找操作。优点:1)使用双向链表实现,对于插入和删除元素操作效率较高。优点:在HashMap的基础上,使用链表维护了元素的顺序,可以保持插入顺序或者访问顺序。优点:1)基于哈希表实现,具有O(1)快速的插入、删除和查找操作。2)不允许重复元素。优点:在HashSet的基础上,使用链表维护了元素的顺序,可以保持插入顺序。优点:1)基于红黑树实现,保证元素有序。缺点:插入和删除元素的效率相对较低,因为需要移动元素。原创 2023-10-29 17:08:15 · 102 阅读 · 0 评论 -
Spring多线程事务能否保证事务的一致性
Spring的事务信息是存在ThreadLocal中的,所以一个线程永远只能有一个事务。因此Spring的事务是无法实现事务一致性的。这里有个事务方法A,在这个方法中创建了一个线程,线程里面去调用B。那么这个时候,A和B能保证数据的一致性或者原子性吗?也就是A失败了,B是否会正常提交。B失败了, A是否会一起回滚。答案是不能保证一致性以及原子性的。可以通过编程式事务,或者通过分布式事务的思路:二阶段提交方式。原创 2023-10-29 16:10:50 · 355 阅读 · 0 评论 -
性能优化的切入点
当然性能优化还包含数据库优化、操作系统优化、架构优化等其他一些内容,但不是重点。参考资料性能优化的切入点。原创 2023-10-25 16:37:31 · 48 阅读 · 0 评论 -
性能优化的衡量指标
在高并发应用中,仅仅高吞吐是不够的,它还必须同时能为多个用户提供服务。并发高时,会导致很严重的共享资源争用问题,需要减少资源冲突,以及长时间占用资源的行为。:最常用的指标,指标能够体现服务接口的平均处理能力。它的本质是把所有请求耗时加起来,然后除以请求的次数。比如,将某个接口,耗时超过1s的入参及执行步骤,详细地输出在日志系统中。这部分接口性能数据的收集,采用更加详细的日志记录方式,而不仅仅靠指标。并发量是指系统同时能处理的请求数量,这个指标反应了系统的负载能力。在压测的时候,接口直接超过了服务能力。原创 2023-10-25 15:34:52 · 130 阅读 · 0 评论 -
找前k大个数的方法
如果使用部分排序,例如堆排序,时间复杂度为O(n log k),其中n是数组的长度,k是前k大的数的个数。该算法的思想是通过随机选取一个元素作为"基准",将数组分成两部分,一部分大于基准,另一部分小于基准,然后递归地在较大或较小的部分继续寻找第k大的元素。平均情况下,快速选择算法的时间复杂度是O(n),因为它以线性时间找到第k大的元素。如果需要找出前k大的数,最简单的方法是对整个数组进行排序,然后取前k个元素。总的时间复杂度是O(n log k),其中n是数组的长度,k是要找出的前k大的数的个数。原创 2023-10-20 13:25:53 · 730 阅读 · 0 评论 -
判断一个整数数组中是否存在和为指定目标的两个数
两层for循环遍历数组的每一个元素,对于每一个元素,再遇到其他元素,检查它们的和是否等于目标值。原创 2023-10-20 13:01:56 · 97 阅读 · 0 评论 -
如何判断给定的两个字符串是否由打乱顺序的相同字母组成
方法二和方法三是最优解决方案,它们的时间复杂度都是O(n)。方法二使用哈希表,适用于Unicode字符集,而方法三使用数组计数,适用于只包含小写字母的情况。原创 2023-10-20 11:11:03 · 110 阅读 · 0 评论 -
Thymeleaf模板引擎
一种用于Java web应用程序的模板引擎。它允许开发者在HTML模板中嵌入动态内容,类似于JSP(JavaServer Pages)或FreeMarker等模板引擎。但相比于传统的JSP,Thymeleaf更加注重在模板中保持良好的可读性,使得设计师和开发者可以更容易地共同协作。原创 2023-10-09 11:50:42 · 158 阅读 · 0 评论 -
JVM内存管理机制和配置参数理解
JAVA虚拟机是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆和一个存储方法域。原创 2023-08-30 16:04:01 · 142 阅读 · 0 评论 -
Java异常有几种
参考资料Java异常有哪几种 — CodeGym 大学课程。原创 2023-07-27 10:07:16 · 62 阅读 · 0 评论 -
Comparable和Comparator接口的作用和区别
只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。Java提供了包含compare()和equals()两个方法的Comparator接口。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。原创 2023-07-25 19:36:09 · 60 阅读 · 0 评论 -
局部性原理和虚拟内存
总结一下,局部性原理是指程序在短时间内倾向于多次访问一小部分地址空间的趋势,而虚拟内存利用时间局部性,允许程序使用比实际物理内存更大的虚拟地址空间,并通过映射和调度机制提高系统性能和进程间的隔离性。原创 2023-07-25 17:36:26 · 514 阅读 · 0 评论 -
内存泄漏和内存溢出的区别
比如说我要处理当前方法,要处理十个文件对象的读写,每一个同时会占用200M,那么如果你设置给当前应用的内存不够,比如1G,那么就需要调大JVM中内存设置或者减少同一批次处理大对象数量。比如方法的生命周期,就比成员变量(也就是这个类的对象拥有的)声明周期短。在我们平时的编码过程中,while(true)这样一直执行或者使用了递归,一直运行。有些对象应该回收,但是由于有引用在引用它,导致我们无法去回收它,那么这种情况我们就称为。我们的业务流程代码已经执行完了,但是它里面有引用的对象,它不能得到释放。原创 2023-07-25 17:07:33 · 232 阅读 · 0 评论 -
Minor GC/Young GC, Major GC/Old GC, MixedGC, Full GC
GC是指在编程语言中,自动回收不再被程序使用的内存空间的过程。在Java虚拟机(JVM)中,GC主要负责管理Java。,Java堆是存储对象实例的内存区域。原创 2023-07-25 14:06:32 · 954 阅读 · 0 评论