JDK

java date api

三世轮回 提交于 2021-01-15 05:38:45
1.Java时间API历史 Java在1.0引入了 Date 类。从事后看来,这个类的设计当时是没有经过深思熟虑的。这个类中的很多方法在1.1版本的JDK中就被废弃了。 Java在1.1引入了 Calendar 类。这个类实际上也没有得到好评:这个类的实例是可变的,并且这个类也没有处理 闰秒 的问题。 Java在1.8引入了 java.time API。这套API可以比较好的弥补以前的时间API中的一些缺陷。 2.时间线与Instant Java中引入 Instant 来代表时间轴上的一个点。时间原点 epoch ,是1970年本初子午线经过格林威治皇家观测台的时间。从这远点开始,每天的时间用86400秒来度量,精度为纳秒。 可以使用Instant.now()来获取当前时间点,两个Instant之间可以使用Duration.between()来比较时间间隔。 可以通过Instant.equals()和compareTo()方法来比较两个时间点得大小和相等性。 Instant start = Instant. now(); runSomeAlorithm(); Instant end = Instant. now(); Duration timeElapsed = Duration.between( start, end); Instant类中有很多重载的加、减方法

java面试题总结系列(多线程)

回眸只為那壹抹淺笑 提交于 2021-01-15 05:26:54
什么是进程,什么是线程? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 线程包含在进程当中,是进程中实际运行单位。 java实现多线程的几种方式,应该使用哪种方式比较好?   (1)继承 java.lang.Thread 类   (2)实现 java.lang.Runnable 接口   如果你要继承其他类,最好实现Runnable。 Thread类中的Start() 和run() 方法的区别? start()方法是用来启动新创建的线程,而start()内部调用的run(),如果直接调用run(),则是在原来的线程中运行的。 Runnable和Callable有什么不同? Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。 Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过提交给线程池ExecutorService执行。 CountDownLatch、CyclicBarrier和Semaphore    1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:    

linux 安装java环境

ⅰ亾dé卋堺 提交于 2021-01-15 04:38:33
选择版本:jdk-8u221-linux-x64.tar.gz (链接: https://pan.baidu.com/s/1ilB2LUwafjpXtyXvS3n4Aw 提取码: 4kze) // 解压JDK cd /usr/java tar -zxvf jdk-8u221-linux-x64.tar.gz // 修改配置 vim /etc/profile 在底部加入如下内容: export JAVA_HOME=/usr/java/jdk1.8.0_221 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/jre/lib/dt.jar:$JAVA_HOME/lib/tools.jar // 更新生效 source /etc/profile 检测: java -version 来源: oschina 链接: https://my.oschina.net/u/2820979/blog/3112132

Linux系统安装Java环境

血红的双手。 提交于 2021-01-15 03:22:54
本篇文章来教大家在 Linux 系统上部署 Java 开发环境,这个技能其实还是蛮重要的,因为现在 Java 其实算是比较热门的一个编程语言,如果部署 Java 环境,那么就可以在 Linux 上运行 Java 程序了,本篇文章重点在 Java 的安装步骤上,作者会一步步教大家,感兴趣的朋友认真学起来。 环境说明: 系统版本:CentOS Linux release 7.6.1810 (Core) 远程连接工具:Xshell Java 版本:jdk-8u271-linux-x64 在安装之前,我们需要先验证下目前我们的机器上是否已经带有 Java 环境,验证的方法很简单,通过查看 Java 的 JDK 版本就可以。检查系统内是否已经装有 JDK,因为部分情况下 CentOS 7 在装系统时会自动安装 JDK,这里我们先来确认安装情况。 $ java --version -bash: java: command not found 是的,这个报错就是我们现在想看到的,我们执行命令查看 Java 版本,提示命令未找到,那就说明我们的系统目前还没有 Java 环境,那么接下来我们要做的就是安装了,我会一步一步教大家详细的安装过程。 1. 下载 JDK 一般在下载安装包时都建议大家从官网进行下载,一些从第三方下载的话可能会带有病毒,并且第三方网站很多都是钓鱼网站,容易暴漏我们的信息

[Java优化] Java代码细节优化

拟墨画扇 提交于 2021-01-15 02:51:55
代码优化的目标: 减小代码的体积 提高代码的运行效率 代码优化细节: 尽量指定类、方法的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有很多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让方法不可以被重写。如果指定了一个类为fianl,则该类所有的方法都是fianl的,内联对于提升java运行效率作用重大。具体见Java运行期间优化。 尽量重用对象 特别是String对象使用,出现字符串连接时应使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。 尽可能使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快。其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。 另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。 及时关闭流 Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后及时关闭以释放资源。因为这些大对象的操作会造成系统大的开销。稍有不慎,可能会导致严重的后果。 尽量减少对变量的重复计算 对方法的调用,即使方法中只有一句语句,也是有消耗的

动态代理

拥有回忆 提交于 2021-01-15 02:18:11
原文链接 http://zhhll.icu/2020/11/12/java%E5%9F%BA%E7%A1%80/%E5%8F%8D%E5%B0%84/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/ 动态代理 动态代理有很多种方式,如jdk代理,cglib,ASM等 在说动态代理之前先说一下静态代理 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象和代理对象一起实现相同的接口或者继承相同的父类 静态代理使用的是组合模式,在代理类中包含有被代理类的对象 public class TestStaticProxy { public static void main(String[] args) { NikeClothFactory nikeClothFactory = new NikeClothFactory(); ProxyFactory proxyFactory = new ProxyFactory(nikeClothFactory); proxyFactory.productCloth(); } } // 接口 interface ClothFactory{ void productCloth(); } // 被代理类 class NikeClothFactory implements ClothFactory{ @Override

JVM故障诊断和处理工具

旧街凉风 提交于 2021-01-14 20:15:20
本文已被Github仓库收录 https://github.com/silently9527/JavaCore 微信公众号:贝塔学Java 前言 前几天中午正在和同事最近聊股市较好,这几天每天都可以喝点肉汤,心里还是挺高兴的;正在这个时候收到了线上告警邮件和运维同学的消息,“你们有服务挂了!”,心里一紧,立马打开电脑看来下线上cat监控大盘,发现很多服务都在报错,根据cat上的监控日志很快发现了其中一个服务内存溢出导致其他调用服务也有问题,竟然已经定位到了出问题的服务,那就简单了,没有是重启解决不了的问题,重启之后很快服务都恢复正常了。几分钟之后又报错了,同样也是这个服务内存溢出,经过排查后发现该服务的堆内存被改小了,好家伙,运维同学不讲武德,搞偷袭,趁我没反应过来调了内存,内存调整回去之后服务就恢复了正常。 事后把线上的快照文件拖了下来分析,发现本身这个项目的代码也有些问题,本文就整理了一下JVM常用的分析工具。 命令行工具 在安装完JDK之后在JAVA_HOME/bin目录下JDK已经提供了很多命令行的工具 可能我们最常用的就是 java 、 javac 这两个命令,除了这两个命令之外还有提供很多其他的实用工具,本文主要来一起学习对JVM监控诊断工具 虚拟机进程状况工具(jps) 该工具的功能比较单一,与linux中的ps功能类似,用来列出正在运行的虚拟机进程

100道Java并发和多线程基础面试题大集合(含解答),这波面试稳了~

删除回忆录丶 提交于 2021-01-14 17:59:19
# 前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了100个多线程的问题。 这些多线程的问题来源于各大网站,可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 整理了一份Java面试宝典完整版PDF # 100个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞

字符串比较,居然暗藏玄机(没收获你锤我)

為{幸葍}努か 提交于 2021-01-14 17:14:53
面试编程基本功的时候,很常见的一个题目是: 判断两个字符串是否完全相同? 画外音:先别急着退,没收获你锤我。 很多同学能够很快的写出对应的代码: public static boolean isEqual(byte[] a, byte[] b) { // 先判断长度是否相同 if (a.length != b.length) { // 长度不同,返回false return false; } // 一个一个字符,循环遍历判断 for (int i = 0; i < a.length; i++) { if (a[i] != b[i]) { // 只要一个字符不同,返回false return false; } } // 全部字符相同,返回true return true; } 代码没有问题,甚至JDK底层,也是这么实现的。 然而,MessageDigest.isEqual却被报了bug,并在JDK 1.6.0_17中被fix成了以下的版本: public static boolean isEqual(byte[] a, byte[] b) { // 先判断长度是否相同 if (a.length != b.length) { // 长度不同,返回false return false; } // 返回结果初始化 int result = 0; // 一个一个字符,循环遍历判断 for

外行人都能看懂的WebFlux,错过了血亏!

限于喜欢 提交于 2021-01-14 07:59:37
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y 本文知识点架构: 知识点架构 如果有关注我公众号文章的同学就会发现,最近我不定时转发了一些比较好的WebFlux的文章,因为我最近在学。 我之前也说过,学习一项技术之前,先要了解为什么要学这项技术。其实这次学习 WebFlux 也没有多大的原生动力,主要是在我们组内会轮流做一次技术分享,而我又不知道分享什么比较好… 之前在初学大数据相关的知识,但是这一块的时间线会拉得比较长,感觉赶不及小组内分享(而组内的同学又大部分都懂大数据,就只有我一个菜鸡,泪目)。所以,想的是:“要不我学点新东西搞搞?”。于是就花了点时间学 WebFlux 啦~ 这篇文章主要讲解什么是 WebFlux ,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的) 一、什么是WebFlux? 我们从 Spring 的官网拉下一点点就可以看到介绍 WebFlux 的地方了 WebFlux的简介 从官网的简介中我们能得出什么样的信息? 我们程序员往往 根据不同的应用场景选择不同的技术 ,有的场景适合用于同步阻塞的,有的场景适合用于异步非阻塞的。而 Spring5 提供了一整套 响应式 (非阻塞)的技术栈供我们使用(包括Web控制器、权限控制