转换流
转换流
初始化变量
1private static final String FILENAME = "E:" + File.separator + "hello.txt";
字节输出流转换为字符输出流12345678910private static void testWriter() { File file = new File(FILENAME); try { Writer writer = new OutputStreamWriter(new FileOutputStream(file)); writer.write("Today is sunday."); writer.close(); } catch (IOException e) { e.printStackTrace(); }}
字节输入流转换为字符输入流12345678910111213private static ...
运算符
运算符
引用自Java 运算符
Java中提供的运算符可以分为以下几组:
算术运算符
关系运算符
位运算符
逻辑运算符
赋值运算符
其他运算符
算术运算符示例:A = 10, B = 20
运算符
描述
示例
+
加法 - 运算符两侧的值相加
A + B 等于 30
-
减法 - 左操作书减去右操作数
A - B 等于 -10
*
乘法 - 操作符两侧的值相乘
A * B 等于 200
/
除法 - 左操作数除以右操作数
B / A 等于 2
%
取模 - 左操作数除以右操作数的余数
B % A 等于 0
++
自增 - 操作数的值加1
B++ 或 ++B 等于21
–
自减 - 操作数的值减1
B– 或 –B 等于19
前缀自增自减(++a, –a):先进行自增或自减运算,再进行表达式运算。
后缀自增自减(a++, a–):先进行表达式运算,再进行自增或自减运算。
关系运算符示例:A = 10, B = 20
运算符
描述
示例
==
...
选择与循环语句
选择与循环语句选择语句if语句一个if语句包含一个布尔表达式和一条或多条执行语句。
123if (布尔表达式) { // 如果布尔表达式为true将执行的语句}
如果布尔表达式的值为true,则执行if语句中的代码块,否则执行if语句块后面的代码。
if…else语句if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句块会被执行。
12345if (布尔表达式) { // 如果布尔表达式为true将执行的语句} else { // 如果布尔表达式为false将执行的语句}
if…else if…else语句if语句后面可以跟else if…else语句,这种语句可以检测到多种可能的情况。使用该语句的时候,需要注意:
if语句最多有1个else语句,else语句在所有的else if语句之后。
if语句可以有若干个else if语句,它们必须在else语句之前。
一旦其中一个else if语句检测为true,其他的else if以及else语句都将跳过执行。
123 ...
重载与覆盖
重载与覆盖重载重载(overloading)是在一个类里面,方法名称相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(包括构造方法)都必须有一个独一无二的参数类型列表。
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样)。
被重载的方法可以改变返回类型。
被重载的方法可以改变访问修饰符。
被重载的方法可以声明新的或更广的检查异常。
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载方法的区分标准。
覆盖(又称重写)覆盖(Override)是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。
覆盖的好处在于子类可以根据需要,定义特定于自己的行为,也就是说子类能够根据需要实现父类的方法。
覆盖方法不能抛出新的检查异常或者比被覆盖方法声明更加宽泛的异常。
覆盖规则:
参数列表必须完全于被覆盖方法的相同。
返回类型必须完全于被覆盖方法的返回类型相同。
访问权限不能比父类中被覆盖的方法的访问权限更低。例如:如果父类的一个方法被声明为public,在子类中覆盖该方法就不能声明为protected。
父类 ...
JVM参数
JVM参数JVM参数
-Xms
堆最小值
-Xmx
堆最大值。-Xms与-Xmx的单位默认字节都是以k、m做单位的。通常着两个配置参数相等,避免每次空间不足,动态扩容带来的影响。
-Xmn
新生代大小
-Xss
每个线程池的堆栈大小。在jdk5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般在相同物理内存下,如果减少 -Xss 值会产生更大的线程数,但不同的操作系统堆进程内线程数是有限制的,不能无限生成。
-XX:NewRatio
设置新生代与老年代比值,-XX:NewRatio=4 表示新生代与老年代所占比例为 1:4,新生代占比整个堆的五分之一。如果设置了-Xmn的情况下,该参数是不需要再设置的。
-XX:PermSize
设置持久代初始值,默认是物理内存的64分之一
-XX:MaxPermSize
设置持久代最大值,默认是物理内存的四分之一
-XX:MaxTenuringThreshold
新生代中对象存活次数,默认是15。(若对象再eden区,经历一次MinorGC后还活着,则被移动到Survivor ...
JVM自带命令
JVM自带命令
引用自jvm系列(四):jvm调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命令的使用也让我们更能了解jvm构成和特性。
Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
命令格式
jps [option] [hostid]
option参数
-l:输出主类全名或jar路径
-q:只输出LVMID
-m:输入JVM启动时传递给main()的参数
-v:输出JVM启动时显示指定的JVM参数
其中[option]、[hostid]参数也可以不写。
...
JVM调优
JVM调优
如何优化Java GC
大型跨境电商 JVM 调优经历
Jvm知识汇总
海量连接服务端jvm参数调优杂记
内存结构
内存结构
JVM内存结构
java8 去除永久代增加元数据区Metaspace
虚拟机运行时的数据区
程序计数器(program counter register),一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。由于Java虚拟机是采用多线程,通过线程切换获得时间片得到cpu的控制权。为了线程切换后能恢复到正确的执行位置。
虚拟机栈,调用一个方法时会创建一个栈帧,用于存储局部变量、对象引用、方法返回值,每一个方法从调用到执行完成,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。通过 -Xss 控制大小,如果线程请求的栈深度大于虚拟机所允许的深度,会抛出StackOverflowError。通过递归死锁会引发这种问题。
本地方法栈,与虚拟机栈相似,主要是针对native方法服务。
堆(heap),所有线程共享,通过new操作产生对象,存放对象实例,分为年轻代(eden、两个survivor)和年老代,通过 -Xmx 和 -Xms 控制大小,如果内存不足会抛OutOfMemoryError。通过GC释放。
方法区:主要是类信息、常量、静态变量,也叫持久代,通 ...
垃圾回收
垃圾回收
GC算法 垃圾收集器
Java GC 分析
Java应用频繁FullGC分析
GC日志
快速解读GC日志
CMS垃圾回收器详解
类加载机制
类加载机制
引用自jvm系列(一):java类的加载机制
什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class 对象, Class 对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。
加载 .class 文件的方式
从本地系统中直接加载
通过网络下载.class文件
从zip,jar等归档文件中加载.class文件
从专有数据库中提取.class文件
将Java源文件动态编译为.class文件
类的生命周期
其中类加载的过程包括了加载、验 ...
搭建GitLab私有代码托管
引用自:GitLab官方安装教程,快速安装 GitLab 并汉化
CentOS 7安装 GitLab
安装并配置必要的依赖关系
如果您安装了Postfix用于发送电子邮件,请在安装过程中选择“Internet站点”。你也可以使用SendMail或配置自定义 SMTP 服务器,并将其设置为 SMTP 服务器。
在 CentOS 上,下述命令将在系统防火墙中打开 HTTP 和 SSH 访问。
12345678sudo yum install curl policycoreutils openssh-server openssh-clients -ysudo systemctl enable sshdsudo systemctl start sshdsudo yum install postfixsudo systemctl enable postfixsudo systemctl start postfixsudo firewall-cmd --permanent --add-service=httpsudo systemctl reload firewalld
添加 GitL ...
Git Flow模型
git-flow 是在 git branch 和 git tag 基础上封装出来的代码分支管理模型,把实际开发模拟称 master develop feature release hotfix support 几种场景,其中 master 对应发布上线,develop 对应开发,其他几个在不同的情况下出现。通过封装,git-flow 屏蔽了 git branch 等相对来说比较复杂生硬的命令(git branch 还是比较复杂的,尤其是在多分支情况下),简单而且规范的解决了代码分支管理问题。
Git Flow 将 branch 分成2个主要分支和3个临时的辅助分支。
主要分支:
master:永远处在即将发布(production-ready)状态。
develop:最新的开发状态。
辅助分支:
feature:开发新功能的分支,基于 develop,完成后 merge 回 develop。
release:准备要发布版本的分支,用来修复 bug。基于 develop,完成后 merge 回 develop 和 master。
hotfix:修复 master 上的问题,等 ...
Git分支管理
当前项目开发过程中,项目版本一般使用git进行管理,在进行git相关操作约定之前先对分支管理的细则进行说明。
分支的划分工程的分支主要分为master、dev、hotfix、feature四类
master:线上app代码主分支,该代码和线上代码一致
dev:开发分支,包含即将上线的新功能,由各个新功能开发分支经测试后合入,属于分支测试后的产物
feature:功能开发分支,当有新开发任务时,开发需要从dev分支拉取feature分支,开发完毕经过分支测试后,可以进行pull request请求,申请将分支合入dev分支,该分支是开发过程中最常使用的分支
hotfix:bug修复分支,或紧急需求开发分支(一般不要在hotfix分支上进行新需求的开发)。该分支从master分支拉出,经开发测试完成之后,可以进行pull requets,申请将分支合入master
特别注意:
feature只能从dev分支拉出,hotfix分支只能从master拉出在进行pull request请求之前必须对当前的开发分支进行反合,即dev分支反合feature分支,master分支反合hotfi ...
GitLab使用手册
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。随着Git的流行和DevOps的逐步落地,GitLab越来越成为日常工作中不可或缺的工具,本文是在实际开发过程中正确高效地使用GitLab方法的总结。
1、GitLab设置1.1 使用SSH代替账号密码进行认证Git提供了账号密码、SSH、GPG三种方式访问代码,其中使用最多最为方便的是SSH。
生成ssh key生成ssh key需要安装Git,在 Git Bash 中依次进行以下操作。
设置Git的全局user的name和email
1git config --global user.name "xxx"
1git config --global user.email "xxx@posun.cn"
生成ssh key
1ssh-keygen -t rsa -C “xxx@posun.cn”
之后会看到提示输入保存ssh key的文件名和加密串,建议直接回车跳过。
查看ssh key
完成上述操作之后,可以在当前用户 ...
阿里云服务器环境搭建
远程云服务器的管理是运维人员的必备技能,本文总结了阿里云linux服务器的基本环境的搭建过程,方便日后查看回顾。
远程登录目前windows平台上比较常见的SSH客户端有XShell、Putty等,这里选用比较熟悉的XShell。官网需要填写个人信息之后才能下载,这里直接选择百度软件中心下载。
安装完成之后,开始登录远程的linux服务器。
新建会话
输入用户名、密码,执行登录
操作系统这里选用的是CentOS 7
环境搭建CentOS 7 可以使用yum安装包管理器快速安装配置各种常用的软件工具。
在安装软件工具之前,先对yum进行更新。
1$ yum update
JDK安装前的检查首先检查是否已经安装其他版本JDK,如openjdk等。
1$ rpm -qa | grep -E '^open[jre|jdk]|j[re|dk]'
这里显示的输出信息为:
检查当前java版本信息
1$ java -version
如果已经安装了openjdk,使用 yum remove java-1.x.x-openjdk 命令卸载。
下载并安 ...
使用hexo快速搭建个人博客
摘要:本文主要介绍使用 hexo博客框架 + GitHub托管代码 + GitHub Pages 搭建个人博客网站。
由于各种原因,博主一直都有搭建个人博客的想法。在使用hexo之前,博主曾尝试过使用SpringBoot + JQuery编写了一个包含博客功能的网站,由于这种运行于Java环境的项目正式部署到线上比较麻烦,所以就舍弃了。偶然间发现了hexo搭配GitHub Pages可以快速搭建一个博客网站,心中甚是欢喜,立马就动手搭建了起来。在这里分享下使用这种方式搭建博客网站的过程。
环境搭建安装git进入git官网,下载安装git工具即可。
安装node.js同样的,进入node.js官网,下载安装node.js工具即可。
安装hexohexo的安装需要node.js环境,在命令行中输入以下命令安装hexo-cli(hexo的命令行工具)。
1npm install hexo-cli -g
使用hexo创建本地hexo项目1234hexo init blog #使用hexo初始化blog项目cd blog #进入blog目录npm install ...








