JDK

JAVA不可变类(immutable)机制与String的不可变性

纵然是瞬间 提交于 2020-10-31 06:31:40
一、不可变类简介 不可变类 : 所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类 :相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?这样的特性对JAVA来说带来怎样的好处? 线程安全 不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。 易于构造、使用和测试 ... 三、不可变类的设计方法 对于设计不可变类,个人总结出以下原则: 1. 类添加final修饰符,保证类不被继承 。 如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。 2. 保证所有成员变量必须私有,并且加上final修饰 通过这种方式保证成员变量不可改变。但只做到这一步还不够,因为如果是对象成员变量有可能再外部改变其值。所以第4点弥补这个不足。 3. 不提供改变成员变量的方法,包括setter 避免通过其他接口改变成员变量的值,破坏不可变特性。 4

手动编译 open jdk8

故事扮演 提交于 2020-10-31 06:23:44
源码下载 地址: http://jdk.java.net/ 以jdk8为例,下载位置: https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-src-b04-14_jan_2020.zip 该压缩包,大小约100来M 打包与编译 解压第一步骤得到的zip包。解压后,如下图: 待后续 来源: oschina 链接: https://my.oschina.net/u/3136014/blog/4496397

【SpringBoot 系列】一、SpringBoot项目搭建

我怕爱的太早我们不能终老 提交于 2020-10-31 05:26:48
↑点击上方 “程序猿技术大咖” 免费订阅 一、引言: 什么是spring boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适)。 使用spring boot有什么好处? 其实就是简单、快速、方便!平时如果我们需要搭建一个spring web项目的时候需要怎么做呢? 配置web.xml,加载spring和spring mvc 配置数据库连接、配置spring事务 配置加载配置文件的读取,开启注解 配置日志文件 ... 配置完成之后部署tomcat 调试 ... 但是如果使用spring boot呢? 很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套web项目或者是构建一个微服务! 使用sping boot是不是很爽,不信,接下来往下看! 二、基础环境准备 (以 Spring Boot 2.1.0.BUILD-SNAPSHOT版本搭建 ) 1、JDK环境安装 Spring Boot 2.1.0.BUILD

让我再撸一次HashMap

不羁岁月 提交于 2020-10-31 04:53:57
引言 由于近期忙着搬家,又偷懒了几个礼拜! 其实我很早以前就想写一篇关于HashMap的面试专题。对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看,专攻HashMap即可。 然而,鉴于网上大部分的关于HashMap的面试方向文章,烟哥看过后都不是太满意。因此,斗胆尝试也写一篇关于HashMap的面试专题文章! 正文 (1)HashMap的实现原理? 此题可以组成如下连环炮来问 你看过HashMap源码嘛,知道原理嘛? 为什么用数组+链表? hash冲突你还知道哪些解决办法? 我用LinkedList代替数组结构可以么? 既然是可以的,为什么HashMap不用LinkedList,而选用数组? 你看过HashMap源码嘛,知道原理嘛? 针对这个问题,嗯,当然是必须看过HashMap源码。至于原理,下面那张图很清楚了: HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体。 只是在JDK1.8中,链表长度大于8的时候,链表会转成红黑树! 为什么用数组+链表? 数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到. 链表是用来解决hash冲突问题,当出现hash值一样的情形

线程池中shutdown()和shutdownNow()方法的区别

纵饮孤独 提交于 2020-10-31 04:50:51
一般情况下,当我们频繁的使用线程的时候,为了节约资源快速响应需求,我们都会考虑使用线程池,线程池使用完毕都会想着关闭,关闭的时候一般情况下会用到shutdown和shutdownNow,这两个函数都能够用来关闭线程池,那么他们俩之间的区别是什么呢?下面我就用一句话来说明白shutdown和shutdownNow的区别。 一、一句话说明白shutdown和shutdownNow的区别 shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。 而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。 举个工人吃包子的例子,一个厂的工人(Workers)正在吃包子(可以理解为任务),假如接到shutdown的命令,那么这个厂的工人们则会把手头上的包子给吃完,没有拿到手里的笼子里面的包子则不能吃!而如果接到shutdownNow的命令以后呢,这些工人们立刻停止吃包子,会把手头上没吃完的包子放下,更别提笼子里的包子了。 1、 shutDown() 当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成

面试官问我:创建线程有几种方式?我笑了

≡放荡痞女 提交于 2020-10-31 03:33:51
前言 多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。 比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。 接下来自然就会引出线程池,Lock,Synchronized,JUC的各种并发包。然后就会引出 AQS、CAS、JMM、JVM等偏底层原理,一环扣一环。 这一节我们不聊其他的,只说创建线程有几种方式。 是不是感觉非常简单,不就是那个啥啥那几种么。 其实不然,只有我们给面试官解释清楚了,并加上我们自己的理解,才能在面试中加分。 正文 一般来说我们比较常用的有以下四种方式,下面先介绍它们的使用方法。然后,再说面试中怎样回答面试官的问题比较合适。 1、继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程。 首先定义一个类来继承 Thread 类,重写 run 方法。 然后创建这个子类对象,并调用 start 方法启动线程。 2、实现 Runnable 接口 通过实现 Runnable ,并实现 run 方法,也可以创建一个线程。 首先定义一个类实现 Runnable 接口,并实现 run 方法。 然后创建 Runnable 实现类对象,并把它作为 target 传入 Thread 的构造函数中 最后调用 start 方法启动线程。 3、实现

