也有一种情况不行,那就是玩转字母串之空,这里首先要排除 no, 因为他根本就不是字母串,这里讲的前提是他是一个字母串, is empty 很好理解,就是看看四幅串是不是空,它判断的依据是什么呢?就是看它的长度是否为零,也就是说双引号当中有任何内容 都不行,转移符也不行,哎,不烂,可有什么不同呢?它允许这个字不串有空格,无论是英文半角还是中文全角都可以,甚至转移符也可以。但是也有一种情况不行,那就是这样的空格。 废话,那么他们都用来干什么呢?使用最多的就是 check 进行数据的合法形成,比如说你的评论不能为空。还有一种比较常见,就是当我们对某一数据进行复职的时候,先判断他为空,我们才进 复职,如果已经有职了,那么就不要怂,就是干,学会了吗?
粉丝1.2万获赞12.2万

章的中便利类似动态删除元素的六种方式,我们在工作中可能经常的需要去便利历史的里面的内容,并且去判断某一个元素是不是符合我们的条件,然后要把它删除掉,那么有几种方式可以完成这件事情呢?那么首先来看第一种方式, 这一种方式呃也很简单啊,就是便利历史的里面的每一个元素,然后去判断,然后去移除,那么这种方式可不可以呢?我们来呃跑一下这辆代码, 好来,他没有报错,但是呢,他并没有把周瑜删除掉,明明周瑜是以周开始的对不对?那这是为什么呢?其实主要原因是关于这个问题的详细文字法,我已经整理了一份八十万字的状元,知道传笔记放在视频的最后面,坚持看完一定对你有帮助。我们每一次便利其实 i 肯定会不断的加一,但是呢,每一次便利的时候,这个 呃历史的点 size, 它的是会不断的减少的,或者说有可能会减少对不对?有可能会发生变化啊,所以就有可能会 在整个过程中间会漏掉一些元素啊,这里我就不详细分析了,大家可以在回头自己去想一下这个过程啊,所以这种方式呢,肯定就不合适。那么再看第二种方式,第二种方式呢,刚刚不是点塞子他是会变化的吗?那我就把它在循环之前啊,就计算出来,然后呢再去循环,那么这种方式可不可以呢?我们也先来 跑一下,我们一跑发现他直接报了一个错,他说宿主越界了啊,其实也是能够理解的,因为我们这个 size 他不变了,那么很明显就是四,但是呢,随着我们呃可能有些元元素一移除,那么真正这个 size 里面他其实就没有四个元素了, 在这个过程中间就发生了变化。那么你这里假设你的 i 还去等于三的话,那么很明显就拿不到了,就住着越界了啊,所以说这种方式呢,呃,有这种情况下面也是不太合适的。那么我们再看第三种方式。第三种方式我就采用了一个倒序的方式啊,因为前 面的这两种方式相当于我的 i 是在增加的,然后我的历史和大小呢,是在减少的,他们两个是相反的,所以说会出现问题。但是我现在采用道序的话, 呃,首先我的逆时的肯定还是在减小的,减少的对不对?但是我的 i 其实也是在减小的,所以说他们两个是相当于是同方向的,同方向的话,那么其实问题就没有那么严重了,比如说我们 a 跑,他是能够正常的把我们的 需要的这两个元素都把它删除掉的,对不对?好的,我们再看第四种方式。第四种方式呢,我们就直接采用的点代器的方式,这种方式的话呢,就不用去考虑历史的的一些变化呀,哎的一些变化了,直接就反正是点代器哪个元素是需要删除的,那我就把它删除掉就可以了。所以这种方式其实可能大家用的也可能比较多。这种方式 好的,就是可能在 jdk 发之前,我们可能用这种方式用的比较多,因为它比较安全嘛,比较靠谱一点。那么我们再看第五 五种方式,想很明显这就是 ktk 八以后我们能够采用的方式,这种方式呢很简单,我就去呃利用这个历史的去过滤啊,去按照我的条件去过滤啊,过滤剩下的东西呢,就是我们想要的,相当于这就是我们删除的逻辑了,所以这种方式呢,它也是没有什么问题的,比如说也是能够正常的删除掉结果,对,删除到我们想要的 那个的,得到我们的结果,然后这第这一种主要就是过滤,然后还有第六种,第六种其实就更加简单啊,那么他就是直接调用历史的 removee 方,传一个 number, 老师传一个你要删除的那个元素的条件其实就可以了,所以这种方式啊,可能会比前面的方式要更加简单一点, 对,就一行代码,所以这个方法他的底层其实呃就是采用了叠带器啊,也就是采用了叠带器啊,只不过相当于进行了一个封装而已,所以这是给大家讲的这六种方式。那么大家还有没有其他方式可以来完成 我刚刚说的这个功能呢?好吧,大家可以就呃把自己想到的方式,可以在评论区留言,或者说呃想要拿到这些代码的啊,其实也可以在评论区留言,好吧,那么今天我就分享到这里,大家如果说有收获呃可以给我点点赞。

