“出大事了,出大事了,能不能帮帮我!”设计师一溜小跑来到了程序员桌前。 “我上个月开始,打算追一个女生,坚持每天给她写一封邮件,发送一点小小的问候。...为什么对方没收到我的情书邮件?| 图虫创意 程序员想都没想:“八成是被判成垃圾邮件放进垃圾箱了吧!邮件长什么样?”...| 图虫创意 好在,程序员们想出了如下解决思路:把人类群体对众多邮件是否是“垃圾邮件”的判别结论全部记录下来,那么在这个库中的每一条邮件,我们能给它戴上一个 “垃圾邮件率”来表示是否垃圾的程度。...我们假设,一定先有一些垃圾发送器和正常的发邮件的人(C = 0, 1,1为垃圾邮件),以P为比例分布。 我们来看一封邮件:“你好,请把钱打到我的卡上。”...我们借“垃圾邮件”识别,来浅显易懂地介绍了一把(文本)分类问题的解决思路,以及数学建模在计算机科学中的重要地位。数学模型是美好的,它能够记录本质而复杂的规律,并且在需要的时候提供可靠的信息支持。 ?
封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。...多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。 继承 继承给对象提供了从基类获取字段和方法的能力。...继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。 抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。...19.为什么集合类没有实现Cloneable和Serializable接口? 集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。...而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。 41.在Java中,对象什么时候可以被垃圾回收?
增加代码的可理解性。 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个分析这些特性。 封装 封装给对象提供了隐藏内部特性和行为的能力。...多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。 继承 继承给对象提供了从基类获取字段和方法的能力。...继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。 抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。...19.为什么集合类没有实现Cloneable和Serializable接口? 集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。...而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。 41.在Java中,对象什么时候可以被垃圾回收?
但是有时也会挂起就绪进程,释放足够的内存空间。 新 → 就绪/挂起:新进程创建后若无足够的内存分配,则插入到就绪/挂起队列。 14. 同步方法和同步代码块的区别是什么?...吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。...JDBC(Java DataBase Connectivity),是一套面向对象的应用程序接口(API),制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准的实现。...连接请求由池中的连接提供。在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。 72. 让RMI程序能正确运行有哪些步骤?...封装的定义和好处有哪些? 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。
代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性。 2、面向对象编程有哪些特性? 封装、继承、多态、抽象 封装 封装给对象提供了隐藏内部特性和行为的能力。...每一种修饰符给其他的位于同一个包或者不同包下的对象赋予了不同的访问权限。 下面列出了使用封装的好处: 通过隐藏对象的属性来保护对象内部的状态。...提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。 禁止对象之间的不良交互提高模块化。 继承 继承给对象提供了从基类获取字段和方法的能力。...继承提供了代码的重用,也可以在不修改类的情况下给现存的类添加新特性。 多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。...而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。 43、在Java中,对象什么时候可以被垃圾回收?
当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。 Java中构造函数重载和方法重载很相似。...在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中释放对象持有的资源。 38.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?...而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。 41.在Java中,对象什么时候可以被垃圾回收?...finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可 以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。...最大的不同是,Hashtable 的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之 提供外同步。
一、什么是垃圾回收 在计算机科学中,垃圾回收(Garbage Collection,缩写为 GC)是指一种自动的存储器管理机制。...当某个程序占用的一部分内存空间不再被这个程序访问时,这个程序会借助垃圾回收算法向操作系统归还这部分内存空间。垃圾回收器可以减轻程序员的负担,也减少程序中的错误。...o2.p = o1; // o2引用o1 } f(); 为了解决这个问题,垃圾回收器引入了标记清除法。...在 JavaScript 里,Map API 可以通过使其四个 API 方法共用两个数组(一个存放键,一个存放值)来实现。给这种 Map 设置值时会同时将键和值添加到这两个数组的末尾。...为了提供真正的弱引用,TC39 提出了 WeakRefs 提案。 WeakRef 是一个更高级的 API,它提供了真正的弱引用,并在对象的生命周期中插入了一个窗口。
大家好,我是二哥呀。 今天继续给大家带来硬核面经,这次我们以《Java 面试指南》中同学 10 的 京东后端实习一面(已挂)为例,来看看如果你在面试中遇到这些面试题的话,该如何回答?...由于哈希函数将一个较大的输入域映射到一个较小的输出域,不同的输入值(即不同的对象)可能会产生相同的输出值(即相同的哈希码)。 这种情况被称为哈希冲突。...07、垃圾回收器的作用是什么 垃圾回收器的核心作用是自动管理Java应用程序的运行时内存。它负责识别哪些内存是不再被应用程序使用的(即“垃圾”),并释放这些内存以便重新使用。...这个对象是 JDBC API 中用于表示数据库连接的接口,它提供了执行 SQL 语句、管理事务等一系列操作的方法。 Connection对象代表了应用程序和数据库的一个连接会话。...17、查询和更新都频繁的字段是否适合创建索引,为什么 频繁更新的字段,不要作为主键或者索引。 索引能提高查询效率的根本原因在于它提供了一种快速查找数据的方式,而不需要扫描整个表。
本博客所总结书籍为《CLR via C#(第4版)》清华大学出版社,2021年11月第11次印刷(如果是旧版书籍或者pdf可能会出现书页对不上的情况) 你可以理解为本博客为该书的精简子集,给正在学习中的人提供一个...垃圾回收后的托管堆 代:提升性能 CLR的GC是基于代的垃圾回收器(generational garbage collector),它对你的代码做出了以下几点假设:(P454 1) 1、对象越新,生存期越短...下图展示了一个新启动的应用程序,它分配了5个对象(从A到E)。过了一会儿,对象C和E变得不可达。(P454 – P457) CLR初始化时为第0代对象选择一个预算容量(以KB为单位)。...两代都被垃圾回收后,堆的情况如下图所示。 托管堆只支持3代:0、1、2。(P457 2) 垃圾回收触发的条件:(P458 last) 1、代码显示调用System.GC的静态Collect方法。...(P462 2) 监视应用程序的内存使用:GC类提供了一些静态方法,可以调用他们查看某一代发生了多少次垃圾回收,或者托管堆中的对象当前使用了多少内存。
GC负责管理应用程序堆对象的整个生命周期,从应用程序分配内存到内存被回收,都由GC负责。 从高层来看,JVM垃圾回收算法的最基本功能如下: 当应用程序请求分配内存时,GC负责提供内存。...由于它更简单,所以更适合小型、短时间运行的应用程序。 OpenJDK还提供了另一个名为Epsilon的GC。为什么没有在表1中列出呢?...G1会尽可能将暂停时长保持在目标以下。默认的时长为200毫秒,这个值也许不适合你的应用程序,但它只是最大值的目标。G1会尽可能将暂停时长控制在该值以下。...表2总结了暂停时长的平均值和第99百分位值(P99),以及在200毫秒的默认暂停时长目标值下,不同JDK的相对暂停总时长。...我扩展了试验范围,增加了JDK 18下暂停时长设置为50毫秒,因为之前随意设置的-XX:MaxGCPauseMillis为200毫秒还是太长了。
那么,想要实现 Kafka 批量消息发送只需要正确配置以下 3 个参数即可: batch-size:定义了 Kafka 生产者尝试批量发送的消息的最大大小(以字节为单位),生产者收集到足够多的消息达到这个大小时...,它会尝试发送这些消息给 Kafka Broker,默认值为 16KB。...buffer-memory:指定了 Kafka 生产者可以用来缓冲待发送消息的总内存空间,如果生产者试图发送的消息超过了这个限制,生产者将会阻塞,直到有足够空间可用或者消息被发送出去,默认值为 32MB...linger.ms:生产者在尝试发送消息前等待的最长时间(以毫秒为单位)。默认情况下,linger.ms 的值为 0,这意味着立即发送。以上 3 个参数满足任一个都会立即(批量)发送。...较小的值可以降低延迟,而较大的值可以提高吞吐量。 网络和 IO 操作线程配置优化:num.network.threads 应该设置为 CPU 核心数加 1,以充分利用硬件资源。
所以这两个线程都会进入我在上面标记为1的代码中。...五:HashMap在1.7和1.8有啥区别 在 JDK1.7 及之前的版本中, HashMap 又叫散列链表:基于一个数组以及多个链表的实现,hash值冲突的时候, 就将对应节点以链表的形式存储。...,由系统为数据每个元素分配初始值,如: //只是指定了数组的长度,并没有显示的为数组指定初始值,但是系统会默认给数组数组元素分配初始值为null String[] cars = new String...[4]; //③ 因为 Java 数组变量是引用类型的变量,所以上述几行初始化语句执行后,三个数组在内存中的分配情况如下图所示: 由上图可知,静态初始化方式,程序员虽然没有指定数组长度,但是系统已经自动帮我们给分配了...,而动态初始化方式,程序员虽然没有显示的指定初始化值,但是因为 Java 数组是引用类型的变量,所以系统也为每个元素分配了初始化值 null ,当然不同类型的初始化值也是不一样的,假设是基本类型int类型
需要注意的是,在代码中,我们还需要考虑各种非法输入,如果输入了 nil,则也需要处理,避免异常。...在我心目中,这才是我喜欢的面试题,没有标准答案,每种方案各有各的特点,面试者能够足够分清楚每种方案的优缺点,结合具体的场景做选择,这才是优秀的面试者。...中输入p *child,则可以看到Xcode输出如下内容,这与我们上面的说法一致。...例如:队列中我们保存的是节点的数据结构,但是最终输出的时候,我们需要输出的是值,在代码中,我使用了 Swift 的函数式的链式调用,将嵌套数组中的元素类型做了一次变换,如下所示: let ans = result.map...当计算完后,如果还有进位,需要处理最后结果加一位的情况。 以下是完整的代码,我使用了一些 Swift 语言的特性,比如用 flatMap 来减少对于 Optional 类型值为 nil 的判断。
以指针直接操作内存多发生在如下几种情况: (1) 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址; (2) 两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元...记住:CPU以字节为单位编址,而C语言指针以指向的数据类型长度作自增和自减。理解这一点对于以指针直接操作内存是相当重要的。...区别如下代码的功能非常重要,也是老生长叹,如果你还不知道它们的区别,而且已经在程序界摸爬滚打多年,那只能说这是一个悲哀: (1) 关键字const的作用是为给读你代码的人传达非常有用的信息。...故在C语言中如下程序是非法的: (注:C99后这个应该是合法的。)...关键字volatile C语言编译器会对用户书写的代码进行优化,譬如如下代码: 很可能被编译器优化为: 但是这样的优化结果可能导致错误,如果I/O空间0x100端口的内容在执行第一次读操作后被其它程序写入新值
当你把 switch 中的 case 后的冒号改为箭头之后,此时 switch 就不会贯穿了,但在某些情况下,程序本来就希望贯穿比如我就希望两个 case 共用一个执行体。...JDK12 的 switch 中的 case 也支持多值匹配,这样程序就变得更加简洁了。 JDK13 引入了一个新的 yield 语句来产生一个值,该值成为封闭的 switch 表达式的值。...并发回收:ShenandoahGC 实现了并发回收,这意味着它可以在应用线程运行的同时进行垃圾收集,从而减少了垃圾收集对应用性能的影响。...该代码段通常难以阅读且难以维护。 Java 的文本块特性是在 JDK15 中正式实现的。这个特性首先在 JDK13 中以预览版的形式发布,然后在 JDK14 中改进并再次以预览版的形式发布。...(s.substring(1)); } 1.15 档案类 Records 的目标是扩展 Java 语言语法,Records 为声明类提供了一种紧凑的语法,通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与
之前我写了一篇《吃人的那些Java名词:对象、引用、堆、栈和堆栈》,本以为凭借自己8年的Java编程经验足够把这些“吃人”的Java名词解释清楚了,但有网友不以为然,在文章底部评论说:“老哥,你真的有...答案是: 基本数据类型在赋值(生动而又不恰当的说法就是结婚吧)的时候,其实是把右值复制给了左值;但在左值发生改变的时候,右值却不会改变。...究竟为什么? 答案:首先,计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。...double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了在后来的运算会出现不正确结果的情况。...为什么会这样呢? 因为后缀递增会先生成值,再执行运算;也就是p++这个表达式的结果还是p。但前缀递增会先执行运算,再生成值;也就是++p这个表达式的结果是p+1。 那以上代码正确的写法是什么呢?
大家好,又见面了,我是全栈君。 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 参考答案 Java虚拟机是一个可以执行Java字节码的虚拟机进程。...参考答案 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。...参考答案 吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。...反序列化返回的值或者是方法没有执行成功情况下的异常。 把值返回给调用者。 什么是分布式垃圾回收(DGC)?它是如何工作的? 参考答案 DGC叫做分布式垃圾回收。RMI使用DGC来做自动垃圾回收。...继承的定义? 参考答案 继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。 抽象的定义?抽象和封装的不同点?
内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境。比如socket I/0操作或者文件的读写操作等 用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源。...并且通过该系统调用使用操作系统所提供的功能。 Q:为什么需要用户进程(位于用户态中)要通过系统调用(Java中即使JNI)来调用内核态中的资源,或者说调用操作系统的服务了?...Q:那为什么操作系统不直接访问Java堆内的内存区域了?...所以在后面打代码中,会进行最多9次尝试,看是否有足够的可用堆外内存来分配堆外内存。并且每次尝试之前,都对延迟等待时间,已给JVM足够的时间去完成full gc操作。...所以在后面打代码中,会进行最多9次尝试,看是否有足够的可用堆外内存来分配堆外内存。并且每次尝试之前,都对延迟等待时间,已给JVM足够的时间去完成full gc操作。
领取专属 10元无门槛券
手把手带您无忧上云