常用类与基础API
- 一、String类的使用
- 1、类的声明
- 2、内部声明的属性:
- 3.字符串常量的存储位置
- 4.String不可变性的理解
- 5.String实例化的两种方式
- 6.String的连接操作:+
- 7.String当中常用的构造器和方法
- 二、StringBuffer与StringBuilder
- 1、三个类的对比:String StringBuffer StrngBuilder
- 2、StringBuffer/StringBuilder的可变性分析(源码分析)
- 3.源码启示:
- 4.StringBuffer/StringBuilder的常用方法
- 5.对比三者的执行效率
- 三、时间dateAPI
- 1.JDK8之前的API:
- 2.两个Date类
- 3.SimpleDateFormat类:用于日期时间格式化和解析
- 4.Calendar类(日历类):抽象类
- 5.JDK8中的API:
- 6.各个格式之间的互相转换
- 四、JAVA比较器
- 1.实现对象的排序,可以考虑两种方法:自然排序、定制排序
- 2.方式一:实现Comparable接口的方式
- 3.方式二、实现Comparato接口的方式
- 五、其他API
- 1.System类
- 2.Runtime类
- 3.Math类
- 4.BigInteger类和BigDecimal类
- 5.Random类
一、String类的使用
1、类的声明
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
- final:不可被继承
- Serializable:可序列化的接口。凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输。
- Comparable:凡是 实现此接口的类其对象都可以比较大小。
- CharSequence:字符序列
2、内部声明的属性:
- private final char value[]; 存储字符串数据的容器 (jdk8中)
- private final byte[] value; 存储字符串数据的容器 (jdk9及以后)
3.字符串常量的存储位置
- 字符串常量都存储在字符串常量池中(StringTable)
- 字符串常量池不允许存放两个相同的字符串常量。
- 字符串常量池,在不同的jdk版本中,存放的位置不同。
jdk7之前:字符串常量池存放在方法区
jdk7及之后:字符串常量池存放在堆空间。
4.String不可变性的理解
- 当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改
- 当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能在原有位置修改。
- 当调用字符串的replace()替换现有的某个字符,需要重新开辟空间保存修改以后的字符串
5.String实例化的两种方式
- 字面量方式:
String s1 = "abc";
- new对象方式:
String s1 = new String("abc");
6.String的连接操作:+
- 情况一、常量+常量:结果仍然存储在字符常量池中。
- 常量+变量 或 变量+变量:都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址
- 调用字符串的intern():返回的是字符串常量池中字面量的地址。
7.String当中常用的构造器和方法
- 构造器
public String():创建新的String对象,以使其表示空字符序列。
public String(String original):初始化一个新创建的String对象
public String(char[] value):通过当前参数中的字符数组来构造新的String
public String(char[] value , int offset , int count):通过字符串的一部分来构造新的String.
public String(byte[] bytes):通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String
public String(byte[] bytes , String charsetName):通过使用指定的字符集解码当前参数中的字节数组来构造新的String
- 常用方法
1.boolean isEmpty():字符串是否为空
2.int length():返回字符串的长度
3.String concat(xxx):拼接
4.boolean equals(Object obj):比较字符串是否相等,区分大小写
5.boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
6.int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
7.int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
8.String toLowerCase():将字符串中大写字母转换为小写
9.String toUpperCase():将字符串中小写字母转换为大写
10.String trim():去掉字符串前后空白字符
11.public String intern():结果在常量池中共享
- 查找方法
1.boolean contains(xx):是否包含xx
2.int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1
3.int indexOf(String str,int fromIndex):返回指定子字符串在此字符串中第一次出现的索引,从指定的索引开始
4.int lastindexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1
5.int lastIndexOf(String str , int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索.
- 截取
1.String Substring(int beginIndex):返回一个新的字符串,他是此字符串的从beginIndex开始截取的
2.String Substring(int beginIndex , int endIndex):返回一个新的字符串,他是此字符串的从beginIndex开始截取至endIndex
二、StringBuffer与StringBuilder
1、三个类的对比:String StringBuffer StrngBuilder
- String :不可变的字符序列
- StringBuffer :可变的字符序列 jdk1.0声明,线程安全;效率低
- StrngBuilder:可变的字符序列 jdk5.0声明,线程不安全;效率高
2、StringBuffer/StringBuilder的可变性分析(源码分析)
- 针对于StringBuilder来说:
内部的属性有:
1.char[] value; //实际存储的字符序列
2.int count; //实际存储的字符个数
3.构造器:
StringBuilder的空构造器会提供一个16长度的字符数组
例:StringBuilder sBuilder1 = new StringBuilder(); // char value = new char[16];
StringBuilder带参的构造器会提供一个16 + 实参长度的字符数组
例:StringBuilder sBuilder1 = new StringBuilder(“abc”); // char value = new char[16 + 3];
4.方法:
append(String value); 在字符序列尾部添加一个字符
注意:使用append方法不断的添加…一旦count要超过value.length时,就需要扩容,默认扩容为原有容量的2倍+2.并将原有value数组中的元素复制到新的数组中。
3.源码启示:
如果开发中需要频繁的针对于字符串进行增删改等操作,建议使用StringBuffer或StringBuilder替换String.因为使用String效率低
如果开发中,不涉及线程安全问题,建议使用StringBuilder替代StringBuffer,因为使用StringBuilder效率高
如果开发中大体确定要操作的字符数组的个数,建议使用带int capacity参数的构造器。因为可以避免底层多次扩容操作,性能更高。
4.StringBuffer/StringBuilder的常用方法
1.StringBuffer append(xx):用于进行字符串追加的方式拼接
2.StringBuffer delete(int start , int end):删除[start , end)之间字符
3.StringBuffer deleteCharAt(int index):删除[index]位置字符
4.StringBuffer replace(int start , int end , String str):替换[start , end)范围的字符序列
5.void setCharAt(int index , char c):替换[index]位置字符
6.char charAt(int index):查找指定index位置上的字符
7.StringBuffer insert(int index , xx):在[index]位置插入xx
8.int length():返回存储的字符数据的长度
9.StringBuffer reverse():反转
5.对比三者的执行效率
- 效率从高到底排列
StringBuilder > StringBuffer > String
三、时间dateAPI
1.JDK8之前的API:
- System类的currentTimeMillis()
获取当前时间对应的毫秒数,long类型,时间戳
当前时间与1970年1月1日0时0分0秒之间的毫秒数
常用来计算时间差
2.两个Date类
1.java.util.Date下的Date类
两个构造器:Date(); Date(long xx);创建一个基于时间戳的Date实例
两个方法的使用:toString():显示创建实例的时间 long getTime()获得时间戳毫秒数
2.java.sql.Date下的Date类
构造器:Date(long xx):只能放时间戳创造实例,没有空参构造器。
3.SimpleDateFormat类:用于日期时间格式化和解析
- 格式化:日期–>字符串
格式化方法:format(Date date):按照默认格式格式化日期
注:想按照指定字符串格式格式则需要在new时指定好格式
- 解析:字符串–>日期
解析方法:parse(“字符串”):还原回Date类型的实例
注:方法内的字符串的格式必须和new时指定的格式相同
4.Calendar类(日历类):抽象类
- 实例化:由于Calendar是一个抽象类,所以我们需要创建其之类的实例,这里我们通过Calendar的静态方法getInstance()即可获取其实例
- 常用方法:
1.get(int field);
2.set(int field);
3.add(int field , xx)
4.getTime();
5.setTime();
5.JDK8中的API:
- 为什么要有新的DateAPI?
可变性:像日期和时间这样的类应该是不可变的
偏移性:Date中的年份是从1900开始的,而月份都从0开始
格式化:格式化只对Date有用,Calenndar则不行
此外,他们也不是线程安全的,不能处理闰秒
- LocalDate,LocalTime,LocalDateTime
实例化:
now();获取当前日期和时间对应的实例
of():获取指定的日期、时间对应的实例
方法:
get() / withXxx() / plusXxx / minusXxx()…
- Instant:瞬时 ---->类似于Date
实例化:now() ofEpochMilli(Long xxx) 基于毫秒数创建实例
方法:toEpochMilli()获取毫秒数
- DateTimeFormatter ----> 类似于SimpleDateFormat
用于格式化和解析LocalDate,LocalTime,LocalDateTime
自定义格式:ofPattern(“yyyy-MM-dd hh:mm:ss”)
格式化:日期 \ 时间—>字符串 format(实例)
解析:字符串 -----> 日期、时间 parse(“字符串”)
注意:parse方法返回值是个父类接口TemporalAccessor 需要使用要转化的类型调用静态方法from(TemporalAccessor实例)转化为想要的Date类型
6.各个格式之间的互相转换
四、JAVA比较器
1.实现对象的排序,可以考虑两种方法:自然排序、定制排序
- 自然排序指默认排序方法
- 定制排序指按照需求进行制定排序
2.方式一:实现Comparable接口的方式
- 实现步骤:
具体的类A实现Comparable接口
重写Comparable接口中的compareTo(Object obj)方法,在此方法中指明比较类A的对象的大小的标准
创建A的多个实例,进行大小的比较或排序
3.方式二、实现Comparato接口的方式
- 实现步骤
创建一个实现了Comparator接口的实现类A
实现类A要求重写Comparator接口中的抽象方法compare(Object o1 , Object o2),在此方法中指明要比较大小的对象的大小关系
创建此实现类的对象传入到相关方法的参数位置即可
五、其他API
1.System类
- 属性:out、in、err
- 方法:currentTimeMillis() / gc() / exit(int status) / getProperty(String property)
2.Runtime类
- 对应着Java进程的内存使用的运行时环境,是单例
3.Math类
- 凡是与数学运算相关的操作,大家可以在此类中国找相关的方法即可
4.BigInteger类和BigDecimal类
- BigInteger:可以表示任意长度的整数
- BigDecimal:可以表示任意精度的浮点数
5.Random类
- 获取指定范围的随机整数:nextInt(int bound) 表示 [0 , bound)之间取随机数