粉丝4.0万获赞19.1万

string 类型常用方法一,我们开始操作吧,我们第一步先定义一个 string 字符串,我们就写 hello world 的吧。我们第一个方法就讲一下返回指定字符位置吧, 我们用 chat at 方法,我们直接字符串点 chat 方法,要获取的字符位置就可以。我们返回的是一个 xr 类型,我们输出它,因为它是从下标零开始获取的,不明显,我们改成下标四,再输出一下,可以看到它输出了哦。 我们第二个是输出字符串长度,我们直接字符串点 length 就可以了,我们输出它 可以看到他输出了十一,说明我们字符串长度为十一。我们第三个讲的是判断字符串 是否相同,我们再创建一个字符串,我们先用等等判断,看看会咋样。他输出了 force, 我们再用 ecos 进行判断,可以看到他输出为 true。 我们第四个是判断字符串大小,如果他们相同会返回零,我们试一下, 可以看到他返回了零,如果他不一样,他会根据两个字符串的大小,就是比较他们的字符在 unico 的编码表中的顺序。我们第五个方法是将 string 字符串拆分为数组,我们试一下, 我们使用字符串点 split 方法进行测试,我们运行一下,啊,搞错了,我们输出了数组地址,我们先便利一下数组, 我们直接用增强 four 循环就可以啦。啊,知道了,我们直接加双引号隔开就好了。 好,可以看到他输出了,没有问题。到最后大家如果有想知道的东西在评论区列出来,我会给大家解答的。最后希望大家点赞加关注哦!

哈喽,大家好,今天来聊一下遮袜中的字符串拼接。经常会遇到有人说在县城安全的情况下要用 stream builder 拼接,不要使用加号拼接,说加号拼接会影响性能, 那么真的是这样吗?让我们来一探究竟。程序不会骗人,这里有两个方法,一个是使用加号拼接的,一个是使用 string builder 拼接的。我们分别对两个方法调用一万次对比耗时情况。 我们先使用 j d k 八来运行,看一下耗时情况,我们分别对两个方法调用三次对比。哎哎哎,不是说 spring beat 的性能比加号好吗? 这看起来怎么没什么差别啊?这是怎么回事呢?其实是 java 编译器帮助我们做了优化,我们可以通过 javap 命令对生成的课外损件进行 反编译。看一看两个方法的字解码的区别。这一段指令是加号拼接方法的字解码反编译结果,我们把它拷贝出来 放到代码对比工具中。下面这一段是使用 string builder 拼接产生的字解码反变异结果,拷贝出来放到代码对比工具中进行对比。可以看到,在 j d k 八下两个方法生成的字解码,除了方法名外, 里面的内容一模一样,编译器会自动将加号拼接转换成 stream builder 拼接。这里有一点需要强调一下, 虽然编译器会帮我们优化加号拼接,但是如果在循环中进行拼接的话,那就要使用 stand builder, 不能使用加号。我们用下面的代码演示下两个方法的区别是,上面这一个是在 在 four 循环外初始化了一个 string builder 对象,在 four 循环内部对它进行 a pen 拼接,而下面这一个是在 four 循环外声明了一个 string 字符串在 four 循环内进行加号拼接。我们来执行一下 好的 stream builder 拼接花费了九毫秒,加号拼接要稍微再等一下有点慢, 加号拼接花费了七千多毫秒,这次两个方法的耗时出现了巨大的差距,为什么会出现这么大的差距呢?我们还是通过反编译字解码来看一下两个方法的区别。 这次我们使用 idr 中的工具来进行反编译,我们找一下对应的字解码,这一段指令就是使用 string builder 拼接的结果。可以看到在代码五十行的 位置对应字解码 l e 的位置对 screen builder 进行了初始化。然后再来找一下循环体中的指令, l 二 l 三, l 五 l 六就是整个 four 循环五十一行到五十三行的指令。 可以看到在 l 五的指令中进行了 a pen 拼接。我们再来看一下用加号拼接的字解码指令是什么样的。在六十一行对应的 l e 指令进行了字符串 test。 声明, 看前面一样,这里 four 循环代码对应的指令也是 l 二 l 三, l 五、 l 六。注意看六十三行对应的 l 五指令每次都会初始化一个新的 stream builder, 然后进行 append, 差距就是这个原因导致的。 其实在 j d k 一点五中新增了 string builder 后,编译器就会帮助我们将加号拼接转换成 string builder 拼接了,而不是 j d k 八特有的。在 j d k 一点五之前,编译器会把加号拼接转换成 string buffer 拼接。 有新的同学们肯定会留意到,为什么我这里会先使用 j d k 八来演示,而不用更高的版本,因为从 j d k 九以后,编译器对加号拼接的优化进行了改动。接下来我们使用 j d k 十一来测试一下最开始的例子, 执行一下,可以看到两个方法的耗时还是差不多的,我们来反边音一下,看看 j d k 九之后做了什么改动。可以看到 ging beader 的拼接方式的字解码指令是没什么变化的。接下来看一下加号拼接的字解码指令。加号拼接的字解码指令发生了很大的变化。 从 j d k 九之后,编译器将加号拼接转换成了动态调用 string concate factory 类中的 make concate with constance 方法来优化。 对于上面说的问题, idea 也会给我们进行提示,把鼠标放到黄色的提示上,点击替换, idea 自动帮我们进行 stream builder 替换成加号拼接。 看一下 for 循环中加号拼接,这里也会给我们提示,我们点击替换即可把我们替换成 string builder 拼接在以后写代码中,对于字符串如何拼接,大家应该都了然于心了。 好的,今天的分享就到这里了,喜欢的同学们可以点个关注,不错过后续的分享哦!

