Java常用类----思维导图
下载地址: https://download.csdn.net/download/q863672107/20016471
以下是自动转换的MakeDown文本
常用类
字符串相关API
String类
-
概述
-
String是个final类, 代表不可变的字符序列。
-
不可变性体现
- 当对字符串重新赋值时, 需要重新指定内存区域赋值, 不能修改原有的value[ ]
- 当对现有字符串进行连接操作时, 也需要重新指定内存区域赋值,
- 当调用String的replace()方法替换指定字符或字符串时, 也需要重新指定内存区域
-
-
字符串的字符内容是存储在字符数组中的
private final char value[ ] -
通过赋值创建String对象, 其值声明在字符串常量池中, 池中不会创建内容重复的字符串
-
实现了Serializable接口, 表示字符串是支持序列化的
-
实现了Comparable接口, 表示字符串可以比较大小
-
-
创建
- 字面量直接赋值
通过字面量方式创建的String对象, 其值保存在字符串常量池中, 栈中保存地址值, 且字符串常量池中不会重复创建内容相同的字符串, 实现共享, 节省资源。
-
构造器
通过构造器创建的String对象都存储在堆内存中, 并将地址值保存在栈中
- new String()
- new String(String original)
- new String(char[] a)
- new String(char[] a,int startIndex, int count)
-
常用方法
-
获取
-
int length()
-
char charAt(int index)
- 返回指定索引处的字符
-
char[] toCharArray()
- 将字符串转换为字符数组
-
int indexOf(String str)
- 返回指定子串在此字符串中第一次出现处的索引
-
int indexOf(String str, int fromIndex)
- 返回指定子串在此字符串中第一次出现处的索引, 从fromIndex开始找
-
int lastIndexOf(String str)
- 返回指定字符串在此字符串中最后出现处的索引
-
int lastIndexOf(String str, int fromIndex)
- 返回指定子串在此字符串最后出现处的索引,
从fromIndex开始反向搜索
- 返回指定子串在此字符串最后出现处的索引,
-
-
转换
-
String toLowerCase()
-
String toUpperCase()
-
String trim()
- 返回字符串的副本, 忽略前导和尾部空白
-
String concat(String str)
-
String substring(int beginIndex)
- 返回一个新字符串, 它是此字符串从beginIndex开始截取到最后的子串
-
String substring(int beginIndex, int endIndex)
- 返回一个新字符串, 它是此字符串从beginIndex开始,截取到endIndex的子串 (左闭右开区间)
-
-
判断
-
boolean isEmpty()
-
boolean equals(Object obj)
-
boolean equalsIgnoreCase(String anotherString)
-
int compareTo(String anotherString)
-
比较两个字符串的大小
- 涉及字符串排序
-
-
boolean endsWith(String suffix)
- 判断此字符串是否以指定的后缀结束
-
boolean startsWith(String prefix)
- 判断此字符串是否以指定的前缀开始
-
bolean startsWith(String prefix, int toffset)
- 测试此字符串从指定索引开始的子串是否以指定的前缀开始
-
boolean contains(CharSequence s)
- 判断当前字符串是否包含指定的char值序列
-
-
替换
-
String replace(char oldChar, char newChar)
- 返回一个新的字符串, 它是通过用指定字符替换词字符串中出现的所有oldChar字符得到的
-
String replace(CharSequence target, CharSequence repacement)
- 使用指定的字面值序列替换此字符串所有匹配字面值目的标序列的子串
-
String replaceAll(String regex, String replacement)
- 使用给定的replacement替换此字符串所有匹配给定的正则表达式的子串
-
String replaceFirst(String regex, String replacement)
- 使用给定的replacement替换此字符串给定的正则表达式的第一个子串
-
-
匹配
-
boolean matches(String regex)
- 判断此字符串是否匹配给定的正则表达式
-
-
拆分
-
String[] split(String regex)
- 根据给定正则表达式的匹配拆分此字符串
-
String split(String regex, int limit)
- 根据匹配给定的正则表达式来拆分此字符串, 最多不超过limit个, 如果超过了, 剩下的全部都放到最后一个元素中。
-
-
StringBuffer
-
概述
- 可变的字符序列
- 线程安全的, 效率偏低
-
构造器
-
new StringBuffer()
-
new StringBuffer(String str)
- 注意: 通过字符串对象构造时, 会初始化容量为str.length()+16, 如果str为null, 空指针异常
-
new StringBuffer(int Capacity)
- 指定初始化容量, 推荐使用
-
-
常用方法
-
增
-
StringBuffer append(xxx)
- 提供了很多的append()方法, 用于字符串拼接
- 注意, 如果拼接对象为null, 则拼接一个"null"
-
StringBuffer insert(int offset, xxx)
- 在指定位置插入xxx
-
-
删
-
StringBuffer delete(int start, int end)
- 删除指定位置的内容
-
-
改
-
StringBuffer replace(it start, int end, String str)
- 把[start,end)位置替换为str
-
void setCharAt(int n, char ch)
- 把n位置的字符替换为ch
-
-
查
- char charAt(int n)
-
StringBuffer reverse()
-
将当前字符串序列逆转
- –> 注意是修改当前对象本身
-
-
StringBuilder
-
概述
- 可变的字符序列 JDK5新增
- 线程不安全的, 效率高
regEX(会用)
正则表达式
regular expression
-
语法结构
- ^([ ]{ })([ ]{ })&
-
特殊字符
-
元字符
-
^
- 匹配字符串的开始(边界)
-
&
- 匹配字符串的结束(边界)
-
.(点)
- 匹配除换行符外的任意字符
-
\w
-
匹配字母数字下划线
-
[A-Za-z0-9_]
- 反义\W
-
-
-
\d
-
匹配数字
-
[0-9]
- 反义\D
-
-
-
\s
-
匹配任意空白字符
- 反义\S
-
-
\b
-
匹配单词的边界(开始/结束)
- 反义\B
-
-
[aeiou]
[a,bc,d]和[abcd]是一个意思
-
自定义
- 反义[^aeiou]
-
-
-
匹配次数
-
*(星号)
- 0或多次
-
- 1次或多次
-
?
- 0次或1次
-
{n}
- 精准匹配n次
-
{n, }
- 至少匹配n次
-
{m,n}
-
匹配[m,n]次
- 包含m次, 包含n次
-
-
-
转义字符
-
对正则表达式里的特殊字符, 如果要代表字符本身, 就需要同 \ 来取消这些字符的特殊意义, 如(
-
需要注意的是, Java编译器也会对字符串里的 \ 进行一次解释, 所以在字符串中还要再加一个 \
- Java中正则表达式反斜杠要用\\表示
-
-
懒惰匹配
- ?
-
-
相关方法
-
- 见String类
-
Pattern静态方法
- static boolean matches(String regex, CharSequence input)
-
Matcher类
-
matches()
private static void matcherTest1() {
String str = “acbd”;
String regex = “[a,bc,d]{4}”;//跟[abcd一样]//创建Pattern对象 Pattern pattern = Pattern.compile(regex); //创建匹配器对象 Matcher matcher = pattern.matcher(str); System.out.println(matcher.matches());//true //静态方法 System.out.println(Pattern.matches(regex, str));
}
- Pattern.compile(String regex)获取pattern对象
- pattern.matcher(String str) 获取matcher对象
-
分组
private static void matcherTest2() {
String string = “7q4da8sd48@sina.com”;
String regex = “(\w+)@(\w+\.com)”;Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(string); if (matcher.matches()){ System.out.println("count:"+matcher.groupCount()); System.out.println(matcher.group(1)); System.out.println(matcher.group(2)); }
}
-
-
去重
-
str.replaceAll("(.)\1+", “$1”)
- . 表示匹配任意字符, (.)为第一个捕获组, \1表示对第一个捕获组的引用, \1+表示第一个捕获组重复1到多次
- "(.)\1+"连起来表示: (.)匹配到的任意字符连续重复2到多次
- 将连续重复的字符全部替换为 $1 , $1 也表示对
第一个捕获组的引用, 即全部替换为单个字符 - 加上replaceAll()底层的循环, 实现去重
-
-
JDK8之前的日期时间API
在JDK1.1时引入了Calendar类, 替换了Date类的大部分方法, Date类的大部分方法已过时
* 世界时间的主要标准(了解)
-
GMT
-
Greenwich Mean Time
- 格林威治时间
-
-
UTC
-
Coordinated Universal Time
- 世界标准时间
-
-
CST
CST同时可以代表如下 4 个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
-
我们一般指China Standard Time GMT+08:00
- 中国标准时间(北京时间)
-
System静态方法
-
public static long currentTimeMillis()
返回当前时间与1970年01月01日 0:00:00 之间以毫秒为单位的时间差 ----> 称为时间戳
- 此方法适用于计算时间差
Date类
-
java.util.Date
-
构造器
-
new Date()
- 创建当前时间的Date对象, 通过System.currentTimeMillils()
-
new Date(long date)
- 通过时间戳(毫秒数)创建Date对象
-
-
方法
-
toString()
- 显示当前的时间:
Wed Jun 30 14:26:52 CST 2021
- 显示当前的时间:
-
getTime()
- 获取当前Date对象对应的时间戳
-
-
-
java.sql.Date(子类)
对应数据库中日期类型的变量-
构造器
- new Date(long Date)
-
方法
-
toString()
- 重写的方法, 只显示日期: 2021-06-30
-
-
SimpleDateForma类
-
功能
- 对日期Date类的格式化和解析
-
构造
-
new SimpleDateFormat()
- 默认解析格式"21-7-1 下午8:34"
-
new SimpleDateFormat(String pattern)
- 一般使用pattern: “yyyy-MM-dd HH:mm:ss”
-
-
格式化
-
Date–>String
- String format(Date date)
-
-
解析
解析错误会报 java.text.ParseException
-
String–>Date
- Date parse(String s)
-
Calender类
-
实例化
抽象类-
子类构造
- GregorianCalendar
-
获取子类对象
- Calendar.getInstance()
-
-
常用方法
-
int get(int field)
-
例如: get(Calendar.DAY_OF_WEEK)
- 获取月份时, 一月是0
获取星期时, 周日是1
- 获取月份时, 一月是0
-
-
set方法
- void set(int field, int value)
- void set(int year, int month, int date)
- void set(int year, int month, int date, int hourOfDay, int minute, int second)
-
add(int field, int amount)
-
Date getTime()
- 转换为Date对象
-
setTime(Date date)
- 从Date对象转换为Calendar
-
JDK8新增日期时间API
因为Calendar类仍然不能满足需求, JDK8中又新增了日期时间的API
可变性: 像日期时间这样的类应该是不可变的 (final)
偏移性: Date中的年份都是从1900开始的, 而月份都是从0开始
Date date = new Date(2021 - 1900, 7 - 1, 1);
格式化: 格式化只对Date有用, Calendar则不行
此外, 它们也不是线程安全的, 不能处理闰秒等
LocalDateTime(常用)
-
实例化
-
LocalDateTime.now()
-
of()指定年月日时分秒, 没有偏移量
- LocalDateTime.of(int year, Month month, int dayOfMonth, int hour, int minute, int second)
-
-
丰富的get()方法
- 例如 : int getDayOfWeek()
-
with()方法
- LocalDateTime withYear(int year)
-
plus()方法
- LocalDateTime plusDays(long days)
-
minus()方法
- 减时间, 同上
* LocalDate
-
年月日
- 同上
* LocalTime
-
时分秒
- 同上
Instant
时间戳
-
实例化
-
Instant.now()
- UTC时间
-
Instant.atOffset(ZoneOffset.ofHours(8))(常用)
- 偏移获得CST对应的对象
-
Instant.ofEpochMilli(long epochMilli)
- 通过给定毫秒数获取实例
-
-
long toEpochMilli()
- 返回自1970-01-01 00:00:00 的毫秒数
DateTimeFormatter
-
实例化
-
自定义(常用)
- ofPattern(String pattern)
-
-
预定义标准格式
- 静态常量对象
-
-
-
本地化相关格式
- ofLocalizedDateTime(FarmatStyle.LONG)
或MEDIUM或SHORT - ofLocalizedDate(FarmatStyle.FULL)
或LONG或MEDIUM或SHORT
- ofLocalizedDateTime(FarmatStyle.LONG)
-
-
-
格式化
- String format(TemporalAccessor temporal)
-
解析
- TemporalAccessor parse(CharSequence text)
其他类
-
Duration
-
用于计算两个时间间隔
- static Duration between(Temporal startInclusive, Temporal endExclusive)
- long getSeconds()
- long getNano()
- long toMillis()
-
-
Period
- 用于计算两个日期间隔
-
Clock
-
ZoneId
- 时区
-
ZonedDateTime
-
TemporalAdjuster
- 时间校正器
-
TemporalAdjusters
包装类
包装类 基本数据类型之间的自动装箱/拆箱
包装类没有无参构造, 其对象都是不可变对象, 其值都是final修饰, 一旦被赋值, 不可修改
- 每次以字面量对其重新赋值相当于新建一个对象
了解Integer类的缓存IntegerCache, 静态加载一个Integer cache[], 缓存了-127~128之间的数
掌握包装类和字符创之间的类型转换
-
字符串转换成包装类
- parseXxx(String str)
-
基本数据类型/包装类转换成字符串
-
String.valueOf()
-
字符串拼接 + “”
-
包装类#toString()
- 可能空指针
-
Character类的一些判断方法
- static boolean isDigit(ch)
- static boolean isLetter(ch)
- static boolean isLowerCase(char ch)
- static boolean isUpperCase(char ch)
BigInteger与BigDecimal
BigInteger
- 可以表示不可变的, 任意精度的整数
- Long的局限性, 最大表示263-1≈9.22*1018
- new BigInteger(String val)
BigDecimal
- 支持不可变的, 任意精度的有符号十进制定点数
- 商业运算中, 要求数字精度比较高
- new BigDecimal(String val)
- new BigDecimal(double val)
Math类
常量
- Math.PI
常用方法
-
static double random()
- 返回 [0,1) 之间的随机数
-
static double pow(double a, double b)
-
static double sqrt(double a)
-
static double ceil(double a)
-
static doube floor(double a)
-
static xxx round(xxx a)
-
static xxx abs(xxx a)
-
static xxx max(xxx a, xxx b)
-
static xxx min(xxx a, xxx b)
-
toDegrees(double angrad)
- 弧度–>角度
-
toRadiams(double angdeg)
- 角度–>弧度
System类
成员属性
-
int
- 标准输入流
-
out
- 标准输出流
-
err
- 标准错误信息输出流
常用方法
-
static native long currentTimeMills()
-
static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length)
- 复制数组的本地方法
-
static void exit(int status)
- 退出当前程序, status为0代表正常退出,
非零代表异常退出
- 退出当前程序, status为0代表正常退出,
-
static void gc()
- 请求系统进行垃圾回收
-
static String getProperty(String key)
- 获取系统属性值,user.name, java.version, user.dir等
Java比较器
两者对比:
Comparable是需要比较的对象 的类直接实现的接口, 保证Comparable接口实现类的对象在任何位置都可以比较大小
Comparator属于第三方比较器, 临时性的比较。
Comparable接口
自然排序
-
重写compareTo(T t)方法
支持泛型, 否则为Object对象, , 需向下转型- 正序 : this > t, 返回正整数
this < t, 返回负整数, 相等返回 零
- 正序 : this > t, 返回正整数
Comparator接口
定制排序
当元素的类型没有实现conparable接口而又不方便修改代码, 或者实现了Comparable接口, 而又需要采取其他的排序规则进行操作, 就可以使用Comparator接口的对象(第三方比较器)来实现排序。
可以将Comparator对象传递给sort方法, 如Collections.sort或Arrays.sort, 从而允许在排序顺序上实现精确控制。
还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序, 或者为那些没有自然顺序的对象collection提供排序。
-
重写compare(T t1, T t2)方法
支持泛型, 否则为Object对象, 需向下转型- 正序 : t1 > t2, 返回正整数
t1 < t2, 返回负整数, 相等返回 零
- 正序 : t1 > t2, 返回正整数
乱码
编码集和解码集不一致
String
Char[ ]
byte[ ]
面试题
String s = new String(“abc”);
在内存中创建了几个对象
-
- 一个是在堆空间中通过new创建的String类对象
- 2.另一个是在字符串常量池中创建的 char[]数组对象, 如果已有则不会重复创建
String s1 = “HelloWorld”,
s2 = “Hello” + “World”;
System.out.println(s1 == s2);
-
true
- 字面值拼接或直接赋值创建的字符串都是直接在字符串常量池中创建
String s1 = “HelloWorld”,
s2 = “Hello”, s3 = s2 + “World”;
System.out.println(s1 == s3);
-
false
- 有变量参与字符串拼接的, 都不是在字符串常量池中直接创建 s2 += “world”; s1 == s2 ? false
final String s2 = “Hello”;
String s1 = “HelloWorld”, s3 = s2 + “World”;
System.out.println(s1 == s3);
-
true
- final修饰的String对象是常量, 常量跟常量的拼接在常量池。
String#intern
public native String intern();
- 返回字符串在常量池中的字符串对象
String s1 = “HelloWorld”,
s2 = s1 + “World”;
s2 = s2.intern():
System.out.println(s1 == s2);
- true
String和StringBuffer/StringBuilder
有什么区别
相同
- 都实现了Serializable, CharSequence接口, 都是final类(考虑到性能和安全性)
- 底层都使用char[] 数组存储数据
不同
- String类还实现了Comparable接口, 可以通过compareTo方法进行比较
- String是不可变的字符串序列, StringBuffer和StringBuilder是可变的字符串序列
- StringBuffer是线程安全的, 效率较低
StringBuilder是线程不安全的, 效率高 -
- StringBuffer调用toString会使用缓存区的toStringCache拷贝一次字符数组, 再构造字符串。这个方法也是线程同步的。
而StringBuilder直接通过字符数组构造字符串。
- StringBuffer调用toString会使用缓存区的toStringCache拷贝一次字符数组, 再构造字符串。这个方法也是线程同步的。
源码分析
StringBuffer/StringBuilder 字符串缓冲区
new StringBuffer() 底层创建一个长度是16的字符数组
new StringBuffer(String str) 底层创建长度 str.length+16
扩容问题: 如果要添加的数据底层存不下, 那就需要扩容底层的数组, 一般情况下, 扩容为原来的容量的2倍+2, 将原数组内容复制到新数组中
开发中, 建议使用StringBuffer(int Capacity) 或 StringBuilder(int Capacity) 手动指定初始化容量大小, 提高效率
面试题
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());//4
System.out.println(sb);//null 错误 “null”
StringBuffer sb1 = new StringBuffer(str);//空指针异常
System.out.println(sb1);//null 错误