reactnative安装

社会主义新天地 提交于 2020-10-31 03:08:21
React Native 介绍 React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是React 在原生移动应用平台的衍生产物,使用JS、JSX、CSS开发原生应用,目前支持iOS和安卓两大平台。 官网地址: https://reactnative.cn/docs/getting-started.html 环境安装 以windows+Android平台来安装React Native环境 Nodejs Node 的版本必须大于等于 v10.x React Native命令行工具 全局安装react-native-cli npm install -g react-native-cli python Python 的版本必须为 2.x(不支持 3.x) JDK(Java SE Development Kit ) JDK 的版本必须是 1.8(目前不支持 1.9 及更高版本) Android Studio 安装 Android Studio 来获得编译 Android 应用所需的工具和环境 安装 Android SDK SDK Manager -> "SDK Platforms" -> "Show Package Details" -> Android SDK Platform 28 -> Intel x86 Atom_64 System

Linux下部署java web项目

假如想象 提交于 2020-10-31 02:51:40
首先安装mysql 服务,可以参考我另外的一篇博客 centos7下部署mysql服务 Linux下的mysql是区分数据库表名的大小写的 修改 /etc/my.cnf 文件 在 [mysqld] 节中添加: lower_case_table_names=1 Linux 系统为Centos 7.4 下载部署 jdk 下载jdk 链接 jdk8下载 #解压 tar -zxvf jdk-8u211-linux-i586.tar #移动和重命名 cp -r jdk-8u211 /opt/java/java1.8 #配置环境变量 #vim /etc/profile export JAVA_HOME=/opt/java/jdk1.8 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME CLASSPATH PATH #检查java是否安装成功 java -version java javac 下载 部署 tomcat, tomcat下载 #解压 tar -zxvf apache-tomcat-8.5.40.tar.gz #移动和重命名 cp -r apache-tomcat-8.5.40 /usr/local

并行化-你的高并发大杀器

本秂侑毒 提交于 2020-10-30 19:37:53
1.前言 想必热爱游戏的同学小时候,都幻想过要是自己要是能像鸣人那样会多重影分身之术,就能一边打游戏一边上课了,可惜漫画就是漫画,现实中并没有这个技术,你要么只有老老实实的上课,要么就只有逃课去打游戏了。虽然在现实中我们无法实现多重影分身这样的技术,但是我们可以在计算机世界中实现我们这样的愿望。 2.计算机中的分身术 计算机中的分身术不是天生就有了。在1971年,1971年,英特尔推出的全球第一颗通用型微处理器4004,由2300个晶体管构成。当时,公司的联合创始人之一戈登摩尔就提出大名鼎鼎的“摩尔定律”——每过18个月,芯片上可以集成的晶体管数目将增加一倍。最初的主频740kHz(每秒运行74万次),现在过了快50年了,大家去买电脑的时候会发现现在的主频都能达到4.0GHZ了(每秒40亿次)。但是主频越高带来的收益却是越来越小: 据测算,主频每增加1G,功耗将上升25瓦,而在芯片功耗超过150瓦后,现有的风冷散热系统将无法满足散热的需要。有部分CPU都可以用来煎鸡蛋了。 流水线过长,使得单位频率效能低下,越大的主频其实整体性能反而不如小的主频。 戈登摩尔认为摩尔定律未来10-20年会失效。 在单核主频遇到瓶颈的情况下,多核CPU应运而生,不仅提升了性能,并且降低了功耗。所以多核CPU逐渐成为现在市场的主流,这样让我们的多线程编程也更加的容易。 说到了多核CPU就一定要说GPU

简单易用的微服务聚合网关首选:Fizz Gateway安装教程

最后都变了- 提交于 2020-10-30 17:04:23
Fizz 网关简介 Fizz Gateway 是一个基于 Java开发的微服务网关,能够实现热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。 整体架构 Fizz网关的核心处理流程如上图, 收到客户端的请求后会经过一系列内置或自定义的过滤器,接着网关会自动判断当前请求的接口是否是服务编排接口,如果是服务编排接口就根据配置文件创建一个pipeline,在服务编排的pipeline里可以实现接口的串联或并联调用,可以对输入和输出的内容做数据转换,字段映射,脚本处理等操作;如果不是服务编排接口则直接反向代理到后端服务,最后把响应结果返回给客户端。 主要功能特性 - 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。 - 服务编排:支持热服务编排能力,支持前后端编码,随时随地更新API。 - 负载均衡:支持round-robin负载均衡。 - 服务发现:支持从Eureka注册中心发现后端服务器。 - 配置中心:支持接入apollo配置中心。 - HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。 - 访问策略