这节课来讲加号中的绿色集合和麦普集合,集合就是包含若干个确定元素的整体,可以想象一个整体里边包含一些单个元素,这个整体就可以看到一个集合来看代码。前面我们讲过数组,这是两种定义数组的方法。 第一个数组长度是六,还没有给他复制,第一个数组直接用三个元素,说实话包含了这三个元素。这两个数组有一个共同的特性,就是他们的长度,确定了这个是六,这个是三,访问的时候这样访问, 这是获得数组二,他的第一个元素。在以后使用的时候,我想给这俩数组都在多添加一个元素,是添加不了的,因为他们长度已经固定了,这种情况我们可以使用可变长度的列表。历史的 看这种写法就是前面我们讲的多肽,前面是接口,接口无法创建对象,所以用他的实现类创建对象。 那为什么不直接这样写呢? 这是一种面向接口变成的思想,使用它的时候里面的方法。接口提供的方法历史的有很多,时限类, 如果要改为其他的时间类,直接把它换了就行了。后边的代码不用再改,因为使用的是借口,灵活性很强。当然了,如果没有其他特别的需求,就是单纯 使用它,那这样写也没有什么问题。不过一般我们还是使用这种面相接口的, 这个列表长度是可变的,给它添加三个元素,如果以后在使用的过程中想添加元素,就直接用这个方法添加就可以了。获取元素的时候使用 get 的方法, 这个参数跟数组一样,也是一个下标,获取第一个元素 是一个字,不差类型, 但是报错提示的是我们要求的是 steam 类型,但是返回给我们的是有 oppojigou 的, oppojigu 的是什么类型?它是所有对象的负累, 即使没有血继承,他也是默认继承而不这个的。这时候需要我们强制类型转换, 转成磁性类型,这样就获得到第一个要素 ab, 获得每个要素的时候都得强制类型转换,有点麻烦,可以使用发型来解决这个问题来这样定义, 在这后边加上了 string 类型,这就使用到了发型,发型就是比较广泛,宽泛的类型不固定,就是当我们指定他是什么类型的时候,就可以按什么类型来使用,因为这里 边我放的全都是字符串,所以定义列表时候给他指定为死拼类型,这样在后面使用获取的时候就不用再强制转换了, 把它给去掉,这样就可以了。来看下一个集合 map, 他是以建制队的形式存储数据。什么是建制队?来看一下。 通过这个方法来往里存储数据,它有两个参数, k 和 v 六,一个是箭,一个是直 姓名。张三,性别难,这样来获取数据。 get 的方法里面参数是键,根据键来获得值就获取到了。张三 在这同样需要强制类型转换,根据他获得到性别难,不想强制类型转换,在这里加反型, 这边是两个, 一个是尖的,一个是直的,好了,把它们去掉, 这就是卖房的使用。好了,这节课就到这里。