最近有一位八年工作经验的程序员分享,面试的时候被问到了一个 steam build 的 一个底层原理,当场卡壳,平时开发用的飞起,最后只能挤出什么性能好,能修改,这种就是老生常谈的一个东西。那么你是不是也这样,知道它好 用,却不明白它为什么会这么快?别担心,咱们今天直接揭秘 steam build 的 一个底层机制,一分钟让你 经验面试官。先记住核心的概念, stream build, 它的本质上就是一个会自动扩容的可变字母数组,那么我们配合计数器的一个记录有效长度呢?所有的修改都在原数组上进行修改,彻底解决了 stream 每次拼接都创建新对象的这样的一个问题。 不管是 append, insert 还是 delete replay, 本质上都是对于数组进行写入移动替换。比如说以 append 为例,第一步,我们 append, 比如说给上一个 int 的 字母,首先我们要计算数字占几位,比如说使用 intagreed, 我 string size 方法去查表,比如说数字三查表得知占一位,就是这么简单直接。第二步,我们要去检查容量是否足够,不够就扩容,老容量乘以二再加二再去进行使用,比如说像 eris 点 copy off 整体搬迁。第三步,将数字转换成字母放入数组,或者说放入数组底 层进行使用。比如说像 enter 点 get hash 方法就是通过未运算配合的,比如说 delete once, 或者说 delete tens 查表完成转换,包括像 string 点 value of int, 内部也是这个逻辑的。像 insert 跟 delete 它会更简单,就是树组 元素的移动跟覆盖,把后面的数据往前挪,或者直接删除一段,那这里呢,有个关键的得分点就是 string build, 它不会自动地去缩容。各位同学请注意,频繁地删除大段的内容 之后呢,内存的占用依然不变,这点能体现你对于内存管理的一个理解,然后再轻描淡写地去补个优化点。比如说 g d k 九之后, string build 把 差速组换成了 byte 速组,字节速组配合编码标记,纯英文的场景下去进行使用的话,内存可以直接节省一半啊。说完这些,面试官的表情估计是 学留步,我的团队需要你总结三个核心的要点,第一个底层是可变数加上计数器。第二个就是所有的操作都是数组操作,扩容采用乘二的一个策略,不会自动扩缩容,新版改用 i 的 数组更加节省内存。这样回答 stream build 才是加分下你还想听哪道面试题的解析?评论区告诉我,下期继续深度的拆解。

各位朋友大家好,今天我们来聊聊一个在 java 世界里,从第一天起就伴随着每一位程序员的老朋友 string 类。到了二零二五年, java 已经发展到了二十一版本, 但这个类的核心地位依然无可动摇。它就像我们编程语言里的空气和水,无处不在, 却又因其设计精妙而常常被我们忽略其深度。简单来说, s t r i n g。 在 java 里代表一个不可变的函数训练。什么意思呢? 就是你一旦创建了一个函数串对象,里面的内容就再也不能被改变了。这种不可变性是它所有特性的基石,带来了安全、高效和简洁。它不属于八大基本数据类型,而是一个真正的类。 但 java 给了它像基本类型一样直接赋值的特权,比如 string greeting 等于。你好,二零二五好! 理解了它的本质,我们一起来逛逛它身上那些琳琅满目的能力,也就是它的方法。这些方法大体可以分为几类, 创建与构造、信息获取、比较、判断、查找、解锁、操作变换以及一些非常实用的现代工具。首先,怎么诞生一个 string 呢? 除了直接写双引号,我们还可以用 new string 这个构造器。它有很多重载形式,比如传入一个字母数组叉, 可以把一堆散落的字母组装成字母串,传入一个字节簇组 byte, 并指定字母集名称 charson name。 可以 把网络传输或文件读取来的二进制数据解码成我们认识的文字。 这里要注意字母集这个参数直观重要。处理中文或特殊符号时,如果选错,就可能出现乱码。字母串诞生后,我们自然想了解它。 link 方法,返回字母的个数, 这是对象方法。 is empty 和 is blank, 这是 java 十一引入的,都能判断是否为空。 is empty 要求长度为零, 而 is blank 连纯空白字体如空格制表符也认为是空。 charit into index 是 对象方法,根据下标获取单个字体。记住,下标是从零开始的,可别越界哦。接下来是比较和判断。 equals object, an object 是 最常用的,它比较内容是否完全相同, 强烈建议用它替代,等于来比较内容。 equals ignore case, string another string 则忽略大小写。 compared to string another string 和 compared to ignore case 则用于排序比较,按字典顺序返回差值。 starts with s t r i n g prefix ends with s t r i n g suffix 用来检查开头和结尾。 contains char sequence s, 看看是否包含某个子序列。这些都是对象方法, 需要你有一个字序链来调用。当我们需要在字序串这个文本海洋里查找定位时, 有一组强大的工具, index off index, off string string。 从前往后找某个字母或子串第一次出现的位置找不到,返回负一。它们还有重载版本,可以指定起始搜索点。 from index 对 应的 last i, n, d, e, x, o, f 系列 则从后往前找。这些方法在解析路径,截取内容时非常有用,重头戏来了,操作和变幻。因为字母串不可变, 所以所有这些方法都会返回一个全新的字母串,原串丝毫不变。 sub string int begin index 或 sub string int begin index, int and index 用于截取子串。注意参数是开始下标和结束下标 不包含结束点。本身 concaten string 用来连接,但现在我们更常用加号或者 string join replace char old char char new char or replace char sequence, target char sequence replacement 进行字母或序列的替换, to lower case 和 to upper case 进行大小写转换。 trim 能去掉首尾的空白符,而 java 十一的 strip strip leading strip trail 则对空白符的定义更广泛,更推荐使用 split。 string regx 是 重量级方法,它根据给定的正则表达式,把字串分割成一个字串数组。这个正则表达式参数 rejects 功能强大,但需要学习, 比如用逗号分割就是 split 逗号反过来把多个字母串拼接起来。我们可以用类方法, string join char sequence de limiter char sequence elements。 第一个参数是连接符,后面是可变长参数,用起来非常优雅。例如 string join 两千零二十五零一零一。 java 八之后, string 也加入了函数式编程的潮流。 char 方法返回一个 i, n, t, s, t, r, e, a, m, 让你可以用流的方式处理每个字母。 java 十一的 lines 方法则直接把一个多行字幕串按行分割成一个流,处理文本文件内容简直不要太方便。还有几个非常实用的新方法, repeat int count 可以 将字幕串重复多次。 formatted object arcs 作为实利方法,相当于 string format 的 快捷方式,用来做字幕串格式化。说到类方法,除了刚才提到的 join, 最重要的就是 format string format object arg, x 和 value 系列了。 format 方法利用格式函数串和参数生成格式化后的函数串功能强大,而 v a, l, u, e, o, f 可以 把几乎任何类型整数、浮点数、对象等转换为其函数串, 表示他是一个多才多艺的静态工厂。最后,我们不能忘记字母串的内部秘密,应 turn 这个方法,他会主动将字母串放入字母串长量池。对于大量重复字母串的场景,合理使用它可以节省内存, 但一般情况下我们不需要手动调用。好了,关于 java 二十一中 string 类的核心方法,我们就先聊到这里,他就像一把设计精良的瑞士军刀, 每一个方法都为了解决特定问题而生。理解他们不仅能让你编码更高效,也能让你更深的体会到 java 这门语言在 api 设计上的深思熟虑。希望这次漫步 能让你重新认识这位最熟悉的陌生人。下次当你敲下 s t r i n g 点的那一刻,或许会有更多得心应手的感觉。感谢您的耐心观看,我们下期再见!

