JDK

JDK12的新特性:teeing collectors

偶尔善良 提交于 2020-08-18 12:49:37
简介 JDK12为java.util.stream.Collectors添加了一个新的teeing方法,怎么翻译呢?看到很多人都把它翻译成“发球台”,我不禁潸然泪下,哪里有那么复杂,tee就是T。它的作用就像是一个T型,数据从两头进入,然后从一头流出。teeing的作用也就在此。 更多内容请访问 www.flydean.com talk is cheap, show me the code 我最喜欢的就是一言不合上代码,文字的描述总是让人有点摸不着头脑,程序员还是要用程序说话。有了程序就有了逻辑,有了逻辑一切都有了。 各大网站上的例子都喜欢举maxBy和minBy的例子,我这里偏不,下面举一个统计学生平均分数和总分数的例子,希望大家能够喜欢: [@Test](https://my.oschina.net/azibug) public void useTeeing(){ List<Student> studentList= Arrays.asList( new Student("alice", 90), new Student("boy", 20), new Student("bruce", 40), new Student("batman", 100) ); String teeingResult=studentList.stream().collect( Collectors

1.3万字13图!JVM 史上最最最完整深入解析

◇◆丶佛笑我妖孽 提交于 2020-08-18 12:45:41
工作之余,想总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1,64位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中

一位资深程序员大牛给予Java初学者的学习路线建议

不打扰是莪最后的温柔 提交于 2020-08-18 11:04:29
Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。   在大家看之前,我要先声明两点。1、由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。   如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。    第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。   一、Java基础首先去找一个Java的基础教程学一下,这里可以推荐一个Java学习交流的QQ群(群号码:589809992)你可以到这个群里找相应的视频教程。学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。学完以上内容以后,你应该对Java有一个基本的了解了

自学java要先从哪里入手

懵懂的女人 提交于 2020-08-18 10:08:41
基本入手步骤: 开发环境搭建,安装JDK 安装开发工具 - eclipse 买书籍或者看电子书 https:// zhuanlan.zhihu.com/p/15 7728866 找一套系统最新的基础视频: JAVA讲解 学习路线图 https:// zhuanlan.zhihu.com/p/16 1887055 社群或者社区(比如:csdn,B站等)学习 首先只需要下载jdk安装并且配置就可以了,在cmd下面编译并且执行,这样做的目的是为了让你们先熟悉常见的方法名,类名,关键字是怎么写的,如果没有这个过程,直接就用集成开发工具,会出现的问题的是学了一段时间后,这些基本的写法都不会,这样面试的时候是非常危险的,当这些常见的都会写了,再下载集成开发工具,提高开发效率。 开发工具优先推荐使用eclipse,尤其是对于新手,因为idea虽然好,智能,但是用起来对新手不友好,上手难度不小。如果直接用idea,那会出现的问题就是学习没学好,每天还得花一部分时间来解决工具的问题,熟悉工具。当用eclipse可以做基本的开发了以后再用idea。 码邦主适合新手学习的书籍 1,《Head First Java》java入门书籍 《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。你会学会如何像个面向对象开发者一样去思考

5 个刁钻的 String 面试题!

∥☆過路亽.° 提交于 2020-08-18 08:49:49
这篇来看看关于 Java String 类的 5 道面试题,这五道题,我自己在面试过程中亲身经历过几道题目,本篇就带你了解这些题的答案为什么是这样。 1.判定定义为String类型的st1和st2是否相等,为什么 package string; ​ public class Demo2_String { ​ public static void main( String[] args) { String st1 = "abc"; String st2 = "abc"; System. out. println( st1 == st2); System. out. println( st1. equals( st2)); } ​ } 输出结果: 第一行:true 第二行:true 学习java,你掌握这些。二三线也能轻松拿8K以上 分析: 先看第一个打印语句,在Java中 这个符号是比较运算符,它可以基本数据类型和引用数据类型是否相等,如果是基本数据类型, 比较的是值是否相等,如果是引用数据类型,==比较的是两个对象的内存地址是否相等。 字符串不属于8中基本数据类型,字符串对象属于引用数据类型,在上面把“abc”同时赋值给了st1和st2两个字符串对象,指向的都是同一个地址,所以第一个打印语句中的==比较输出结果是 true 然后我们看第二个打印语句中的equals的比较,我们知道

JAVA高级编程基础自学笔记---文件/IO流

心不动则不痛 提交于 2020-08-18 08:44:34
教学视频: https://edu.51cto.com/course/5667.html?source=so 目录 文件/IO流(文件操作流) 内存流(内存操作流使用不多) 打印流 System类对IO的支持(输出:system.out.print(),输入:system.in) IO高级应用(重点是Scanner的应用) 对象序列化(序列化与反序列化) 文件/IO流 IP操作类的核心五个类: 文件操作类:File 流操作类 :IntputStream、OutputStream、Reader、Writer 一个接口 : Serializable 一、File文件 File类是唯一一个与文件本身操作有关的类,即通过File可以实现文件的创建、删除、列表等操作; (一般只对文件操作,不能对文件内容操作) 例子:操作File File考虑路径的时候要注意,"\"要“\\”,如:e:\\这里要双斜杠 如: 这个要是放到linux下执行回报错,这是windows的分隔符 使用windows和linux下的操作通用写法加上:File.separator代表斜杠 问题二 必须存在目录后才可以创建文件; exists()这个方法是确认文件是否存在; mkdir这个方法是适合只有一个父类时,如:e:\\test.txt,如果该目录下存在多级文件夹,那么就用mkdirs方法,如:e:\\hello\

Java程序员最新跳槽常见的14个面试题(持更中)

依然范特西╮ 提交于 2020-08-18 08:36:03
跳槽不算频繁,但参加过不少面试(电话面试、face to face面试),面过大/小公司、互联网/传统软件公司,面糊过(眼高手低,缺乏实战经验,挂掉),也面过人,所幸未因失败而气馁. 在此过程中不断查缺补漏,养成了踏实、追本溯源、持续改进的习惯,特此将自己经历过、构思过的一些面试题记录下来. 如果答案有问题,欢迎拍砖讨论,希望能对找工作或者感兴趣的朋友有所帮助,陆续整理中 。 1. synchronized和reentrantlock异同 相同点 : 都实现了多线程同步和内存可见性语义 都是可重入锁 不同点 : 实现机制不同 synchronized通过java对象头锁标记和Monitor对象实现 reentrantlock通过CAS、ASQ(AbstractQueuedSynchronizer)和locksupport(用于阻塞和解除阻塞)实现 synchronized依赖jvm内存模型保证包含共享变量的多线程内存可见性 reentrantlock通过ASQ的volatile state保证包含共享变量的多线程内存可见性 使用方式不同 synchronized可以修饰实例方法(锁住实例对象)、静态方法(锁住类对象)、代码块(显示指定锁对象) reentrantlock显示调用trylock()/lock()方法,需要在finally块中释放锁 功能丰富程度不同

Java中的对象都是在堆上分配的吗?

耗尽温柔 提交于 2020-08-18 08:19:52
作者:LittleMagic https://www.jianshu.com/p/8377e09971b8 为了防止歧义,可以换个说法: Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定。满足特定条件时,它们可以在(虚拟机)栈上分配内存。 JVM内存结构很重要,多多复习 这和我们平时的理解可能有些不同。虚拟机栈一般是用来存储基本数据类型、引用和返回地址的,怎么可以存储实例数据了呢? 这是因为Java JIT(just-in-time)编译器进行的两项优化,分别称作 逃逸分析 (escape analysis)和标量替换(scalar replacement)。 注意看一下JIT的位置 中文维基上对逃逸分析的描述基本准确,摘录如下: 在编译程序优化理论中,逃逸分析是一种确定指针动态范围的方法——分析在程序的哪些地方可以访问到指针。当一个变量(或对象)在子程序中被分配时,一个指向变量的指针可能逃逸到其它执行线程中,或是返回到调用者子程序。 如果一个子程序分配一个对象并返回一个该对象的指针,该对象可能在程序中被访问到的地方无法确定——这样指针就成功“逃逸”了。如果指针存储在全局变量或者其它数据结构中,因为全局变量是可以在当前子程序之外访问的,此时指针也发生了逃逸。 逃逸分析 确定某个指针可以存储的所有地方,以及确定能否保证指针的生命周期只在当前进程或线程中。 简单来讲

变异测试工具Pitest(maven配置),并解决无法加载主类问题 INFO : MINION : Error: Could not find or load main class org.

岁酱吖の 提交于 2020-08-18 07:35:14
本地电脑环境 window10 jdk1.8 maven 3.5.4 IDEA 2020.1 首先配置好maven环境 这里面有一些坑,可以看我的另一篇博客,踩过的坑希望大家不要在踩了。 https://blog.csdn.net/ibo123/article/details/108034402 无法加载主类的问题在于你的maven环境没有进行全局配置,请务必配置好全局maven。要不然IDEA会自动加载默认的maven。 1 构建一个简单的maven项目 file -> project -> Maven-> next 填写 Goupid Artifactid -> Next 项目名称和路径根据自己需要填写,最后点击Finish. 2 pom.xml设置 < ? xml version = "1.0" encoding = "UTF-8" ? > < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi : schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <

Spring系列.AOP使用

纵然是瞬间 提交于 2020-08-18 07:03:50
AOP简介 利用面向对象的方法可以很好的组织代码,也可以继承的方式实现代码重用。但是项目中总是会出现一些重复的代码,并且不太方便使用继承的方式把他们重用管理起来,比如说通用日志打印,事务处理和安全检查等。我们可以将这些代码封装起来,做成通用模块,但是还是需要在代码中每处需要的地方进行显示调用,使用起来不方便。这是时候就是利用AOP的时候。 AOP是一种编程范式,用来解决特定的问题,不能解决所有问题,可以看做是OOP的补充,常见的编程范式还有: 面向过程编程; 面向对象编程; 面向函数编程(函数式编程); 事件驱动编程(GUI开发中比较常见); 面向切面编程 AOP的常见使用场景 性能监控,在方法调用前后记录调用时间,方法执行太长或超时报警; 缓存代理,缓存某方法的返回值,下次执行该方法时,直接从缓存里获取; 软件破解,使用AOP修改软件的验证类的判断逻辑; 记录日志,在方法执行前后记录系统日志; 工作流系统,工作流系统需要将业务代码和流程引擎代码混合在一起执行,那么我们可以使用AOP将其分离,并动态挂接业务; 权限验证,方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕捉; 事务处理 。 Spring AOP相关概念 AOP:这种在运行时(或者编译时或者加载时),动态地将某些公共代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程; 切面