今天我们来谈第九道面试题,今天我们来谈一下 a release, a linguist, 他们之间的区别是什么?好,这道题的话,我们会分两部分来谈,第一部分的话呢,是谈这个网络上的标准答案, 第二的话呢,就是我们在这个表达的基础上啊,我们来看到一些啊,不一样的地方, ok, 好,那么我们先来看第一部分啊,那第一部分的话呢,我们来看,首先第一点是他俩啊,底层数据结构的不同啊, 这点的话非常简单啊, a release 的话,大家看到这个东西啊,其实我们写代码有一个非常关键的一个习惯,就是见明知义是不是?所以大家可以看到,在这里面 a release 它的旗帜鲜明地表明了它的一个底层就是 a re 数组, 而大家可以看到第二个的话,也是旗子纤维表面,他的后,他的这个底层是一个列表。 ok, 所以的话,在这里面的话,大家可以看到啊,这两东西,他们底层数据结构是不能搞混的哈, ok, 所以我们经经经常以前在发现呢,有个同学啊,在 做下基础问答的时候呢,会发现发现很低级的错误,什么呢?就是会把这两个东西搞混了哈,这是非常不可思议的。 ok, 所以有时候大家会归咎一个点,什么就说啊,我是实践派哈,实践派理论派不关注, 所以这个我想说一下啊,这个东西啊,跟时间理论没有区别,没有关,没有关系啊,没有什么所谓的理论派,时间派,咱们这个做开发的就是踏踏实实的要做开发,动动手干活东西。但是的话呢,你写代码的时候是必须要什么?必须要 有带着理解去携带吗?而不是照着携带吗?这是有差异的啊,而且呢,你越往后你就看很多的中间界那些东西,对里面的原理啊,原码这东西的话呢,你都是需要有背后这个底层这个深厚的原理支撑的啊,这样你看起来会更轻松一些啊。 好,说到这里面来,所以这个地方的话呢,我希望大家同学不用再再再不用再搞错了啊,太简单了是吧?很明显啊,很明显。好,咱们 再往后看,那接下来有了基于这么一个底层的里里,这个底层的数据结构的差异化之后呢,接下来我们再来看一下一个非常常规的一个网络上的标准答案啊,咱们来看一眼现在说的标准答案的一个说法啊,咱们看一下第一个的话, a release 啊,超的快, 为什么快呢?很简单,是这样的数组吗?我们知道数组是一段连续的内存空间,是吧?好,咱们看一下啊,咱们看一下。 好,那假设呢?这里面的话,假设每一个地方呢?假设说存四个字节,那你就可以知道这这个游戏连续的,所以这边是一开始坐标是,这是零是吧?零四,然后这是八,因为他可计算的,他是可计算的方式,这是十二 啊,这十六对不对?可计算的连续的内存空间,所以比如说到第几个就可以可以快速的算出来啊,所以他定位快啊,定位方便。但是呢,这个定位方面是定位到第几个呢?是定位到第几个方便, 懂我意思吧?定了第几个方便啊?好,然后再往下看的话呢,我们再看一下删除插入慢,为什么呢?很简单假设啊,现在我需要在这中间插入一个新元素, 那怎么办?为了保证这个内存地址是连续的啊,所以这个时候的话呢,我们需要怎么样呢?我们需要做一件事,就是把这些东西的话呢,这一块啊, 给他往后挪一下,给他腾出个地,让他进能进来,对吧? ok, 那我如果说这边背后很多不是两个是死,是二十个 啊,是两百个,那么很显然这个挪动的空挪动就很麻烦,但是你看到这么一画,你可能觉得不就嗖一下过去了吗?对不对?哎,那是让你注意一下啊,这个时候并不是嗖一下过去,而是他需要动作,什么动作呢?我得先把这个元素往这边挪下来, 是吧?然后呢再挪出来之后呢,这个位置就可以别别人站了嘛,后面这个就可以紧跟着往这边挪。哎,你看这个过程中呢,他是有一个什么?他是有一个 便利的过程啊,所以是比较靠性能的啊。 ok, 所以呢,这边得到一个结论是什么?就是这个结论就是我们这一块里面啊,他的这个差越好,删除越好,他会慢一些, 但其实来说他更多,其实这个地方的话描述的描述啊,我们下一个版本再来说这里面些不严谨的地方啊。 ok, 那现在主体啊,先跟大家说一下,为什么会有这个结论啊?为什么会有这个结论?好,这是数足啊,这是数足。下面我们来看一下链表啊,链表因为要查找慢,因为需要一个称为一个真真查找,为什么呢?链表我们来看一下啊,链表结构是这样子的, 就是这个这时候的话呢,比如说他因为他不连续啊,他不连续,所以的话呢?他怎么玩呢?他是这样子的,他需要比如说这个指针指向他,他指向他,他呢?再指向他, ok, 可能这样,也有可能不是这样,也有可能他是这样子的,他这样,他他这样,他看到意思吧?所以的话呢,就说不是让你看到这个情况,他 是通过纸上来决定我的下一个人是谁,所以这个时候,比如说我需要找到第四个,那就我就怎么我就只能是这样挨个找了,一二三四啊?就这样一个找啊,不能无法计算,因为我知道只有什么,我只有知道你之后我才知道他下个谁,然后他做呢,才知道他下个谁。 这东西有点像以前啊,咱们这个做这个,呃,组织工作,就是以前这个这个地下地下工作,是吧?所以只每个人只知道什么,只知道他的上,他的前面前面人是谁啊?他只知道他的对接人是谁, 但是再往后呢,整个组织他是不清楚的,对吧?哈, ok, 好,这就是这么一个东西啊,这么一个结构啊,好,所以在这里面的话呢,咱们可以看到他说查找慢,是因为他要去定位某一个的时候啊,第几个的时候他得一个个挨着找啊? 但是呢删入这个删除插入快,为什么呢?比如个例子啊,比如说现在我在这边呢插入一个元素啊,想在他们俩就说他们俩中间这个 这个啊,写一下啊,写下这个一和二之间插入这个元素进来。好,那这个时候怎么办呢?这个时候我们会经常听到一段话,就是我们只需要改变前后的节点之人就行,是吧?怎么改变呢?哎,基本上我们发现啊,就是我们经常听到这么一个答案,然后你再细问一下,说怎么改变呢?这个单位大概怎么写呢?先怎么改变?先改变谁? 那么就发现大家呢,由于没思考过啊,所以如果思考过肯定不会答错,但是由于突然没思考过的话呢,就在这一块会摘摘了一样。 ok, 好,那这个东西怎么怎么插入?哎,大家可以先去思考一下啊,我们后面的话呢,可以给大家弹一弹啊。 好,所以这一块的话呢,发现他不需要动,他不要动其他元素,他只需要动这个局部的元素,所以他的性能相对会快一些。好,以上呢,这一块就是我们在网络上经常看到的一个标准的答案啊。呃,那么我们下节课再来谈一下一个比较不一样的说法啊,就补充细节更严谨一点啊,下个面试题见。

