正则表达式
正则表达式Java中的正则表达式正则表达式定义了字符串的模式,可以用来搜索、编辑或处理文本。
在Sun的Java JDK 1.4版本中,Java自带了支持正则表达式的包,位于java.util.regex,该包主要包括以下三个类:
Pattern类:Pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,必须要调用其公共静态的compile方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数。
Matcher类:Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法,需要调用Pattern对象的matcher方法来获得一个Matcher对象。
PatternSyntaxException类:PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
Matcher类的常用方法:
matches():返回整个目标字符串与Pattern是否匹配
find():返回与Pattern匹配的下一个子串 ...
类与对象
类与对象Java作为一种面向对象语言,支持以下基本概念:
1多态、继承、封装、抽象、类、对象、实例、方法、重载
类:类是一个模板,它描述一类对象的行为和状态。
对象:对象是类的一个实例,有状态和行为。
Java中的对象对象的状态就是属性,行为通过方法体现。方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
Java中的类类可以看成是创建Java对象的模板。一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中、方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
构造方法每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器会为该类提供一个默认构造方法。在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。类的构造方法中可以调用该类的另外一个构造方法。
线程优先级
线程优先级在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。
设置线程优先级有助于帮”线程规划器”确定下一次选择哪一个线程来优先执行。
设置线程的优先级使用setPriority()方法,此方法在JDK的源码如下:
12345678910111213public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((g = getThreadGroup()) != null) { if (newPriority > g.getMaxPriority()) { newPr ...
线程状态
线程状态
引用自Java 多线程干货系列(1)
线程与进程
线程:进程中负责程序执行的执行单元。线程本身依靠程序进行运行。线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。
进程:执行中的程序。一个进程至少包含一个线程。
单线程:程序中只存在一个线程,实际上主方法就是一个主线程。
多线程:在一个程序中运行多个任务,目的是更好地使用CPU资源。
线程的状态线程的状态有以下几种:
创建状态(new):准备好了一个多线程的对象
就绪状态(runnable):调用了start()方法,等待CPU进行调度
运行状态(running):执行run()方法
阻塞状态(blocked):暂时停止执行,可能将资源交给其它线程使用
终止状态(dead):线程销毁
当需要新起一个线程来执行某个子任务时,就创建了一个线程。但是线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源),只有线程运行需要的所有条件满足了,才进入就绪状态。
当线程进入就绪状态后,不代表立刻就能获取CPU执行时间,也许此时CPU正在执行其它的事情,因此它要等待。当得到CPU执行时 ...
继承与实现
继承与实现
引用自Java接口实现和继承关系
抽象类有时候,我们可能想要构造一个很抽象的父类对象,它可能仅仅代表一个分类或抽象概念,它的实例没有任何意义,因此不希望它被实例化。
在Java中,通过在class关键字前增加abstract修饰符,就可以将一个类定义成抽象类。抽象类不能被实例化。
抽象类除了能像普通类一样可以拥有一般的属性和方法,也可以拥有抽象方法(abstract method)。抽象方法与抽象的行为相对应,通常是这个行为对父对象没有意义,而子对象有具体动作。抽象类可以有抽象方法也可以没有抽象方法;但是如果一个类有抽象方法,那么这个类只能定义为抽象类。
抽象方法还有一个特点是,它强迫子类要么仍然保持抽象性(即不具体实现该方法并仍然定义为抽象类),要么具体表现出这个方法的行为(实现具体的动作或者通过抛出UnsupportedOperationException异常来表明不支持该行为)。这样也可以强化多态性。
接口Java适用关键字interface定义一个接口。接口也是抽象对象,并且接口中的方法都是抽象方法。
一个接口可以继承其他接口;一个类通过关键字implements ...
调用类的方法
调用类的方法
引用自 深入分析Java方法反射的实现原理
方法反射实例1234567891011121314public class ReflectCase { public static void main(String[] args) throws Exception { Proxy target = new Proxy(); Method method = Proxy.class.getDeclaredMethod("run"); method.invoke(target); } static class Proxy { public void run() { System.out.println("run"); } }}
通过Java的反射机制,可以在运行期间调用对象的任何方法,如果大量使用这种方式进行调用,会有性能或内存隐患么?为了彻底 ...
转换流
转换流
初始化变量
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
运算符
描述
示例
==
...
重载与覆盖
重载与覆盖重载重载(overloading)是在一个类里面,方法名称相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(包括构造方法)都必须有一个独一无二的参数类型列表。
重载规则:
被重载的方法必须改变参数列表(参数个数或类型不一样)。
被重载的方法可以改变返回类型。
被重载的方法可以改变访问修饰符。
被重载的方法可以声明新的或更广的检查异常。
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载方法的区分标准。
覆盖(又称重写)覆盖(Override)是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。
覆盖的好处在于子类可以根据需要,定义特定于自己的行为,也就是说子类能够根据需要实现父类的方法。
覆盖方法不能抛出新的检查异常或者比被覆盖方法声明更加宽泛的异常。
覆盖规则:
参数列表必须完全于被覆盖方法的相同。
返回类型必须完全于被覆盖方法的返回类型相同。
访问权限不能比父类中被覆盖的方法的访问权限更低。例如:如果父类的一个方法被声明为public,在子类中覆盖该方法就不能声明为protected。
父类 ...
选择与循环语句
选择与循环语句选择语句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 ...
搭建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 ...