今天咱们来聊一个有意思的话题, ready 写的 string 类型,它到底是怎么存储的?可能有同学会想, ready 不是 c 语言写的吗?那直接用 c 的 字串不就行了吗?那肯定是不行的,今天我们就来揭秘一下, ready 的 string 到底用的是什么数据结构,为什么不直接用 c 语言的字 串啊? s b s 有 哪些优势?这些设计给我们带来了什么好处?在这里,我花了八个月整理了一百万次的高频面试文档,把高频面试题、 场景题都按照场景分析技术原理准备思路,标准回答做了整理,需要突击面试的朋友评论区扣六六六,这份资料能帮你少走百分之八十的弯路。首先, radis 的 四针类型用的不是 c 语言的字母串,而是自己去搞了一个叫 sds 的 数据结构。简单来说, sds 就是 radis 自己实现的一个超级字母串,比 c 语言的字母串功能更加强大,性能更好。咱们先看一下 c 语言字母串有什么问题,第一,它的获取长度很慢,要便利整个字母串,它才能知道长度 之间复杂堵 o n。 第二,缓冲区溢出,没有边界检查,容易越界访问。第三,修改效率低,每次修改都可能需要去重新分配内存。第四,二进,这不安全,遇到了斜杠零就认为自扶串已经结束了,这些问题啊,在高性能的 red 死灭是不能忍的。看这个结构啊, s d s 不仅存储了字串内容,还记录了当前字串的长度,还有多少空闲空间,实际的字串的一个数据 s d s 解决了 c 语言字串的所有的问题,第一, o e 获取长度,直接读 list 字断就行。第二,防止溢出,修改前会检查空间够不够。第三,减少内存分配,预分配空间,避免频 频繁分配。第四,二,进至安全,不依赖斜杠零结束符 s d s 有 个很聪明的空间域分配策略,如果修改后的长度小于一兆,就分配合现有长度相等的空闲空间。如果修改后长度大于一兆,就额外分配一兆的一个空闲空间。这样做的好处就是减少内存分配次数, 提高性能。当字不串缩短时, s d s 不 会立即释放多出来的空间,而是用 free 字段记录下来,这样如果后面需要扩展,就不需要再重新分配内存了。当然,如果真的需要释放内存, write 也 提供了相应的 a p i s d s 不 仅用于 string 类型,在 radis 内部到处都可以看到它的身影。键值对的键,所有的 t 都是 s d s a o f 的 缓冲区,持久化,使用 s d s 存储命令。第三,客户端输入缓冲区,接收客户端的命令,返回给客户端的回复响应数据。也用 s d s 了解 s d s 对 我们有什么用呢?第一,性能优化,知道 radis 的 内部机制,能写出更高效的代码。第二,内存管理,理解 radis 的 内存使用模 是。第三,故障排查,遇到性能问题的时候呢,能够更好的分析原因。第四,架构设计,在设计系统的时候能做出更好的技术选型。好了,今天的分享就到这。另外,如果近期面试受阻, 没有面试机会,我们也有面试突击陪跑服务,可以自我咨询,从简历优化、项目包装、技术突击、面试突击、项目业务难点亮点梳理、模拟面试、面试复盘并向内推等。

在扎勒开发中,真正考验功力的往往不是复杂框架的使用,而是对基础类的深刻理解。 spring 时间处理和数值计算这些日常工具背后隐藏着影响应用性能、安全性与稳定性的关键设计逻辑。 一、 string 类隐形内存杀手与性能陷阱 string 类的核心特征是其不可变性,由 findo 叉二实现这一设计在带来现成安全优势的同时,也成为性能瓶颈的根源。每次对 string 的 修改操作,实际上都是创建新对象的过程, 实战案例皆是性能差异错误。示范式循环拼接会创建十万个对象,正确做法是使用 string builder 进行单一对象操作。 自浮串长量池的正确理解直观重要。 j b m。 通过长量池实现自浮串赋用,但需区分适用场景频繁使用的静态文本,如配置键适合入池,而动态生成的大文本,如置件数据,则应避免防止长量池膨胀。 二、时间 a p i 传统与现代的生死抉择传统时间 a p i 的 致命缺陷包括可变性破坏、现场安全、反直觉设计、月份从零开始,以及性能瓶颈,如 simple date format 非现场安全。 这些问题在新 a p i 中得到了彻底解决。扎勒巴时间 a p i。 的 选择矩阵为不同场景提供了精准解决方案,仅需日期时使用 local date, 需要时间点记录时使用 instant。 跨时区操作使用 same day time。 时间段计算使用 duration period。 跨时区转换实战视力,比如北京时间转纽约时间以及县城安全的格式化输出。 三、数值精度金融计算的隐形陷阱 fo 嘞 bo 的 精度缺陷源于二进制浮点数的本质导致经典问题零点一加零点二不等于零点三, 这是它们完全不适合金融等需要精确计算的场景。 big decimal 的 正确使用规范要避免精度丢失的构造方式,采用自辅串构造,保证精度。 除法必须指定精度和摄入模式比较使用 compare to or f equals。 需要注意的是, big decimal 虽然解决精度问题,但带来性能代价,构造操作相对 double 有 十倍性能损耗,乘除法达到十五倍。 四、场景化选型指南 stream 操作选型关键问,修改频率如何?单次操作可用 stream, 频繁修改用 stream builder, 多县城环境用 stream buffer。 时间 a p i 选型关键问,需要时区码,纯日期用 local date, 需要时区用 send date time, 时间戳记录用 instant。 数值计算选型关键问,允许误差用 int log。 五、综合实战电商订单计算规范金额计算规范势例中 water calculator 类通过 big decimal 处理商品金额数量和税费计算,确保精度控制。核心代价认知总结, string 方面,高性能用 string builder, 高安全用 string buffer。 时间处理方面,根据时需需求和精度要求选择对应类。数值计算方面,在精度与性能间权衡。金融场景必须 big decimal 理解这些基础类的设计哲学与代价。模型是构建稳定高效 java 应用的基石,正确的选型源于对业务场景的精准把握和技术特性的深刻理解。下一篇异常体系与错误边界、异常分类传播与兜底策略的原则。

