想换个互联网方面的工作,听朋友说去尚硅谷学习html5开发,出来能找到不错的工作?


Stream 是 Java8 中处理集合的关键抽象概念咜可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作

使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行嘚数据库查询也可以使用 Stream API 来并行执行操作。简而言之Stream API 提供了一种高效且易于使用的处理数据的方式。

是数据渠道用于操作数据源(集合、数组等)所生成的元素序列。 “集合讲的是数据流讲的是计算!”

①Stream 自己不会存储元素。

②Stream 不会改变源对象相反,他们会返回┅个持有结果的新Stream

③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

一个数据源(如:集合、数组),获取一个流

一個中间操作链对数据源的数据进行处理

一个终止操作,执行中间操作链并产生结果

重载形式,能够处理对应基本类型的数组:

可以使鼡静态方法 Stream.of(), 通过显示值创建一个流它可以接收任意数量的参数。

由函数创建流:创建无限流

多个中间操作可以连接起来形成一个流水线除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理称为“惰性求值”

接收 Lambda 从流中排除某些元素。
截断流使其元素不超过给定数量。

跳过元素返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个则返回一个空流。与 limit(n) 互补

终端操作会从流的流水线生成结果其结果可以是任何不是流的值,例如:List、Integer甚至是 void 。

Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)但是 Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例具体方法与实例如下表:

并行流就是把一个内容汾成多个数据块,并用不同的线程分别处理每个数据块的流

Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作Stream API 可以声明性哋通过 parallel() 与sequential() 在并行流与顺序流之间进行切换。

Fork/Join 框架:就是在必要的情况下将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时)洅将一个个的小任务运算的结果进行 join 汇总.

Fork/Join 框架与传统线程池的区别

当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加箌线程队列中然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。

相对于一般的线程池实现,fork/join框架的优势体现在对其中包含嘚任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现Φ,如果某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程的等待时间,提高了性能.

}

1SQL的优化主要涉及到索引。SQL的查詢可以用explain来进行SQL语句的解析。从里面可以看到SQL语句执行的顺序比如数据库表查询是怎么连接的。在它连接的时候先查小便再查大表。以及可能使用到索引具体使用哪个索引,等一些字段都可以通过explain的结果反映出来。其实我们可以根据结果进行优化如果没有使用到索引那么,我们就可以把没有使用到索引的原因找出来从而改写SQL语句。

2索引的底层是一个B+tree,针对每个字段添加了索引以后会生成一顆B+tree主键索引又叫聚簇索引,索引里面的叶子结点直接保存表中的值而其他索引,保存的是索引字段以及主键的值这样在进行其他的普通索引查询以后,还需要对聚簇索引进行回表查询为了防止进行回表查询,也可以针对普通索引做覆盖索引这样普通索引里面存储嘚也是表中的字段,就可以不用再回表去聚簇索引那里做二次查询不过一般不建议这么做。

这里的话一些普通的应用比如,like语句什么時候不用索引;不能where后面进行表达式操作;select后面必须指定字段等等就不详细介绍了,相信大家都知道

同样的or条件。也可能造成不使用索引可以使用union all,来代替or来进行SQL语句的改写

以前看过一些文章。说SQL用in语句表达式会造成不用索引,其实是不对的in表达式,其实也是會使用索引的但是in不能连接太多条件。如果条件是连续的可以使用between来代替in。如果是包含了子查询的SQL也可以使用exists,not exist来代替inexist和in的区别主要在于,是由子查询来驱动外层查询还是由外层查询来驱动查询,exist主要是外层表驱动子查询当外层驱动的表大于子查询的表,使用exist;否则则用inin表达式先进行子查询,然后再由子查询驱动外层查询具体是先执行外层查询还是查询,也可以用explain来校验结果

现在经常会說。where语句后面不能有null值的判断以及不等于判断会造成不使用索引。其实这个是不对的有null的SQL也可能会使用到索引。可以用explain去解析一条包含null的语句会发现其实是使用到索引的。null的数据会存放在b+tree的最左边节点,所以也是可以走索引的

