常用类
字符串相关的类
String类
-
概述
- String:字符串,使用一对""引起来表示。
- String声明为final的,不可被继承
- String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小 - String内部定义了final char[] value用于存储字符串数据
- 通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。
- 字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。
-
不可变性-不可变的字符序列
- 1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 2.当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 长度不变,内容不变,一旦初始化就不能改变字符串常量池中的内容,只能另创建指定内存区域赋值
-
赋值的方式
-
通过字面量定义的方式:此时数据声明在方法区中的字符串常量池中。
-
通过new+构造器的方式:此时保存的是地址值,是数据在堆空间中开辟空间以后对应的地址值。
-
字符串拼接方式赋值的对比
- 1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
- 2.只要其中一个是变量,结果就在堆中。–>有变量参与的就相当于new
- 3.如果拼接的结果调用intern()方法,返回值就在常量池中
-
-
常用的方法
- int length():返回字符串的长度: return value.length
- char charAt(int index): 返回某索引处的字符return value[index]
- boolean isEmpty():判断是否是空字符串:return value.length == 0
- String toLowerCase():使用默认语言环境,将 String 中的所字符转换为小写
- String toUpperCase():使用默认语言环境,将 String 中的所字符转换为大写
- String trim():返回字符串的副本,忽略前导空白和尾部空白
- boolean equals(Object obj):比较字符串的内容是否相同
- boolean equalsIgnoreCase(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 endsWith(String suffix):测试此字符串是否以指定的后缀结束
- boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
- boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
- 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):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
- String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有的 oldChar 得到的。–>替换所有的旧字符
- String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所匹配字面值目标序列的子字符串。
- 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个,如果超过了,剩下的全部都放到最后一个元素中。
-
String与其他结构的转换
-
与基本数组类型、包装类之间的转换
-
string–>基本数组类型、包装类
- 调用包装类的静态方法:parseXxx(str)
-
基本数组类型、包装类–>string
- 调用String重载的valueOf(xxx)
-
-
与字符数组char[]之间的转换
- String --> char[]:调用String的toCharArray()
- char[] --> String:调用String的构造器
-
与字节数组byte[]之间的转换
- 编码:String --> byte[]:调用String的getBytes()–>默认为utf-8
- 解码:byte[] --> String:调用String的构造器
- 编码:字符串 -->字节 (看得懂 —>看不懂的二进制数据)
- 解码:编码的逆过程,字节 --> 字符串 (看不懂的二进制数据 —> 看得懂
-
StringBuffer与StringBuilder
-
StringBuffer
StringBuilder–不是多线程时使用-
new StringBuffer()时底层创建了一个长度为16的char[]数组
new StringBuffer(“abc”)时底层创建了一个长度为"abc".length+16的char[]数组–>始终空出来16的长度 -
扩容问题
- 如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍 + 2,同时将原数组中的元素复制到新的数组中。
-
方法
- 增: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() / toString()
-
-
与String转化
- String -->StringBuffer、StringBuilder:
调用StringBuffer、StringBuilder构造器 - StringBuffer、StringBuilder -->String:
①调用String构造器;②StringBuffer、StringBuilder的toString()
- String -->StringBuffer、StringBuilder:
JDK8之前的日期API
System类
-
System.currentTimeMillis()
- 返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。–>时间戳
Date类
-
java.util.Date类–父类
|—java.sql.Date类–子类 -
1.两个构造器的使用
-
构造器一:Date():创建一个对应当前时间的Date对象
-
构造器二:创建指定毫秒数的Date对象
-
-
2.两个方法的使用
-
toString():显示当前的年、月、日、时、分、秒–Thu Apr 07 12:55:10 CST 2022
-
getTime():获取当前Date对象对应的毫秒数。(时间戳)
-
-
java.sql.Date对应着数据库中的日期类型的变量–2022-04-06
-
如何实例化
- new java.sql.Date(long time);
-
如何将java.util.Date对象转换为java.sql.Date对象
- java.sql.Date date7 = new java.sql.Date( new Date().getTime());
-
java.text.SimpleDataFormat类
-
SimpleDateFormat对日期Date类的格式化和解析
-
实例化
- SimpleDateFormat sdf1 = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
-
格式化:日期-字符串
- String format1 = sdf1.format(date);
System.out.println(format1);
- String format1 = sdf1.format(date);
-
解析:字符串-日期
- Date date2 = sdf1.parse(“2020-02-18 11:48:27”);
System.out.println(date2);
- Date date2 = sdf1.parse(“2020-02-18 11:48:27”);
注意:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则,抛异常
Calendar日历类-抽象类
-
实例化
-
创建其子类GregorianCalendar的对象
- new GregorianCalendar();
-
调用其静态方法getInstance()
- Calendar.getInstance();
-
-
方法
-
get()
-
获取属性–静态变量
- 注意:获取月份时,1月是0…12月是11;获取星期时,周日是1,…周六是7
-
-
set()
- calendar可变性
-
add()
- 在原有的属性加减
-
getTime()
- 日历类–>Date
-
setTime()
- Date–>日历类
-
JDK8之后的日期API
java.time
java.time.format
-
DateTimeFormatter类
-
①格式化或解析日期、时间② 类似于SimpleDateFormat
-
实例化–自定义格式
- DateTimeFormatter f3 = DateTimeFormatter.ofPattern(“yyyy-MM-dd hh:mm:ss”);
-
格式化
- String format = f3.format(LocalDateTime.now());
-
解析
- TemporalAccessor accessor = f3.parse(“2019-02-18 03:52:09”);
-
LocalDate / LocalTime / LocalDateTime
-
方法
-
now()
- LocalDate date =LocalDate.now();
-
of()
-
静态方法,根据指定日期/时间创建对象,LocalDateTime.of(2020,10,26,15,45,36);
- 没有偏移量
-
-
getXxx()
- 获取当前的信息,月份,年份,天数…
-
withXxx()
- 设置相应的信息,月份,年份,天数…
-
plusXxx()
- 向当前对象添加几天、几周、几个月、几年、几小时
-
minusXxx()
- 从当前对象减去几月、几周、几天、几年、几小时
-
Instant
- 时间线上的一个瞬时点。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC开始的秒数。)
BigInteger与BigDecimal
① java.math包的BigInteger可以表示不可变的任意精度的整数。
② 要求数字精度比较高,用到java.math.BigDecimal类
System类、Math类
Math
- java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型。
System
- System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
- 由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
JAVA比较器
使用Comparable接口-自然排序
-
1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。
-
2.像String、包装类重写compareTo()方法以后,进行了从小到大的排列
-
3、 重写compareTo(obj)的规则:
-
如果当前对象this大于形参对象obj,则返回正整数,
-
如果当前对象this小于形参对象obj,则返回负整数,
-
如果当前对象this等于形参对象obj,则返回零。
-
-
4、对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。在compareTo(obj)方法中指明如何排序
使用comparator接口–定制排序
-
1.背景:
- 当元素的类型没实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序
-
2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
- 如果方法返回正整数,则表示o1大于o2;
- 如果返回0,表示相等;
- 返回负整数,表示o1小于o2。
-
使用
- Arrays.sort(goods,com);
- Collections.sort(coll,com);
- new TreeSet(com);
面试题
good and best
- 引用数据类型传的是地址值,但由于字符串具有不可变性,因此test ok是在字符串常量池重建的。
总结: