JDK

Java小白总结一下两种常用的随机数生成方式

可紊 提交于 2020-10-14 00:35:04
Java中生成随机数 人机交互过程中,当我们需要机器给我们反馈不确定的数字结果时,就会需要用到随机数了,那么,在Java中,我们应当如何来生成并使用随机数呢? 一、通过Random类来实现 Random类是JDK的java.util包中的一个工具类,该类可用于在指定范围内产生随机数字。考察一下Random类的两种构造方法:无参构造和有参构造 Random(); 无参构造方法创建一个伪随机数生成器。 Random(long seed);有参构造方法使用一个long型的种子创建伪随机数生成器。 下面分别使用两种方式创建Random对象来获取10个0到100的随机数 无参构造方式 public class demo1 { public static void main ( String [ ] args ) { Random random = new Random ( ) ; for ( int i = 0 ; i < 10 ; i ++ ) { System . out . println ( random . nextInt ( 100 ) ) ; } } 运行结果: 这里总结一个应用random.nextInt()的式子:random.nextInt(n)+m,返回的是m到m+n-1之间的随机数。比如random.nextInt(9)+1,得到就是1到10之间的某数,如果没有n和m

分库分表就能无限扩容吗?

半世苍凉 提交于 2020-10-13 20:42:39
# 前言 像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题:服务的扩容问题。 # 正常情况下的服务演化之路 让我们从最初开始。 单体应用 每个创业公司基本都是从类似 SSM 和 SSH 这种架构起来的,没什么好讲的,基本每个程序员都经历过。 RPC 应用 当业务越来越大,我们需要对服务进行水平扩容,扩容很简单,只要保证服务是无状态的就可以了,如下图: 当业务又越来越大,我们的服务关系错综复杂,同时,有很多服务访问都是不需要连接 DB 的,只需要连接缓存即可,那么就可以做成分离的,减少 DB 宝贵的连接。如下图: 我相信大部分公司都是在这个阶段。Dubbo 就是为了解决这个问题而生的。 如果你的公司产品很受欢迎,业务继续高速发展,数据越来越多,SQL 操作越来越慢,那么数据库就会成为瓶颈,那么你肯定会想到分库分表,不论通过 ID hash 或者 range 的方式都可以。如下图: 这下应该没问题了吧。任凭你用户再多,并发再高,我只要无限扩容数据库,无限扩容应用,就可以了。 这也是本文的标题,分库分表就能解决无限扩容吗? 实际上,像上面的架构,并不能解决。 其实,这个问题和 RPC 的问题有点类似:数据库连接过多!!! 通常,我们的 RPC

java读取application.properties文件内容

ε祈祈猫儿з 提交于 2020-10-13 09:58:24
参考文章: jar中资源无法找到报 FileNotFoundException的深度(深入JDK)解析及其终极解决办法 package org.example; import org.apache.commons.lang3.StringUtils; import java.io.*; import java.util.Properties; /** * @author langpf 2020-09-09 16:02:54 */ public class ReadPropFileUtil { public static void main(String[] args) throws Exception { System.out.println("health_assess_data: " + readProp("health_assess_data")); System.out.println("lpf: " + readProp("lpf")); System.out.println("lpf2: " + readProp("lpf2")); } private static String readProp(String name) throws IOException { Properties prop = new Properties(); //

当我们创建HashMap时,底层到底做了什么?

喜你入骨 提交于 2020-10-13 04:49:45
jdk1.7中的底层实现过程(底层基于数组+链表) 在我们new HashMap()时,底层创建了默认长度为16的一维数组Entry[ ] table。当我们调用map.put(key1,value1)方法向HashMap里添加数据的时候: 首先,调用key1所在类的hashCode()计算key1的哈希值,通过key1的hash值与数组的最大索引进行位运算以后,得到了在 Entry数组中的存放位置: 如果此位置上的数据为空,此时的key1-value1添加成功。 如果此位置上的数据不为空(意味着此位置已经存在一个或多个数据),比较key1和已经存在的一个或多个数据的哈希值: 如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功。 如果key1的哈希值与已经存在的数据的某一个数据的哈希值相同,继续比较:调用key1所在类的equals()方法: 如果equals()返回false,此时key1-value1添加成功; 如果equals()返回true,使用value1替换value2。 需要注意的是,若原来位置已有数据,则此时key1-value1和原来的数据以链表的方式存储。 在不断的添加过程中,会涉及到扩容问题,当数组容量大于数组现有长度乘以加载因子(如16*0.75,默认的加载因子为0.75)的时候,就会进行数组扩容,以减少哈希冲突

这份书单,想要晋级高级Java工程师的朋友值得一看!

你说的曾经没有我的故事 提交于 2020-10-13 00:00:41
点击蓝色“程序员书单”关注我哟 加个“星标”,每天带你读好书! ​ 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,很多程序员都可以通过使用框架很快速地搭建起一个Java Web应用,特别是近几年SpringBoot大热,干脆连配置都不需要了解了,直接一键式编译部署运行,让Java工程师的入门成本变得越来越低。 但于此同时,互联网公司对于Java的应用场景也在不断地升级换代,从单机部署再到分布式,从SOA再到微服务,Java后端技术栈变得更加庞大,对于工程师的要求也越来越高,特别是对于大公司来说更是如此,也正因为如此,对Java工程师的考察已经不限于Java Web的那套东西了,企业往往会提出更高的要求,比如需要你能够熟练使用设计模式,了解Java并发编程和JVM调优,甚至是了解分布式技术、微服务以及中间件等等。 今天的这份书单并不针对某一种技术,而是想介绍一些一些Java进阶方面的书籍,其中包括Java的一些编码规范,代码最佳实践,以及调优指南,另外还介绍了一些Java编程的黑科技,比如Java异步编程,相信这些书籍对你的Java进阶学习会有所帮助。 Java进阶系列书单 ​ 阿里巴巴Java开发手册 《阿里巴巴Java开发手册》的愿景是码出高效,码出质量。它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧

Redis-Java项目应用(Jedis、SpringBoot整合、工具类模板)

拜拜、爱过 提交于 2020-10-12 03:46:41
文章目录 Jedis 导入依赖 测试 SpringBoot整合 导入依赖 配置连接 测试 序列化 工具类封装 Jedis Jedis 是Redis官方推荐的Java连接开发工具。 导入依赖 < dependency > < groupId > redis.clients </ groupId > < artifactId > jedis </ artifactId > < version > 3.3.0 </ version > </ dependency > 测试 记得先开启Redis服务 测试了下各API调用,和前两篇讲的命令基本一致,不再赘述。 package com . wzl ; import redis . clients . jedis . Jedis ; import redis . clients . jedis . Transaction ; public class Test { public static void main ( String [ ] args ) { //连接Redis Jedis jedis = new Jedis ( "127.0.0.1" , 6379 ) ; System . out . println ( jedis . ping ( ) ) ; //测试String jedis . set ( "s1" , "v1" ) ; /

Springboot能这样做全局日期格式化,有点香!

瘦欲@ 提交于 2020-10-12 02:52:27
说在前边 最近部门几位同事受了一些委屈相继离职,共事三年临别之际颇有不舍,待一切手续办妥帖,寒暄过后送他们出公司,几个老哥临别时冲我鬼魅一笑,我顿时心里一紧有种不好的预感,这事绝对没有这么简单。等我接手这几个大佬的项目后,应验了我的预感,此刻我居然有点后悔,为啥送别之时没揍他们一顿!哈哈哈~ 而这种打人的冲动,在我开始优化几位老哥的项目时候,变得越来越强烈。 有个坑 技术部每个月都会组织一下代码走查及优化,以前是各自审查优化自己的项目,如今几位老哥的离职他们的项目就落到了我的头上。对于程序员来说最痛苦的事情就是接手别人的项目,还要做优化改造,因为这一点也不比重构一遍项目简单。不过,军令在前,没办法硬着头皮上吧! 第一个优化的点就让我有点崩溃,这几个大佬的技能能力很强,一直都是我学习的榜样,但在项目里几乎所有的日期格式化都这样用 SimpleDateFormat ,像如下代码这样实现,emm~ ,受过伤的男人怎么啥事都做的出来,哈哈哈~ SvcOrderDailyStatisticsPo orderDailyStatisticsPo = new SvcOrderDailyStatisticsPo(); SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd"); Date stationTime =

我的并发编程(二):java对象头以及synchronized升级过程

試著忘記壹切 提交于 2020-10-12 01:57:02
一、概述 研究java对象头的目的是详细分析Java的 synchronized 锁的升级过程,因为 synchronized 在锁升级的时候,就是依赖对象头的信息来决定的。本博文针对64位的操作系统来对Java对象头进行详解。 二、详细分析 1. 用户态与内核态 内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时, 就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运 行的特权级,大部分用户直接面对的程序都是运行在用户态;当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。 操作系统对于用户态线程(也叫纤程)的管理是由系统内核kernel来管理的。JVM中的线程与操作系统的原生线程对应关系一般是1:1的关系。对应关系除了1:1,也有m:1,也就是用户态的m个线程只对应内核态中的1个线程;m:n的关系,出现在go语言的协程中。计算机上的程序包括JVM是运行在计算机的用户空间上,运行在用户空间上的程序的特点就是,在进行一些敏感操作(比如网络读写、读写硬盘、内存映射等)的时候,需要通过工作在内核空间的系统内核kernel进行系统调用

这35个Java代码优化细节,你用了吗?

﹥>﹥吖頭↗ 提交于 2020-10-12 01:54:31
作者 : java架构笔记 来源 : http://suo.im/6jvOoY 前言 代码 优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。 代码优化的目标是: 减小代码的体积 提高代码运行的效率 代码优化细节 1、尽量指定类、方法的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50% 。 2、尽量重用对象 特别是String对象的使用

Java--注解

我的未来我决定 提交于 2020-10-11 09:28:34
Java--注解 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 注解:说明程序的。给计算机看的 注释:用文字描述程序的。给程序员看的 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释 作用 ①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】 ②代码分析:通过代码里标识的注解对代码进行分析【使用反射】 ③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】 JDK中预定义的一些注解 @Override :检测被该注解标注的方法是否是继承自父类(接口)的 @Deprecated:该注解标注的内容,表示已过时 @SuppressWarnings:压制警告, 一般传递参数all @SuppressWarnings("all") 自定义注解 格式 元注解 public @interface 注解名称{ 属性列表; } 本质 注解本质上就是一个接口,该接口默认继承Annotation接口 public interface MyAnno extends java.lang.annotation