JAVA SE自学 基础篇 常用类
目标
- String, StringBuffer, StringBuilder
- 使用MD5进行字符串加密
- 使用正则表达式校验及提取字符串
- System, Runtime 8大基本类型的包装类
- 使用Math进行数学运算
- 随机处理
- 使用BigDecimal和BigInteger进行货币运算
- 使用Date, Calendar,== SimpleDateFormat==进行日期处理
字符串
- 常量池:为了提高效率 , Java为String类型提供了常量池 , 如果不用new关键字 创建String对象时, 字符串的存储地点为常量池, 每次使用""声明一个字符串时, 都会 检查常量池. 可以把常量池理解为一个缓存区.
- 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!"这个对象并没有发 生变化.
- 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 格式字串,参数列表)把参数列表中的数据填充到格式字串中
- String构造器的应用
- new String(char[ ])把char[ ]的各个元素连接在一起形成一个字符串
- new String(byte[ ],String charsetName)以特定的字符编码(UTF-8,GBK,…)吧byte[ ]解码成字符串
- byte[ ] getBytes (String charesetName) 可以把一个字符串编码成byte[ ]
- 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 ] 表示匹配一个范围内的字符
[^az ] 表示匹配一个范围外的字符
\d 匹配一个数字
\D 匹配一个非数字
\w 匹配一个[ a-z A-Z 0-9_ ]范围内的字符
\W 反之 .
. 匹配除换行外的一个任意字符
\s 匹配空白字符
\S 反之
{n, m} 匹配前面的字符nm次
{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
注意
- 把string转换成number时, 可能抛出NumberFormatException
- string为null
- string的值不符合number的格式, 如: “1009UR6”
- 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有两个问题
- 表达范围在某些特殊情况下不够
- 运算时产生误差,如 0.05 + 0.01 -> 0.600000005
在货币金融领域, 通常使用BigDecimal或BigInteger类来替代Double , Long 以BigDecimal为例, 它有如下主要方法:
- .BigDecimal(String)
- .add(BigDecimal)
- .subtract(BigDecimal)
- .multiply(BigDecimal)
- .divide(BigDecimal)
- .remainder(BigDecimal)
注意: 构造器参数选择String
日期和时间
日期和时间的本质是一个整数 , 自197011 0:0:0.000以来的毫秒数.
例如:
System.currentTimeMillis()
但是, 这个数字不便于阅读和理解, 所以日期日间可以表达成如下形式:
yyyyMMdd 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()