零基础入门 自学 JAVA SE 基础篇(十)字符串 StringBuffer StringBuilder 字符串MD5加密 正则表达式 正则表达式在JAVA中的使用 System和Runtime 基


目标

  • String, StringBuffer, StringBuilder
  • 使用MD5进行字符串加密
  • 使用正则表达式校验及提取字符串
  • System, Runtime 8大基本类型的包装类
  • 使用Math进行数学运算
  • 随机处理
  • 使用BigDecimalBigInteger进行货币运算
  • 使用Date, Calendar,== SimpleDateFormat==进行日期处理

字符串

  1. 常量池:为了提高效率 , Java为String类型提供了常量池 , 如果不用new关键字 创建String对象时, 字符串的存储地点为常量池, 每次使用""声明一个字符串时, 都会 检查常量池. 可以把常量池理解为一个缓存区.
    常量池空间分配图片
  2. String类内部,其实是一个final char[ ] value , 这说明String的本质是字符串数组。
    由于使用了final,所以字符串的内容具有不变性,如:
String a = "hey,java!";
//转大写
System.out.println(a.toUpperCase());//HEY,JAVA!
System.out.println(a);//hey,java!

有的时候,我们给衣服穿变量重新赋值,让它看起来改变了,但其实改变的只是变量a中的存储对象的地址,对象本身并没有发生变化,例如:

String a = "hey, java!"; 
a = a.toUpperCase(); // toUpperCase()返回的是另一个String对象, a不再指向原来 的"hey, java!", 而是指向另外那个String对象, 但原来的"hey, java!"这个对象并没有发 生变化.
  1. String类的常用方法
  • boolean equals(Object)同上,但不区分大小写
  • boolean equalsIgnoreCase(String)同上,但是不区分大小写
  • char charAt(int)提取特定下标的字符
  • int length()返回字符串的长度
  • boolean isEmpty()判断一个字符串的长度是否是0,或者是否为null,或者("")
  • String toUpperCase()返回大写形式的副本,原字符串对象不变
  • String toLowerCase()返回小写形式的副本,原字符串对象不变
  • String trim() 去掉字符串两端的空格,返回副本,常用语字符串效验前洗干净字符串
  • String concat(String)连接字符串,功能相当于"+"
  • int indexOf(String str)返回b在a中最后一次出现下标。
  • String substring(int beginIndex,int endIndex)截取从beginIndex到endIndex之间的子字符串,结果不包含endIndex
  • boolean startWith(String prefix)判断一个字符串是否以prefix开头
  • boolean endWith(String prefix)判断一个字符串是否以prefix结尾
  • boolean contains(String suffix)判断一个字符串是否已suffix结尾
  • boolean replace(old,new)替换字符串中的字符,把old改成new,返回替换后的字符串
  • String[ ] split(String)拆分字符串
  • static String join(分隔符,多个字符串)把多个字符串以分隔符拼接到一起
  • static String format(String 格式字串,参数列表)把参数列表中的数据填充到格式字串中
  1. String构造器的应用
  • new String(char[ ])把char[ ]的各个元素连接在一起形成一个字符串
  • new String(byte[ ],String charsetName)以特定的字符编码(UTF-8,GBK,…)吧byte[ ]解码成字符串
  • byte[ ] getBytes (String charesetName) 可以把一个字符串编码成byte[ ]
  1. String和基本数据类型的转换
  • int->String : String.valueOf(int)
  • String->int:integer.parseInt(String)

StringBuffer

String具有不可变性,在平凡对其进行操作(例如拼接)时效率低下;StringBuffer是字符串缓存类,他是可变的,它较完美的解决了频率问题。

常用方法:

  • append()追加
  • insert()插入
  • delet()删除
  • replace()替换
  • reverse()翻转
  • toString()

StringBuilder

StringBuilder称为字符串构建器, 它和StringBuffer是两兄弟, 由于它是非线程安 全的类, 所以它的效率要更高于StringBuffer.

字符串MD5加密

MD5是一种消息摘要算法, 广泛应用于密码加密, 支付业务信息加密等场合.