加瓦新老程序员便是经常遇到的集合类问题。第一个 integrate 和 listen integrate 有何区别? integrate 是可以便利赛特和历史的集合, listen integrate 只能便利利斯的 integrate 呢?只能只能单向便利利斯的 integrates 呢,是可以双向便利的。 那再一个呢,区别是类似的英特韵特呢,是指字既长字,英特位置接口添加新功能,比如添加一个元素,替换一个元素,获取前面和后面元素的这个所以位置,这是他他的这个答案。 那下一个问题呢,是鄂瑞丽斯的和另不利斯的有什么区别?这个是在面试经常会遇到的一个问题,主要也是有三个,三个标准答案,俄瑞历史是基于数组的, link 的历史是基于练表的。俄瑞历史的随机反位速度快,宁可的历史的随机反位速度慢。俄瑞历史的尾部 张山性能还可以,宁可的头尾张山山性能比较高,这个是他们的一个区别。下一个问题,说说 listensets, man 三者的区别。 这个问题其实也很简单,但很少有程序员在面试过程中把它说起来,今天我来做一个标准答案的。讲理,历史的赛的都是继承字,可来尺,接口慢则不适。历史的特点是元素有序,放是有放入顺序,元素可以重复。赛的特点是元素不放入顺序,元素不可以重复, 重复元素会覆盖掉。那赛的和历史的对比呢?赛的可以,元素效率较较低,下三入和插入啊效率较高,插入和删除不会引起元素位置改变。那历史的和数组类似,历史的可以状态增长,查找元素效率高,插入元素效, 因为会引起其他元素位置变变化。那历史呢?实际上是在插入,插入一个元素的过程,他会进行一个数据和复制,这就会影响他的效率。那第四一点呢?就是慢速适合推出见直对的数据。