好,我们接着往下讲啊,讲到这个啊,为什么要两个存储呢?对吧?那个字面量。 首先,呃在圆空间里面啊,它是符号引用啊,在堆里面放的是实群对象,那在用途方面,对吧?啊?那个在它在圆空间那里就是呃 字不转强调词那里的话,它这个类源源数据主要是用于类这个解链接和解析,那在堆里面的话呢?是实际操作的对象,对吧? 那跟这个,跟这个叫什么?跟这个,呃 生命周期来说的话啊,在原空间当中它跟这个类相同,对吧?类卸载的时候才会清理,那在堆里面什么它跟这个对象相同?也就是说 g c 的 时候它回收的话就会修了,对吧?那对可见性来说的话,那, 呃对 java 程序是是不可见的,因为你是在在我,对,在原空间这种的话,这种这种的话他就是 java 虚拟机内部使用,如果是堆里面的对象这种的话就是 java 可见的,对吧? java 程序可见,那在内容方面的话啊,呃原空间的话,它是一个原始的字节数据和一些符号信息,对吧? 那如果是对象的话,大家知道啊,他用这个叉子数组去装那些数据,对吧?啊?然后他有他的对象头,对吧? 那在可操作性方面的话啊,那原空间这种的话啊,他就不能调用方法的,也不能修改。要堆里面的这个对象的话啊,你可以调用对对象的方法啊,或者是通过反射去修改,对吧? 那在内层管理方面,对吧?啊?原原空间的话就属于原空间管理啊,那堆的话就属于这个 java 的 一个 gc 管理,对吧?啊? 那在这个抽这个这个技术方面的话,对吧?啊?我们在程序中看到的这个语句对象,比如说这个 语句 s 等于 hello 啊,比如说你调用方法 s 点 lambs 点 to uppercase 等等。啊 啊?那这个对吧?啊?这个是可以用的啊,这是可以用的,对吧?啊?要有如果是符号引用呢?啊? 他只是一个原始数据,什么叫符号引用啊?比如说这个这个,这个好好漏,对吧?好漏。他的字节数组,比如说他他是他是这个,对吧? 啊?他是这个他的,他的自己宿主是这个的,他的宿主是这个,对吧?六八六六五等等,对吧?这种啊,而且呢符号应用的话他没有方法也没有什么对象的特性,对吧? 啊?还有一个就是内存管理策略不同的啊。啊?如果说,呃你你只有原空间的数据的话,那那你怎么做这个 g c 呢?对吧? 啊那大家知道啊,符号引用的是在原空间的,对吧?他符号他原空间这里存的是字,而且他是字节数组,对吧?即使你能用,但是你不被 g c 管理啊,你是不是随处的随时都会内存溢出啊?啊? 对吧?那与怎么实现这种共享啊?如果你只在这个原空间,对吧?比如说这个,呃有 定义的两个,对吧?类 a 类 b, 他 他定义这个都是 hello, 对 吧?那这两个类怎么去共享? 呃同一个时序对象呢?大家知道啊,我们这个符号引用是按照这个类去隔离的,对吧?每个类有他自己的符号引用啊,你这样的话是不是不能共享了?那从安全性来说,对吧? 啊?那原数据原空间数据,大家知道他这里这个 java 代码是只读的啊?是只读的,是只读的啊啊?但呢使俊对象是可可以可以修改的,对吧?啊啊啊?你可能需要修改,是吧? 他怎么修改呢?通过反反射这个机制,对吧?那性能优化方面,对吧?那直接使用符号引用 会有性能问题,因为你每次都要需要去符号解析嘛,对吧?你要把它解出来是是是什么,对吧?就相当于把它,把它这个机器码运行起来,对吧?而且它没有对象缓存啊?对象缓存是什么?比如说那个哈希啊,哈希值啊,对吧?哎,没有什么方法内联,因为你没有经过那个 java 虚拟机啊,对吧?他没有帮你做呀啊? 还有一个你创创建时俊对象以后,比如说这样这种啊,你这个你这个, 你这个第一次创建,比如说你第一次去用,用它是扣的时候啊,就第一次计算的时候他会去缓存,对吧?然后就会直接去呃读取它的,不需要每次计算的,它要缓存的功能嘛,对吧?啊 啊?所以这就是为什么啊?我们在源空间有一份符号引用,然后在这里面要创建对象去保存这个字面量,对吧?这个字面量。 那么再看个例子啊,再加上一下印象,比如说定义一个 demo 啊,然后呃 啊,然后再 让我们把它这个删一下,让我们我们我们来运行一下,先把先把这个字这个类的一些信息打出来,对吧?先把类的信息打出来,类的信息打出来, 嗯,大家看啊,像这这一段代码,像这一段代码很简单的代码 就是这一段代码很简单的,就是就是一个,呃,直径类型 x 等于 hello, 然后你把它打出它的长度在这个代码当中,对吧?在这个代码当中很简单,对吧?那我们看啊, 那,那当这段代码它被翻译成这种 class 文件以后啊,它这个 hello 它放在哪里呢?它放在这个点 class 文件里面,那我们经常叫的什么叫做啊? constant 或就是点 class 文件的长量区,那这这个意,你看, 你看,在这里啊,你看在这个地方啊,我,我以前说过了,这个就是点 class 文件的那个那个长量值,对吧?啊?以后让大家看,你看那个井号八,你看这里井号八,他这个这里的井号八。大家看到有个 u t 五杠八的啊,那这个啊, 这个就是这个,就是那个什么这个,你看这个这个就是字面量的那个字节数据,这个是真正的数据。然后呢?这里有个,你看这里有个警号七,警号七是俊啊,啊,是俊啊,这里引引那个警号八, 那这一个啊,这一个是字符串长量的一个符号引用,这个井号八就是符号引用,他通过井号八能找到这个这个字面量。哈喽啊,所以我们用的时候怎么用呢?我们其实是通过我们用引用的是井号七啊,然后找到这个符号引用 啊,你看,你看,这里是不是用的是井号七啊?用二楼 dc 去加载啊,对吧?啊啊 啊,那将内加载的时候,对吧?内加载的时候啊,那,那这这些是在 plus 文件的,是吧?然后我们启动的时候,启动的时候不是相当于在外面执行的加法命令吗?是吧?那内加载的时候他会员工间会干什么呢?员工间有个运行时长量值,那运行时长量值它会包含什么东西呢?它包含一个叫做符号引用 啊,就是就是这个啊,就是那个井号七,就是那个井号七啊,井号七啊,然后引用到井号八,这个就符号引用。然后呢?它会包含一个叫什么呢?包含一个自结宿主。那自结宿主是什么?就是我们那个井号八啊,那个 u t f 杠八,然后它这个宿主就是, 对吧?这种字节型的速度,你看就是这种速度,对吧?然后当当你去执行的时候,就是说啊,当你的代码执行的时候,比如说当,呃,当这个这个加法处理机,他去执行你 你你这个第一行第一行指令的时候,这个是不是第一行指令吗?对吧? ldc 啊,几套七的时候执行这一行指令,就是这个动作的时候啊?他会干什么呢?他会到那个,他会到那个叫什么?他会到那个使尽推保有一个致富正能量词。去找啊找有没有这个符号引用? 就是那个对象引用啊?就是看看有没有对象引用,就是看看有没有这个 s 的 对象引用。有的话他干什么的?他能就如果没有的话就就是第一步,第一步其实是没有的,对吧?啊?没有的话他去如果没有哈喽的话在干什么?他在堆里面干什么?他在这个,比如说这个堆内存里面啊, 其实那个使劲开播也在堆里面,对吧?啊?就如果是在,他在另外一个区啊,他在这个创建一个对象叫什么对象?使劲内向啊?其实我就跟我们说过吧, 随机对象干什么呢?啊?他有个地址值的吧?比如说,然后这里存的是哈喽,要把它存进来,他从这个运行时长量值把它拿过来,把这个字节数组拿出来,把它编,把它翻译成这个哈喽啊,要用这个差数组去存,存,就是存,对吧?一个个字母存,对吧?一个个字母存哈喽啊,对吧? 啊?然后呢?呃,他把这个地址,他放到这个词汇 table 里面,这张表格里面,这个就是制普通常量值啊,然后呢?呃,那他执行这个指令的时候啊?这个指令是什么? ldc 警告器,他相当于要找到一个值啊,把它放到你的县城那个账里面,就操作数账啊? 你,你干嘛?相当你这个方法就生成一个战争,比如说这个妹方法,对吧?妹方法生成个战争,那战争里面,对吧?他他他其实也是个战,对吧?你要,你要把这个数据,你这个引用,把这个引用 啊,把这个引用推过去,不要从这里直接推爆,拿出,拿出这个引用推到这里的,那这个引用是什么?他指向的就是堆在这里的数据,对吧?啊?这样你就能把这个值指向这里,是不是就拿到他了?然后他把值付给这个局部变量,付给那个, 这个,这个值嘛? s 嘛? s 嘛,对吧?啊?就是这个意思嘛,对吧?然后呃,当你去调用这个方法的时候,比如说你调用这个 s lab 这个长度方法的时候,它是怎么做的呢?啊? 其实刚才说过的,对吧?因为因为你,你推的这个引用进来,对吧?这个引用不就零,那个幺零零,对吧?啊?这个对象里面就有一个零,那个幺零零,对吧?对吧?因为他是这里的,要他通过这个引用,就是通过这个,这个引用干什么? 去找到堆的是俊对象,找的是俊对象干什么?他就能访问那个 value 字状的,对吧?访问了以后就干什么?他就能统计这里的长度啊,就返回你的数值长度了, 所以这个就是流程的吗?那所以说在这里说,对吧?那为什么不能只用圆空间的数据呢? 对吧?我举个例子啊啊?如如果你的加法器你去设计,如果你是直接使用圆空间的数据,对吧?那就会有问题啊,比如说这个,呃,指令 s 等于 hello 打 word 啊,那你你你这个时候啊啊,你需要创,这个时候是不是需要创建新的新的支付串呢?对吧?啊 啊?但是呢你这个原空间指的好了和 word, 这不是很尴尬,对吧?啊?还有一个啊, 对吧?因为原空间是什么,他只能只读他,他只读他,他不允许你扎任何东西的,那你怎么办? 对吧?那还有一个字母串的修改,对吧?比如说你通过这个反射的一就去掉啊啊?举个例子,但是呢不能啊,因为原空间的数据是只读的这个就挡掉你了,对吧?有对象的标识,对吧?大家知道符号引用,对吧? 符号引用,因为他没有创建内存,他没有那种他没有,相当于有没有没有对象,没有对象头,没有对象头的啊?他没有,所以他没有对象的概念,没有对象标识,那这个时候,对吧? 对吧?你你这个,你要,你要去他拿不到对象标识的,这这这一方面,对吧?还有个同步操作,对吧? 啊?同步操作是这样的,符号引用他不是个对象啊,他没办法,因为我们做一个锁啊,形成 nice 的。 他需要对象的,对象里面他有个头的吗?对象头吗?那对象头能能够传输进来,能让你做这个呃。病房操作吗?限制吗?如果没有这个的话你怎么办?他说 所以,所以因为符号引用他本来不能作为对象啊,他不是对象,对吧?符号符号引用是什么?大家看 啊?他他是,他是这种吧?几套七啊?要呢啊?他他能他练他,你他这个符号他引用到哪里?引号到几套八?那几套八这里吗?是个字节数组,对吧? 它只是一个数据啊,它并不是一个对象,这只是最单纯的数据,它也没有对象头啊,对吧?因为你你这个同步操作你要用到对象头那些啊,对吧?那你怎么办?没办法呀,对吧?你要记住什么那种那种锁的一种级别等等,对吧?啊?没办法,对吧?你控制不了它呀,对吧? 啊?所以说啊,为什么说啊?啊?原空间有了为为什么在堆里面还要创建去对象去接这个纸啊?所以我们要了解一下啊, jm 的 设计原则啊。 这个是什么?原数据和数据的分离。那原空间管的是什么?就是 make space 管的是什么?管的就是是什么?就是这个类型的结构,他管的是类型啊,这个类型是什么?这个结构是什么样子啊?这个关系是什么样子的,对吧? 那堆管的是什么?堆管的是这个实力是什么?值?就是具体的数据,他要把你的这些结构就按照你的这个设计图纸把这个房子给建造建造出来,如果你这个房子没建造出来,对吧?你只是你只有一个图纸,对吧?你拿着这个图,你能够去住这个地方吗?你住不了啊,因为这个房子都没建起来,对吧? 啊?你是不是,对吧?对吧?啊?所以啊啊?然后呢?啊?还有一个就是只读和可可写分离,对吧?大家知道圆空间的数据是只读的,对吧?啊?就是类定义了以后是不可变的,那,那这个堆的数据是什么?就是可写的,对吧?你可以改变那个对象的状态,对吧? 那还有生命周期的分离,对吧?啊?原空间是什么?它以类类的这个颗粒度的生命周期,对吧?那堆是什么?它以对象的这个生命度为周期,因为为什么?它有 g c 的 机制,对吧?所以它的颗粒度更小一点,对吧?啊?原空间大的到啊,它是以类为准的,对吧? 嗯?啊,还有一个,对吧?啊?如果你只有原空间的数据,对吧?啊?对吧?那你把 jvm 引向这个直接使用原空间的数据,这样会出现很多问题,比如说你,你就没有字幕串长量词,对吧? 啊?就就是说你们要是进推广的这个管理的管理,那个引用了,就没有引用了啊?那没有引用的话,你就没保保,你没办法保证 s 一 就等于 s 二了,这种引用关系啊,他就没有引用,是吧?因为你不创建对象,你怎么会有对象的引用呢?对吧?啊?那,那还有一个啊,动态支付赚的创建,对吧? 啊?你,你有有这比如说这种啊,这种循环,对吧?这个值是一直变的,对吧?啊?你要拼接上这个值,这个值是要动态变的,这个是不是要动态值?不创就变,你就要创建一个动态,值不创 啊,但是呢,原空间是只读的,因为他编,他只只有编一时的长量,对吧?你在这个动态过程中,他怎么去帮你去拼接这些数据呢?对吧?这是不行的,那说安全问题上看,对吧? 啊?那所有的类啊,他共享的是同一份原数据空间,对吧?那你那这样就出这个空间都是一份,对吧?你一个类修改的可能会影响到所有的类,对吧?内存问题,对吧?他的原空间他他他不归这个 g g c 管了,对吧?我们,我们只有那个堆归 g c 管了,对吧? 啊?这个内存第一个,对吧?内存有问题吧?还有一个啊,你动态,你动态,你动态创建的字不串永远都没法释放,因为他没有 gc 啊,这个,那你怎么办?你整的这个程序怎么办?你整的停掉了,对吧?啊?对,原空间的存的是什么? 你可以认为是一种介绍,对吧?一种描述信息,那我们经常说的什么?符号引用,就是说,呃,原空间回答的是什么?就是我有什么?就是这这个类使用的哪些字不串常量啊? 这是描述的信息,他是静态的,他并不是动态的啊。那堆是什么堆?我们经常说的对象数组段啊,那他这个意思回答的什么?这个数据是什么?就是说他是支付赚的具体内容,那这个是什么?实力数据?就是动态的,那还有一个是进堆保持支付赚量时 啊,他是什么?他是连接啊,连接什么?连接这个啊?堆和圆空间之间的一些 关系,他什么呢?他建立一个叫做符号引用到实际对象的一个映射,对吧?实现了你字不串的附用,对吧?啊? 相当于他都通过一张中间表去维护你,那这个中间表我们经常叫做字不串长量值啊,那原空间当中那个那个加载从内内长量值加载过来的,那那个长量值,什么叫做动态长量值,对吧?所以简单来说 啊,原空间存的是什么啊?存的是配方,就是符号引用啊,就是这个是怎么去做的这个菜啊?就给你个,给你个做法,对吧?这个菜谱啊,所以原空间存的,是吧?就是菜谱 那堆存的是什么?就是做好的菜啊,那个堆就是真正的菜,你可以去吃的,对吧?就是使训对象吗?就是那种对象是怎么的?那? 啊?这个这个是配方的吧?啊?就是那个菜谱的食谱,那实际 table 是 什么?就是一个菜单,据说他这里有什么菜,对吧?比如说这里什么菜啊?你现在可以去点菜,对吧?点菜的话厨师就按照这个呃配方,就这个菜单去配这个这个这个配方去帮你去做,对吧? 所以这种设计的话,是啊,叫做分层的抽象啊,对吧?啊?它能够实现这个,对吧?啊?更高效的管理内存啊,保证安全性和正确性,对吧? 啊?所以说啊,我们在这个阶段我们再回忆一下啊,字不算长量,比如说字不算长量。这个 hello 啊,比如说他是生命旅程,你是怎么走的呢?第一步叫做编码阶段,就是你自己写代码啊,那你写代码,你写在哪里啊?写在点 com 文件里面,比如说, hello 啊,那这个的话属于什么?我们属于叫什么?叫做文本 文本,你看这种是文本吗?你看我们用这个记事本来打开,大家看,我们用记事本本打开啊,比如说我们用这个打开方式,我们叫做什么记事本啊? 那记事本呢?是能打开的,你也能看得清楚的。那,那这个是什么?这个属于文本阶段,文本阶段,我们以前写代码都是用记事本写的,对吧?然后编辑阶段,编辑阶段,那编辑阶段你会直接将编辑成点 class 文件,这种是什么? ufo? 杠八的字节可以变成 ufo 来字节,那这个是什么?我们知道点开什么键是什么?二进置,对吧?啊?你可以认为它是机器马,因为它大部分的是机器马二进置,但是这个机器马是什么啊?它不是真正的机器马,这是扎瓦西尼基认识的机器马,对吧?我以前说过以后到加载阶段,加载阶段像什么?它会 就会加载到加载加载器,你就在原空间,也就是那个 simo 对 象。 simo 对 象啊,相当于一个 jc 是 主,对吧?那个对象就在 jc 是 主,有点像啊,那这个时候这个数据叫什么?加载到原空间就是我们这样的。什么数据呢?原数据,对吧?就是一个描述信息,对吧?啊? 那第四个阶段就是使用级的首次使用,首次使用,对吗?他有个缓存管理,他怎么管理呢?啊?他比较,他在堆里面创建个语句。对象啊,用个差数组去传,就传这个卡喽,对吧?存起来,对吧?啊?然后呢?啊?他有个符号引用,对吧? 那这个差数组传的这个,这个数据,对吧?比如这个卡喽,对吧?所以说我们在内层里面是靠数数数组去传的,所以我们取出来的时候也是要便利数组的啊, 那,那你看这里啊,那这个是数据,实际数据,对吧?啊?他其实有个,他有个啊,他有个引用,对吧?那他的引用放在哪里呢?他放在这个哈西点,我们叫做史俊贝宝,那史俊贝宝我们经常叫什么?叫做自助餐量尺啊?然后我们在程序使用的时候怎么用呢? 然后就把你这个哈希表的这个引用放到这个赞里面啊,就说这个赞存的内容是什么呢?存的是比 s 等于什么?这个是引用值,对吧?通过这个引用能找到内存里面这个叉数组,对吧?这个是这个意思,对吧?啊? 对吧?那我们,我们,我们举个这个这个, 呃,这个例子,举个例子来看看,到底是不是我们举个例子啊?你看这里啊, 我们我们去写个写,写个写个 b 啊,也是第一阶段啊,我们知道,对吧?第一阶段啊,我们这里没办法模仿,只是打出来了 啊,第一阶段相当于原码,原代码阶段,就是相当于在点加法文件夹中,对吧?就是文本制服,对吧?比如说 hello 啊。然后第二阶段是什么?编辑后的阶段,就是编成 class 文件段 啊,我们用这个加法 p 把它打出来的,那这个时候我们再把它读出来,对吧?读出来啊,那这个属于什么? 编一阶段啊?编一阶段是什么?从你那个类文件当中啊,不停的读啊,读到内存里面,读到内存里面,对吧? 读,读,对吧?那第三阶段和第四阶段是什么?相当于运行阶段啊,对吧?第三阶段是什么?我们要创建至不创,然后再去,对吧?要再使用它,对吧?使用它,对吧? 对吧?我们使用当中,对吧?我们使用当中,我们这会消耗内存,对吧?消耗这个,呃,比如说我们就看这个 free memory 就是 空余内存,对吧?它有没有用,对吧?啊?我们创建对象,对吧?我们创建这种区块,创建区块,对吧?啊? 那从这个内存的变化我们看到什么啊?我们我们可以看到什么啊?说明啊,他确实是会在堆里面去创建对象的,对吧?所以他才会用到这个内存来的,对吧? 啊?啊?然后对吧?我们我们看,我们最后面给它总结,对吧?啊?其实就几个阶段,对吧?啊?编辑的时候就在你的点 java 就是 文本啊,编辑后就是 plus 文件二进制要加载的时候就是原空间的符号引用,对吧?放在现在已加载到原空间了,对吧?啊? 那加上符号引用啊,那那些强链的话,其实是在那个运行时强链时,对吧?还有其他内容啊?原空间其实有很多部分的啊,那运行的时候呢?就在堆里面去实际堆一下吧。引用管理是什么?通过这个 steam table 是 哈希表啊,就是那个运注册强链时去管理,对吧?那我们运行一下,对吧?啊? 啊?然后我们回车啊,防止 g c g c 它自己回销了,那么我们可以看, 我看这个,我看这里就可以了啊,对吧?那同一个对象或者是不是同一个对象,对吧?这种附用的这种话我们早就讲过,没必要讲,我们看这个 啊?啊? free memory, 对 吧?这是一八,对吧?一八这里变成一二,你创建一一万个字母创的时候这里变成一二啊,空前内存它减少了,说明它用了, 对,这个时候我们证,证明什么呢?他会在堆里面去创建对象,所以他啊这个字不串的话,他这个内容他是在堆里面的,不在这个圆空间,对吧?这个我们可以理解的,就是运行的时候,对吧?啊?你,你运行,你要,你要去拿的时候,对吧?创建的时候,对吧?啊?对,这个就这个啊,那么过啊, 那,那我们知道,对吧?我们其实啊他存的是,比如说存这个对象,就存在,比如说这个字不串长量尺,对吧? 这个这个哈喽,对吧?那哈喽他在这个圆空间怎么存的吧?他存的这是个 simba 对 象,那 simba 对 象是什么?我刚才说了有点像阶层,对吧?你看这里就是 key 的 形式的, 你看这一个 simba 对 象,对吧?对象里面有什么长度啊?引用的,引用的个数,然后还有一个啊,玻璃就是玻璃体嘛,对吧?啊?由这里是存的这原原始的字节的,这个是原始的字节的,这个就是符号引用了,对吧?啊?其实符号引用就是 simba 对 象,大家知道就是只有原始 字节数据啊,那这个方法当中,对啊,你没有看到对象头也没有看到方法,对吧?他只是一个原始的字节数,对吧? 那在这个,呃,那在转换器内部怎么用呢?转换器内部,大家知道啊,在创建对象的时候他他有个叫做什么?他有个对象头啊,对象头啊?啊?大家看到没有?创建对象和对象头是什么?有什么和 word 啊,什么啊, cass pointer 啊,指向啊,等等啊,这些不是对象头吗?对象头可以干什么?一样的去。呃同步机制啊,对吧?啊就是一个 nice 的 可以用,对吧?那这里存的是吧实际数据的,对吧?啊对吧? 还要那哈希哈希值用来干什么的啊?就是缓存的嘛,对吧?啊?就是如如果你已经创建过来那么下一次我再用通过这个哈希值,对吧? 啊这个可以让让他去只见一次。对 𠲎 阿奇值对 𠲎 缓存嘛?相当于拥拥着缓存的这个值。对 𠲎。 啊那对 𠲎 拥有缓存那些逻辑处理。对 𠲎 那 这个 value 是 什么?就是你的创世主嘛?对 𠲎 对对吧。我们创建大家知道创建对象的时候它分配内存空间以后啊它都有一个那个引用地址的,有那个地址知道吧?啊对吧?啊因为我们有地址空间嘛,对吧?啊是由呃操作系统去管理的嘛,对吧?比如说这个零 x 幺零零啊 啊这个对象有啊还有这个呢啊这个串的输入有啊 对吧?啊啊要在他是这样的啊其实我们宿主大家知道吧? 啊刚才我说的那个存就是这个对象区域的吧?啊这个对象区域里面他有个串的宿主那串的宿主其实这块也是个区域。那这个区域大家知道啊我们为什么说堆子存宿主和这个对象呢?对吧?啊其实这个啊这个对象里面存的是什么?他存的这个其实也是引用, 然后引用以后啊这里他在一个空,另外空间上其实他也是在这个对象的区域内啊。去去要拿一个空间去创建一个宿主宿主对象因为宿主的话他会这里才是存的真正的数据。其实他有两步啊,我以前是归成一步讲,归成一步讲其实是一样的, 因为因为最终去找的时候他会通过这个零的子幺零零去找到这个对象,那个通过那个注册厂找到以后,他会找到这个树主啊,如果这个树主的话,其实他也找到的是这个,他,他一定会找到这个了,找到这个以后他有些链接到这里其实是一样的啊, 对吧?所以大家一定要记得啊。啊?凡是创建什么对象树组,比如说你用对象里面保保存数据的时候,你是不是要拿个串树组去接啊?那你拿个树组去接,是不是你也要内存区域啊?如果你要内存区域,你是不是也相当于创建一个对象啊,对吧? 也不算这些嘛,空间吧,对吧?你看这里其实也要个引用的,对吧?你看这些引用这些引用,然后这里有个史俊推广,对吧?那里啊?你那个史俊推广店的是您那个幺零零通过这里找到这,然后找到这个数据来找到这里,那这个哈西用的什么?用的缓存的吧?如果有的话,对吧? 啊?也没没必要再创建了,对吧?就是这样的吧,对吧?大家应该懂的,所以,哎,所以怎么说呢?啊?这个就是 啊,这个就是我们要说的了,就是说啊,呃 呃。为什么说制服站长量值在堆里面呢?我们所谓的制服站长量值就是死讯推保,他是实现什么制服站附用的叫做哈西点啊,他在堆里面没问题,对吧?他存储的是什么?这个要记得,对吧?我们说吧,对向引用, 那原空间存储的字面量和堆存储的这个字面量一样,不一样,原空间是原始字节加符号信息那堆是什么?就完整的对象,就是这种完整的对象, 对吧?你看这种都不一样了,对吧?那原空间什么就是一个 simple 对 象,他存的这些就是原始字节,他没有对象的朋友没有方法, 让我们接着往下聊,好吧,那我们我们这里就可以删掉了,好吧,这个已经讲过了。我聊这里啊, 聊到这个数据库连接参数啊,经常见到啊,如果不见到的话,也也是在什么 xml 配置文件啊,一样大,差不差啊,就这数据库吧,对吧?啊?继续聊这个啊, 我们聊这个 j d b c 这个 maccode 吧,以 maccode 为例吧,对吧?我们现在用 maccode, 因为这个 maccode 是 开源的啊,比较好啊。啊?如果不是开源的话啊,也也讲不了,对吧?嗯? maccode maccode 啊,对吧?那我们看这个连接参数,这个连接参数大家经常见到大家经常见。 经常见。那很少人知道他是什么?很少人知道他是什么,只不过是一直在你复制粘贴过去,仅此而已,仅此而已。那我们接下来聊一下这个, 这个,这个叫做,这个叫做 gdp。 gdp c 连接支付串,他这个是一个相当于一个快递配送指令单, 他就告诉这个快递员相当于 java 程序啊,如何去把这个包裹就是这个数据啊,准确的送到收件员那里,就是送到 my sql 的 手中啊,这个相当于什么快件配送指令。 那他前面这个啊,前面这个叫做他有个这个,这个 gdp, 对 吧?麦斯考拉,这个是在固定的吧,然后在这里我们有个有个叫做 local host 三三零六,比如说这个 啊,这个啊,这个叫什么?这个是丢帧。杠零 b, 这个叫什么?收件人的地址。 那后面有个问号,问号后面跟的这些,跟的这些是什么?是配送要求?首先第一个啊,叫做 use unico 等于处,这个叫做什么啊?包裹的这语言,那些语言,比如说你要用什么? 什么中文啊等等,这个是语言,你要用什么?那后面这个啊,后面这个是什么啊?后面这个啊,后面这个叫什么啊? character character encoding ut。 杠八,这个是什么 编码格式?就是用用 ukpl 八的编码去把你的这个包裹去打包,也是把你的数据打包啊,那后面有一个 server time, 就 这种,这种就是这个是区域嘛,对吧?这个是 服务器时间的一个区域,也叫 utc。 啊,这个是什么时间标准啊?时间标准就是按照,就是按啊,按统一的世界,统一的时间 utc 去配送,按照什么时间去配送?这个是这个意思。 那如果从这样讲的话,大家可能听不懂,我给你讲讲个例子,那前面这个叫做 j d b c my c o, 这个是什么?叫你选这个是相当于选择一家快递公司啊,这个 j d b c 相当于相当于什么? j d b c 相当什么? 那 gdp 相当于什么?我要寄快件,那你要寄哪里呢?你冒号,这个是 myc, 就 说我要选择 myc, 现在快递公司你还这么认为,对吧?啊?我给我给他举的是一个快递的例子,对吧?那大家可以听得懂, 那这里有个 local house 的 三三零,这个是什么?这个是收件地址。三三零六是什么?就是比如说啊,三号楼啊, 啊,三零六房间,对吧?这个我们知道是马斯克的默认端口,对吧?那接下来有个十六单杠 d b, 这个是什么?具体的收件部门,对吧?你知道他的房间了,对吧?那房间里面可能有很多部门吧,对吧?比如说你要记到一个部门,比如说学生啊,学生部,学生部,对吧?学生部啊,对吧? 对吧?那这里 use unico 等于出这个是什么语言要求,对吧?因为我们的语言有很多吧,有可能是中文,有可能是英文的,这个时候我们干什么? 我们要把它选择语言,就是要支持各国语言,不能只认中文等等的。如果没有这个会有什么问题?你的名字,你比如说你的中文会变成乱码,就是这种问号,问号,问号。那这里 carter 字母 encode 字母编码, ut 杠八,这个是什么意思?据说你的包裹必须用 ut 杠八去书写,对吧? 那这个是什么? seven? 这个,这个是时间,对吧?相当于避免这个时间混乱,为什么呢?比如说你上海的时间,比如上海时间是八点,对吧?晚上八点啊, 如果你不转的话,会有问题啊?啊?你不转的哈,就是我们看的时间要统一,你不转会有什么问题呢?我举个例子,比如说上海的时间存到八点,那纽约的这个时间你会变成什么呢?变成七点,那这个就变成什么时区混乱,对,这不行,对吧? 那为什么需要这个参数呢?那从我们上面的解释应该知道的话,没有这些参数,对吧?你, 你,你要干什么?一个是中文乱码,对吧?啊?你的名字还有个什么时区错误? 比如说你,你本来你上海时间是八点,可能你数据库就会记成十二点,你因为没有统一时间吗? 还有你这些编码,你编码啊,支,支持的不够的话,那你有些制服,比如说有一些表情制服,或者一些特殊制服,你没办法,没办法存储啊,所以从这个比喻来说是什么 啊?啊?这个又是 unico 是 什么?就是说启动 unico 支持,对吧?啊? 啊?那这个,这个呢? compiler encoding 是 什么?就说统一这种书写我指定的字母极致 ufo 杠八,对吧?你不设置会有什么后果呢?就是不同的这个,呃,系统编码它就不一致的,对吧?那这个时间为什么要统一呢?对吧? 不,不统一的话你存的数据就混乱了,这个时间数据就混乱了啊,这个是这个, 然后我们,我们,我们,我们还看到一个叫什么?我们经常看到一个叫做啊看点,那这个用户名密码我们不需要说,这,这种没必要说。那看点, my c 点 j d b c 点 java, 这个是什么? 这个我们经常见到,这种是什么啊?即使你用的其他数据库也一样的,都有一个 java, java 是 什么驱动?那这个是什么意思?就像是我们快递公司的一个员工卡或者工作证吧,对吧? 工作证是吧?那有了这个相相当于什么呢?证明你是某家快递公司的正式员工,你能够使用这个公司的快递服务,你可以啊,想象想象一下,对吧?那这个, 啧,那这个,比如说这里有个卡,我们经常用到 class declaration, 对 吧?那这个相当于什么呢?相当于你,你获取了,获得了这个 mexico 的 一个员工资格证, 对吧?相当于什么呢?啊?相当于说啊,您好,我是买西口快递的正式员工,还要举起这个员员工证,然后上面这个员工证上写着什么了啊?看点买西口,点 jbd, 点 java, 对 吧?那有人说啊,有人会说为什么需要这个证呢?我不要不行吗?对吧? 他喜欢这样说的。他,那怎么为什么需要这个证?这个 come 的 my secret 点进去点 driver 呢?啊?那如果你没有这个员工证会发生什么?我举个例子啊,你去跟他建立跟你连接,比如说你要去这个公司啊? 啊?比如说你,你去公司,就比如说你去买买 c 口,买 c 口就快递公司,举个例子,对吧?其实买 c 口不是快递公司,对吧?他是做数据库的,那这个我举举个例子,那这个啊,比如说你去创建连接,就是看量少, 然后呢?啊,有,有个有个,有个,那个工作那个那个那个什么管理人员就是专门管这个工工作证的,这个就是门卫,对吧?门卫在那里问你,你有没有工作证呢啊?拦着你 就问你,哎,你,你是不是这家公司的?我不认识你啊,你就没有工作证呢?那这个时候干什么呢?不让你进呢,对吧?所以相当于找不到合适的驱动来的,所以说驱动是什么?相当于一个工作证,你没有这个工作证,他不让你进,不让你进,你怎么做事呢?对吧?你都没办法寄快递帮别人助工,对吧? 啊?那我们先说到这。