1 private static char[] HEX =="0123456789ABCDEF".toCharArray();
2 
3  public static String encrypt(String original) { 
4  		StringBuffer sb = new StringBuffer(); 
5  		// 给源字符串撒把盐 ( 添加干扰项, 更难破解 ) 
6  		original += "a1957#heybaby!"; 
7  		// 把源字符串编码为byte[] 
8  		byte[] bytes = original.getBytes(); 
9  		try { 
10  		// 通过MD5算法进行计算, 得到新的byte[] (改头换面) 
11  		MessageDigest digest = MessageDigest.getInstance("MD5"); 
12  		bytes = digest.digest(bytes); 
13  		for (int i = 0; i < bytes.length; i++) { 
14  		// 1个字节转换为2个16进制字符 
15  		sb.append(String.format("%02X", bytes[i])); 
16  		// sb.append(hex[bytes[i] >> 4 & 0x0F]); // 把高4位转换为1个十六进制 
17  		// sb.append(hex[bytes[i] & 0x0F]); // 把低4位转换为1个十六进制 
18  		} 
19  		original = sb.toString(); 
20  	} catch (NoSuchAlgorithmException e) { 
21 			 e.printStackTrace(); 
22 		} 
23  		return original; 
24  }

要注意的是:

1.MessageDigest类在java.security包下 
2.它是抽象类, 不能直接new, 要调用getInstance()方法, 传入算法 (algorithm)名称 
3.它的核心方法是digest(), 如果是MD5算法, 得到的是16个字节的byte[],  业界通常把这个数组的每个字节转换为2个十六进制数 ( 高4位, 低4位 ) 作为密 文. 
4.为增强破解难度, 通常加密前先加盐值(salt) , 再循环加密N次, 得到终 密文.

正则表达式

正则表达式可以实现对字符串的效验,搜索,提取,替换。

^  				匹配一个字符串的开始  
$  				匹配一个字串的结尾 
[ a­-z ]   		表示匹配一个范围内的字符 
[^a­z ]   		表示匹配一个范围外的字符 
\d   			匹配一个数字 
\D   			匹配一个非数字 
\w   			匹配一个[ a-­z A­-Z 0-­9_ ]范围内的字符 
\W  		 	反之 .
.				匹配除换行外的一个任意字符 
\s   			匹配空白字符 
\S   			反之
{n, m}  		匹配前面的字符n­m次 
{n, }   		匹配前面的字符至少n次 
{n }   			匹配前面的字符n次
*   			任意次 
+   			至少1次 
?   			0或1次

正则表达式在JAVA中的使用

java.util.regex.Pattern类用于创建正则表达式对象, 也称为模式:

Pattern pattern = Pattern.compile("\d+");

java.util.regex.Matcher类用于执行正则匹配, 我们把Matcher称为匹配器:

Matcher matcher = pattern.matcher(输入字符串);

调用Matcher的各种方法进行全值匹配、部分查找、替换等操作:

  • Boolean matches()对输入字符串进行全值匹配,判断其是否匹配整个正则表达式,常用于字符串校验
  • boolean find()对输入字符串进行部分查找,没查找到一个匹配项,兼职存在group中,用group()获取
  • String group()用于获取匹配过程中保存在matcher对象中的匹配项
    • 如果配合find()使用, find一次, group()一次
    • 如果配合matches()使用, group()获取的是区配过程中存 储到matcher的各个捕获分组的值

全值匹配

system.out.println(matcher.matches());

字符串部分查找
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

System和Runtime

System是系统类, 它提供了一组API用于系统输出, 输入, 环境参数(property)的访 问, 以及调用垃圾收集器(gc), 以及加载其它语言编写的函数库.

  • getProperty() // 用于获取系统属性
  • currentTimeMills() // 获取当前时间的毫秒表示形式
  • gc() // 唤醒GC
  • load() // 载入本地库 (native library) ( *.dll )
  • out
  • err
  • in

Runtime类运行时类, 它封装了java程序运行时的信息, 通过Runtime类也可以调用外 部程序.
每个java程序在运行时都有不同的Runtime.
Runtime不能自己创建, 只能获取.
通过Runtime类的exec()方法可以调用外部命令/程序, 例如执行windows系统的bat脚 本或linux系统的sh脚本.

