Java常用类
字符串相关的类
String
- String类:代表字符串。Java程序中的所有字符串字面值都作为此类的实例实现
- String是一个final类,发表不可变得字符序列
- 字符串是常量,用啥UN噶引号引起来表示。它们的值在创建之后不能更改
- String对象的字符内容是存储在一个字符数组value[]中的
1 | public final class String |
1 | public class StringTest { |
- 字符串常量池中不会创建重复的字符串的对象,将相同字符串赋值时,会优先查找已经存在的字符串,如果存在就指向它,不存在再创建
String对象的创建
1 | String str = "hello"; |
1 | public void test2(){ |
- 面试题:String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
- 答:两个:一个是堆空间中new结构,另一个是char[]型数组对象的常量池中的数据:”abc“
1 | public void test3(){ |
- 结论:
- 常量与常量的拼接结果在常量池。且常量池不会存在相同内容的常量
- 只要其中有一个是变量,结果就在堆中
- 如果拼接的结果调用intern()方法,返回值就在常量池中
String常用方法
intlength():返回字符串的长度:return value.length
char charAt(int index):返回某索引处的字符return value[index]
boolean isEmpty():判断是否是空字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将Sttring中的所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalslgnoreCase(String anotherString):与equals方法类似,忽略大小写
String concat(String str):将指定字符串连接到此字符串的结尾。等价于用”+“
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串
String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包括)的一个子字符串
boolean endWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startWith(String prefix):测试此字符串是否以指定的前缀开始
boolean starsWith(String prefix, int toffest):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的char值序列时,返回true
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str):返回指定子字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
- String replace(cahr oldChar, char newChar):返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的
- String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
- String replaceAll(String regex, String replacement):使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串
- String replace First(String regex, String replacement):使用给定的replacement替换此字符串匹配给定的正则表达式的第一个字符串
- boolean matches(String regex):告知此字符串是否匹配给定的正则表达式
- String[] split(String regex):根据给定正则表达式的匹配拆分此字符串
- String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中
String与基本数据类型转换
字符串 => 基本数据类型、包装类
- Integer包装类的public static int parseInt(String s):可以将由“数字”字符组成的字符串转换为整型
- 类似的,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型
1
2String str = "123";
int num = Integer.parseInt(str);基本数据类型、包装类 => 字符串
- 调用String类的public String value(int n )可将int型转换为字符串
- 相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换
1
String str1 = String.valueOf(num);
String与字符数组转换
- 字符数组 => 字符串
- String类的构造器:String(char[])和String(char[], int offset, int length)分别用字符数组中的全部字符和部分字符创建字符串对象
- 字符串 => 字符数组
- public char[] to CharArray():将字符串中的全部字符存放在一个字符数组中的方法
- public void getCahrs(int srcBegin, int srcEnd, char[] dst,int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法
1 | //调用String的toCharArray()方法从String -> char[] |
1 | //String => byte[]:调用String的getBytes()方法 |
StringBuffer和StringBuilder
- String、StringBuffer、StringBuilder三者的异同?
- String:不可变的字符序列;底层使用char[]存储;
- StringBuffer:可变的字符序列;线程安全的,效率偏低;底层使用char[]存储;
- StringBuilder:可变的字符序列;JDK5.0新增,线程不安全,效率高;底层使用char[]存储;
- 源码分析:
1 | String str = new String();//new char[0] |
StringBuffer类的常用方法
- StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
- StringBuffer delete(int start, int end):删除指定位置的内容
- StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
- StringBuffer insert(int offset, xxx):在指定位置插入xxx
- StringBuffer reverse():把当前字符序列逆转
- 当append和insert时,如果原来的value数组长度不够,可扩容
- 如上这些方法支持方法链操作
- 方法链原理:
1
2
3
4public StringBuilder append(String str){
super.append(str);
return this;
}- public int indexOf(String str):返回字符串在当前StringBuffer中的位置
- public String substring(int start, int end):返回从start开始到end结束的左闭右开区间的子字符串
- public int length():返回StringBuffer长度
- public char charAt(int n ):返回索引位置的字符
- public void setCharAt(int n, char ch):将指定位置字符变成想要的字符
- 总结:
- 增:append(xxx)
- 删:delete(int start, int end)
- 改:setCharAt(int n, char ch)/replace(int start, int end, String str)
- 查:charAt(int n)
- 插:insert(int offset, xxx)
- 长度:length()
- 遍历:for()+charAt()
String、StringBuffer、StringBuilder三者的效率
- 从高到低排序:StringBuffer > StringBuffer > String
常见String算法题目
1 | package Intermediate.oftenClass.String; |
JDK8之前日期时间API
java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差,通常称为时间戳
- 此方法适用于时间差
1
2
3
4
5
6public void test1(){
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
long time = System.currentTimeMillis();
System.out.println(time);
}
//1635321191487计算世界时间的主要标准有:
UTC(Coordinated Universal Time)
GMT(Greenwich Mean Time)
CST(Central Standard Time)
java.util.Date类
- 表示特定的瞬间,精确到毫秒
- 构造器:
- Date():使用无参构造器创建的对象可以获取本地当前时间
- Date(long date):
- 常用方法
- getTime():返回自1970年1月1日 00:00:00 GMT以来此Date对象表示的毫秒数
- toString():把此Date对象转换为以下形式的String:dow mon dd hh:mm:ss zzz yyyy 其中:dow是一周中的某一天(Sun,Mon,Tue,Wed,Thu,Fri,Sat),zzz是时间标准
- 其他很多方法都过时了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50public class TimeDate {
public void test2(){
/*
java.util.Date类
|---java.sql.Date类
1.两个构造器的使用
2.两个方法的使用
>toString():显示当前年月日时分秒
>getTime():获取当前Date对象对应的毫秒数(时间戳)
3.java.sql.Date对应着数据库中的日期类型的变量
>如何实例化
>如何将java.util.Date对象转化为java.sql.Date对象
*/
//构造器1
Date date = new Date();
System.out.println(date);
System.out.println(date.toString());
System.out.println(date.getTime());
//构造器2:创建指定毫秒数的Date对象
Date date1 = new Date(1635322036032L);
System.out.println(date1.toString());
//创建java.sql.Date对象
java.sql.Date date2 = new java.sql.Date(1635322036032L);
System.out.println(date2);
//将java.util.Date对象转化为java.sql.Date对象
//情况一:
//Date date3 = new java.sql.Date(1635322036032L);
//java.sql.Date date4 = (java.sql.Date) date3;
//情况二:
Date date5 = new Date();
java.sql.Date date6 = new java.sql.Date(date5.getTime());// 直接传入时间戳
}
public void test1(){
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
long time = System.currentTimeMillis();
System.out.println(time);
}
}
java.text.SimpleDateFormat类
- Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
- 它允许进行格式化:日期 => 文本、解析:文本 => 日期
- 格式化:
- SimpleDateFormat():默认的模式和语言环境创建对象
- public SimpleDateFormat(String pattern):该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:
- public String format(Date date):方法格式化时间对象date
- 解析:
- public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期
1 | public class TimeDateTest { |
java.util.Calendar(日历)类
- Calendar是一个抽象基类,主要用于完成日期字段之间相互操作的功能
- 获取Calendar实例的方法
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器
- 一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND
- public void set(int field, int value)
- public void add(int field, ing amount)
- public final Date getTime()
- public final void setTime(Date date)
- 注意:
- 获取月份时:一月是0,二月是1,以此类推,十二月是11
- 获取星期时:周日是1,周一是2,以此类推,周六是7
1 |
|
JDK8中新日期时间API
LocalDate、LocalTime、LocalDateTime
Java8吸收了Joda-Time的精华以一个新的开始为Java创建优秀的API。新的java.time中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的Date新增了toInstant()方法,用于把Date转换成新的表示形式。这些新增的本地化时间日期API大大简化了日期时间和本地化的管理
LocalDate、LocalTime、LocalDateTime类是其中较重要的几个类,它们的实例是不可变得对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单地本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储生日,纪念日的日期
- LocalTime表示一个时间,而不是日期
- LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一
1 | /* |
瞬时:Instant
- Instant:时间线上的一个瞬间点,这可能被用来记录应用程序中的事件时间戳
- java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级
- (1ns = 10^-9s) 1秒 = 1000毫秒 = 10^6微秒 = 10^9纳秒
1 | /* |
java.time.format.DateTimeFormatter类
该类提供了三种格式化方法:
预定义的标准格式,如:
- ISO_LOCAL_DATE_TIME
- ISO_LOCAL_DATE
- IOS_LOCAL_TIME
本地化相关的格式。如:
- oflocalizedDateTime(FirnatStyle.LONG)
自定义的格式。如:
- ofPattern (“yyyy-MM-dd hh:mm:ss E”)
1 | /* |
其他时间API
zoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris。
- 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等
Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
持续时间:Duration,用于计算两个“时间”间隔
日期间隔:Period,用于计算两个“日期”间隔
TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整 到“下一个工作日”等操作。
TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。
其他的查询手册…
Java比较器
- Java实现对象排序的方式有两种:
- 自然排序:java.lang.Comparable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50package Intermediate.oftenClass.Comparre;
import org.junit.Test;
import java.util.Arrays;
public class compareTest {
/*
一、说明:Java中的对象,正常情况下,只能进行比较: == 或 != 。不能使用 > 或 < 的
但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小
如何实现?使用两个接口中的任何一个Comparable或Comparator
二、Comparable接口的使用
*/
/*
Comparable接口的使用举例: 自然排序
1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个大小对象大小的方式
2.重写compareTo()的规则:
如果当前对象this大于形参对象obj,则返回正整数
如果当前对象this小于形参对象obj,则返回负整数
如果当前对象this等于形参对象obj,则会返回0
3.像String、包装类重写compareTo()方法以后,进行了从小到大排列
4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序
*/
public void test1(){
String[] arr = new String[]{"AA","BB","MM","JJ","GG","DD"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
public void test2(){
Goods[] arr = new Goods[5];
arr[0] = new Goods("联想Mouse",34);
arr[1] = new Goods("戴尔Mouse",22);
arr[2] = new Goods("小米Mouse",30);
arr[3] = new Goods("罗技Mouse",11);
arr[4] = new Goods("华为Mouse",11);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52package Intermediate.oftenClass.Comparre;
import org.jetbrains.annotations.NotNull;
public class Goods implements Comparable{
private String name;
private double price;
public Goods() {
}
public Goods(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//指明按照什么方式进行排序,按照价格从低到高排序,再按照产品名称从低到高排序
public int compareTo( Object o){
if (o instanceof Goods){
Goods goods = (Goods) o;
//方式一
if (this.price > goods.price){
return 1;
}else if (this.price < goods.price){
return -1;
}else {
return this.name.compareTo(goods.name);
}
//方式二
//return Double.compare(this.price,goods.price);
}
throw new RuntimeException("传入的数据类型不一致!");
}
}- 定制排序:java.util.Comparator
- 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.langComparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较
- 重写compare(Object o1, Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2
- 可以将Comparrator 传递给sort方法(如Collections.sort或Array.sort),从而允许在排序顺序上实现精确控制
- 还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序
- Comparable接口与Comparator的使用的对比:
- Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
- Comparator接口属于临时性的比较
System类
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包
由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以可以很方便的进行调用
成员变量
- System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)
成员方法
native long currentTimeMillis():该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1日0时0分0秒所差的毫秒数
void exit(int status):该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。
void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况
String getProperty(String key):该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:
1 |
|
Math类
- java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型
- abs:绝对值
- acos,asin,atan,cos,sin,tan:三角函数
- sqrt:平方根
- pow(double a, double b):a的b次幂
- log:自然对数
- exp:e为底指数
- max(double a, double b):求两个数的最大值
- min(double a, double b):求两个数的最小值
- random():返回0.0到1.0的随机数
- long round(double a):double型数据a转换为long型(四舍五入)
- toDegrees(double angrad):弧度 => 角度
- toRadians(double angdeg):角度 => 弧度
BigInteger与BigDecimal
Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的,最大为2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不说进行运算了
java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger提供所有Java的基本整数操作符的对应物,并提供java.long.Math的所有相关方法。另外BigInteger还提供一下运算:模算术、GCD计算、质数测试、素数生成、位操作以及一些其他操作
构造器:
- BigInteger(String val):根据字符串构建BigInteger对象
常用方法
- public BigInteger abs():返回此 BigInteger 的绝对值的 BigInteger。
- BigInteger add(BigInteger val) :返回其值为 (this + val) 的 BigInteger
- BigInteger subtract(BigInteger val) :返回其值为 (this - val) 的 BigInteger
- BigInteger multiply(BigInteger val) :返回其值为 (this * val) 的 BigInteger
- BigInteger divide(BigInteger val) :返回其值为 (this / val) 的 BigInteger。整数 相除只保留整数部分。
- BigInteger remainder(BigInteger val) :返回其值为 (this % val) 的 BigInteger。
- BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。
- BigInteger pow(int exponent) :返回其值为 (thisexponent) 的 BigInteger。
一般的Float类和Double类可以用来做科学计算或过程计算,但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal类
BigDecimal类支持不可变、任意精度的有符号十进制定点数
构造器
- public BigDecimal(double val)
- public BigDecimal(String val)
常用方法
- public BigDecimal add(BigDecimal augend)
- public BigDecimal subtract(BigDecimal subtrahend)
- public BigDecimal multiply(BigDecimal multiplicand)
- public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
1 |
|