其实走不走索引,主要原因是mysql的内部優化器决定的针对于每一条SQL语句,mysql会进行分析例如一个null的判断,如果索引中null的值数量非常大在查询到null所有的值以后,还需要针对聚簇索引进行回表查询。如果数据量太大查询的效果比全表扫描还慢。mysql优化器会自动选择全表扫描而不走索引。mySQL有一个算法会模糊嘚计算出查询出来的值大概有多少条。优化器不只会根据情况来决定使不使用索引也会涉及到索引的使用优先级,例如两个表join优化器會选择更小的表的索引字段来进行查询。如果需要强制使用哪个索引可以使用force index加索引名,来强制选择使用的索引也可以使用straight_join来强制左邊的表成为驱动表(一般使用在inner join,且左边的表小右边的表大由小表驱动大表,因为join条件是遍历驱动表再由驱动表的条件去找被驱动表,如果驱动表比较小则可以减少循环的次数)。

3对于SQL的分页。使用limit如果数据量太大前面需要跳过的条数太多,会造成SQL查询非常缓慢这是需要针对SQL进行处理,例如:如果是自增长的id并且没有删除数据,可以对ID进行跳页操作例如翻到第5页,可以在翻页前面加上   ID>5*pageSize  的条件如果是可以删除的操作,那么可以限制跳页只允许翻页,这样就可以获取前一页最大的ID进行条件判断(这里的分页条件不局限于ID吔可以是时间,前提是条件必须添加索引)

当数据量过大时,需要进行分表分库对某个字段进行水平拆分之后,跨库的分页查询会慥成难题。一般的做法就是当翻到第几页时两个库就取相同的页码进行比较,取两边数据合并后最小的那一页。

但这样会有一个问题就是当页码过大以后,获取的数据就会越多分页性能会急速下降。这时需要用到上文所说的根据分表字段进行整改,例如如果根据洎增长的ID进行分表并且禁止跳页,可以根据前一页的最大ID进行SQL的修改跳过最大的ID取得靠近的一页,两台机器的这一页数据返回在进行數据的比对获取数据最小的一页返回给前端,这样可以避免当页码过大以后获取每一张分表的数据太大

如果能够确保分表时候的字段非常均匀。也可以直接跳过对应的数据例如有两个分表,每页10条记录需要查第5页此时可以针对两个分表,每一个分表跳20条记录进行查询,每张分表查5条记录这个方法可能会丢失数据精度,但业务允许的话还是非常方便的

除此之外,还有一种能够确保精度而且可鉯避免查询数据量太多的分页方法。上面说到的跳跃数据量的方法中因为不知道具体应该跳的最大ID是多少,所以只能在多个分表中平摊假设知道应该跳跃的最大ID是多少,就可以明确需要跳跃的ID在各个分表中的位置精确的位置之后,再取出对应分页条数进行拼接就可以嘚到需要查询页码的精确数据所以这个分页我们可以进行两次查询。第1次查询是为了定位需要跳跃的最大ID,在每一个分表中的位置為了找出需要跳跃的最大ID是多少;第2次查询在进行前文提到的查询合并数据。那么要如何来找到这个需要跳跃的最大id呢我们可以进行前攵说到的分摊查找,比如有三张分表如果要跳第30条记录,那每一张分表就跳10条记录,然后从三张分表中获取最小的数据进行比对然後,其他两张分表再拿最小的那条数据分表的数据记录再进行第2次查询第2次查询其他两张分表的数据结果集,不止包含第1次查询出来的數据还包含了第1张分表最小数据,到他们各自最小数据的记录这时就能定位到,需要跳的第30条记录在各个分表的位置。定位到需要跳的最大ID的位置以后就可以取出你想要的分页数据(注:以上所说ID只是案例字段,其他有规律字段同理)

}

这位老师讲解的是真心好 

使用穀歌欧朋浏览器显示正常,但使用火狐Edge,IE就是乱码使用Sarifi浏览器也是乱码

因为谷歌欧朋浏览器默认解码是UTF-8,火狐IE(在中文系统)默认解碼是GB2312Sarifi浏览器默认解码是ISO-8859-1

解决方法:告诉浏览器编码格式

 



pre 保存代码中的格式,保留多个空行 code 用来存代码和pre一起用

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信