Runtime.getRuntime().exec(“notepad”)

gc是java的垃圾收集器 ( Garbage Collector ) , 它运行在JVM守护线程中, 它负 责回收无用的变量及对象, 释放内存空间. 在JAVA中, GC的工作是自动进行的, 程序员 通常不用插手. System.gc()可以立即唤醒GC起来工作.

GC在回收一个对象时, 会调用对象的finalize()方法, 这个方法也称为"析构函数".

基本类型的包装类

  • byte -­ Byte
  • short ­ - Short
  • int ­- Integer
    • parseInt(String) : int
    • getInteger(String) : Integer
    • toHexString()
  • long ­ - Long
  • float -­ Float
  • double -­ Double
    • parseDouble(String) : double
    • doubleValue() : double
  • char ­- Character
    • isDigit() 是数字
    • isLetter() 是字母
    • isLetterOrDigit() 是字母或数字
    • isSpace() 是空格
    • isWhitespace() 是空白字符
  • boolean -­ Boolean
    • parseBoolean(String) : boolean

注意

  1. 把string转换成number时, 可能抛出NumberFormatException
    • string为null
    • string的值不符合number的格式, 如: “1009UR6”
  2. null和非"true"的字符串都可被转换成Boolean的false

Math类

  • random() 随机小数
  • round() 四舍五入
  • ceil() 向上取整
  • floor() 向下取整
  • pow() 求幂值
  • sqrt() 开平方根
  • abs() 绝对值
1 Math.ceil(5.1) // 6.0 
2 Math.floor(5.9) // 5.0 
3 Math.ceil(‐5.1) // ‐5.0 
4 Math.floor(‐5.1) // ‐6.0
5 Math.sqrt(9) // 3.0 
6 Math.pow(9, 2) // 81.0 
7 Math.pow(9, 1.0/2) // 3.0 
8 Math.pow(27, 1.0/3) // 3.0

随机处理

  • Math.random()
  • java.util.random类
    • nextInt(bound) 生成0-bound之间的随机数
  • UUID
    • randomUUID()生成32位的随机字符串,全局唯一

BigInteger和BigDecimal

常用的Long,Double有两个问题

  1. 表达范围在某些特殊情况下不够
  2. 运算时产生误差,如 0.05 + 0.01 -> 0.600000005

在货币金融领域, 通常使用BigDecimal或BigInteger类来替代Double , Long 以BigDecimal为例, 它有如下主要方法:

  • .BigDecimal(String)
  • .add(BigDecimal)
  • .subtract(BigDecimal)
  • .multiply(BigDecimal)
  • .divide(BigDecimal)
  • .remainder(BigDecimal)

注意: 构造器参数选择String

日期和时间

日期和时间的本质是一个整数 , 自1970­1­1 0:0:0.000以来的毫秒数.
例如:
System.currentTimeMillis()

但是, 这个数字不便于阅读和理解, 所以日期日间可以表达成如下形式:

yyyy­MM­dd hh:mm:ss

Java中用Date或Calendar来表示一个日期时间对象.

Date封装了time(毫秒) , 同时提供了一系列构造器, getter, setter, 用于构造或 操作日期时间对象的年月日时分秒,工作日 . . .
year ­- 实际年份 ­- 1900
month -­ 0 - ­11
date -­ 日, 1 - ­31
day ­- 工作日 ( 0(Sunday) ­ 6 )
hours
minuts
seconds

Date类型和String类型可以相互转换, 利用SimpleDateFormat类:

  • format(Date) : String
  • parse(String) : Date

在这里插入图片描述

Calendar类对日期和时间进行了重新设计:

SUNDAY ( 1 ) ­ SATURDAY ( 7 )

1 // 当前日期和时间 
2 Calendar calendar = Calendar.getInstance() 
3 // 获得某一字段(YEAR,MONTH,DATE...)的值 
4 int year = calendar.get(Calendar.YEAR) 
5 // 设置某一字段的值 
6 calendar.set(Calendar.YEAR, 2019) 
7 // 转换为Date型 
8 Date date = calendar.getTime()
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值