a released 和 link the list 的一个区别?这个面试题啊,在我们嘉文里面是非常常见的呃,很多人可能会这样去回答, a a released 它是基于数组查询快,插入慢。 a link the list 它是基于列表存储啊,插入快,查询慢, 这样回答的话没有问题,但是回答的太简单了啊,不能够体现出我们的一个更深入的一个水平。那我们应该从哪些方面来回答这个问题呢?那要讲到数组和列表,肯定是要讲到的, a release 它是基于数组,那其实还不够准确,它其实是基于动态数组,当然了,这个动态数组其实还是数组演化而来的,那么 a release 的它是数组区存储,那么对于这个内存的话,要求就比较高, 需要有一片连续的一个内存空间啊,那么因为哎,这个数组他是哎这个连续的空间去存储,而且呢存储的类型又是一致的,那每个元素在这个数组里面啊,所占的一个长度,长度是一样的, 那么如果说通过这个下标去查询的话啊,去访问的话,就会非常的快速,非常的方便啊,那么对于我们这种随机访问就比较好,比较友好。 但是 make the list 的话啊,他基于念表去存储,他呢就是不需要有这个连续的内存,就是对内存的要求不是很高,因为他是分散的存储在内存里面,那这样的话,他就哎不能够通过下标去访问啊,这样 有没有这样一个特性? lik list 他在查询这一块没有那么大的优势,但是他插入快啊,因为他是基于念表的,我们如果说要去插入一个数据,只要断开两个节点之间的指针,然后重新建立念入就可以了 啊。我们欧瑞丽斯特他之所以插入麦啊,主要有两个原因,第一他因为他是内部是基于动态数组,那会涉及到扩容啊,比如说我现在我这个欧瑞丽斯特,他初始的时候是十个长度, 现在我要插入第十一个数据,那么这里的话,我们就会涉及到这一个数组的扩容,那他是怎么扩容的呢啊?他就是去拥有一个新的数组,更大长度的一个新的数组,然后呢将老的数组里面的数据 复制到新数组里面,这样,然后呢再把这一个老数组的这一个啊进行回收。好,那么这样子的话啊,就涉及到这个数据的一个迁移啊,如果说我们数据量大的话,我们这样啊, 把这个大量的数据复制到我们的新的数组里面,这样的话性能是比较低的啊。这第一点啊,那还有就是还有一个点啊,就是,哎,有的人可能说我现如果说我一开始就指定一个非常大的一个数组啊, 那我就不会涉及到这一个,嗯,扩容了,是吧?那这样也会有一个问题啊,如果说我本来我只要存储十个数据,你给我出十块一个一千这么大的一个数,呃,数组,那这样子的话啊,只要我开始存储数据,我就会去你有一个这么大的一个,呃,内存 的一个数组啊,那会导致这一个内存的一个浪费啊,我们应该就是,呃,就是大概估算一下我们要存多少数据啊,这样就会比较好一点。但还有一个问题是什么呢?就是如果说啊,我现在呢 去啊插入数据啊,插入到这个数组,就是我这个数组足够长的话啊,嗯,然后呢我插入一个数据,如果说我是按照头插入头部或者是往中间插的话,这里就会有一个问题,就是我会要需要把这个数据就是 进行迁移移动啊,复制到后面去,那不管是你头部插入还是中间插入,都会涉及到这个数据的一个移动,那如果说那所以说这个,所以说如果说数据量很大的话,我们也会涉及到 这个大量的一个数据的一个复制啊,这也是非常的一个好性能的。但是呢,如果说我们使用尾插法啊,就是,哎,我们使用尾插法在后面在尾部插入数据,并且呢 就是我们指定这个数组的一个容量,那么这样子的话,就会给啊这个欧瑞 list 啊带来一个很大的一个契机,就是他可以极大的一个提升我们这个性能啊,甚至有可能去超过这个 link 的 list。 那我们 link 的例子它的内部维护了,维护了一个 node 类啊,那我们每就是插入一个数据都要去新建一个节点,新建一个 node 类,那如果说我们去,哎,如果说我要插入一个一二三,我也要去新建一个对象,那所以如果我们有大量的数据去插 插入这一个 link 的例子的话,那我们就会要新建大量的一个对象,而我们的欧瑞利斯特的话,他不需要去创建这么多对象,我们是什么就插入到数组里面去就可以了啊,这是他们之间的一个呃区别。 好,所以说如果说,呃,你说这一个 link link list 它的插入呃一定会比这一个 over releaster 要快的话,其实啊也是不对的啊,也是不对。如果说你用的很好的话,你 对这个 or release 啊用的比较熟啊,对它的底层比较熟悉啊,用的好的话,那其实也是可以超过这一个 link the list 的一个插入的一个性能的 link the list 它还有一个非常不方便的地方,就是它不太适合使用这个风循环去便利,嗯,只能适合,只能通 通过这个迭代器去便利我们的这个集合。因为使用货循环去便利的话啊,循环体内每次通过这个给的方法去获取元素的时候,都需要对这个绿色重新进行便利,那么性能的消耗是非常的大的。 还有一点就是不要试图使用这个 index of 去返回这个锁引的,呃,元素的一个锁引啊, 使用 index off 对 list 进行了便利,如果说结果为空的时候会便利整个的一个列表,那么这个是 link the list 的一个不不方便的地方。以上呢,就是我对这个 a released 和 link the list 的一个区别的一个解说。

java 中的 verealist 和 linked list 的区别?每日一记,他们啊,都是为了有序的存储并管理大量数据而设立的。 区别就在于和瑞利斯特查找或修改某个数据效率更高,而 link the list 增加或删除某个数据效率更高。点个关注,刷题无数。