String类相关常用知识:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence
> final:String是不可被继承的
> Serializable:可序列化的接口。凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输。
> Comparable:凡是实现此接口的类,其对象都可以比较大小。
内部声明的属性:
jdk8中:
private final char value[]; //存储字符串数据的容器
> final : 指明此value数组一旦初始化,其地址就不可变。
jdk9开始:为了节省内存空间,做了优化
private final byte[] value; //存储字符串数据的容器。
字符串常量的存储位置
> 字符串常量都存储在字符串常量池(StringTable)中
> 字符串常量池不允许存放两个相同的字符串常量。
> 字符串常量池,在不同的jdk版本中,存放位置不同。
jdk7之前:字符串常量池存放在方法区; jdk7及之后:字符串常量池存放在堆空间。
String的不可变性:
① 当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改(Switch中可以用string)
② 当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能在原有的位置修改
③ 当调用字符串的replace()替换现有的某个字符时,需要重新开辟空间保存修改以后的字符串,不能在原有的位置修改
eg:String s2 = new String("hello");在内存中创建了几个对象? 两个!
一个是堆空间中new的对象。另一个是在字符串常量池中生成的字面量。
String的连接操作:+
情况1:常量 + 常量: 结果仍然存储在字符串常量池中,返回此字面量的地址。注:此时的常量可能是字面量,也可能是final修饰的常量
情况2:常量 + 变量 或 变量 + 变量 :都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址(创建一个stringbuilder实例,通过append添加字符串,最后调用tostring返回一个字符串)
情况3:调用字符串的intern():返回的是字符串常量池中字面量的地址
情况4:concat(xxx):不管是常量调用此方法,还是变量调用,同样不管参数是常量还是变量,总之,调用完concat()方法都返回一个新new的对象。
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(xx):拼接
(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():结果在常量池中共享
(11)boolean contains(xx):是否包含xx
(12)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1
(13)int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
(14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1
(15)int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
(16)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
(17)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
(18)char charAt(index):返回[index]位置的字符
(19)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回
(20)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String
(21)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String
(22)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String
(23)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String
(24)boolean startsWith(xx):测试此字符串是否以指定的前缀开始
(25)boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
(26)boolean endsWith(xx):测试此字符串是否以指定的后缀结束
(27)String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 不支持正则。
(28)String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
(29)String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
(30)String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
1.三个类的对比:String、StringBuffer、StringBuilder
> String:不可变的字符序列;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
> StringBuffer:可变的字符序列;JDK1.0声明,线程安全的,效率低;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
> StringBuilder:可变的字符序列;JDK5.0声明,线程不安全的,效率高;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
2. StringBuffer/StringBuilder的可变性分析(源码分析):
针对于StringBuilder来说:
内部的属性有:
char[] value; //存储字符序列
int count; //实际存储的字符的个数
StringBuilder sBuffer1 = new StringBuilder();//char[] value = new char[16];
StringBuilder sBuffer1 = new StringBuilder("abc"); //char[] value = new char[16 + "abc".length()];
sBuffer1.append("ac");//value[0] = 'a'; value[1] = 'c';
sBuffer1.append("b");//value[2] = 'b';
...不断的添加,一旦count要超过value.length时,就需要扩容:默认扩容为原有容量的2倍+2。
并将原有value数组中的元素复制到新的数组中。
3. 使用
> 如果开发中需要频繁的针对于字符串进行增、删、改等操作,建议使用StringBuffer或StringBuilder替换String.
> 如果开发中,不涉及到线程安全问题,建议使用StringBuilder替换StringBuffer。因为使用StringBuilder效率高
> 如果开发中大体确定要操作的字符的个数,建议使用带int capacity参数的构造器。因为可以避免底层多次扩容操作,性能更高。
4. StringBuffer和StringBuilder中的常用方法
增: append(xx)
删: delete(int start, int end); deleteCharAt(int index)
改:replace(int start, int end, String str);setCharAt(int index, char c)
查: charAt(int index)
插: insert(int index, xx)
长度:length()
翻转:reverse()
5.效率从高到低排列:StringBuilder > StringBuffer > String
date类的使用:
一、JDK8之前的API:
1. System类的currentTimeMillis()
> 获取当前时间对应的毫秒数,long类型,时间戳
> 当前时间与1970年1月1日0时0分0秒之间的毫秒数
> 常用来计算时间差
2. 两个Date类
|--java.util.Date
> 两个构造器的使用
> 两个方法的使用:①toString() ② long getTime()
|----java.sql.Date: 对应着数据库中的date类型
3. SimpleDateFormat类
SimpleDateFormat类:用于日期时间的格式化和解析
格式化:日期--->字符串
解析:字符串 ---> 日期
4. Calendar类(日历类):抽象类
Calendar:日历类
① 实例化 由于Calendar是一个抽象类,所以我们需要创建其子类的实例。这里我们通过Calendar的静态方法
getInstance()即可获取
②常用方法:get(int field) / set(int field,xx) / add(int field,xx) / getTime() / setTime()
二、JDK8中的API:
1. LocalDate,LocalTime,LocalDateTime --->类似于Calendar
> 实例化:now() / of(xxx,xx,xx)
> 方法:get() / withXxx() / plusXxx() / minusXxx() ...
2. Instant:瞬时 --->类似于Date
> 实例化:now() / ofEpochMilli()
> 方法:toEpochMilli()
3. DateTimeFormatter ---> 类似于SimpleDateFormat
用于格式化和解析LocalDate,LocalTime,LocalDateTime
Java比较器:实现对象的排序,可以考虑两种方法:自然排序 、 定制排序
方式一:实现Comparable接口的方式
实现步骤:
① 具体的类A实现Comparable接口
② 重写Comparable接口中的compareTo(Object obj)方法,在此方法中指明比较类A的对象的大小的标准
③ 创建类A的多个实例,进行大小的比较或排序。
方式二:实现Comparator接口的方式
实现步骤:
① 创建一个实现了Comparator接口的实现类A
② 实现类A要求重写Comparator接口中的抽象方法compare(Object o1,Object o2),在此方法中指明要
比较大小的对象的大小关系。(比如,String类、Product类)
③ 创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。(比如:Arrays.sort(..,类A的实例))
区别:
自然排序:对应的接口是Comparable,对应的抽象方法compareTo(Object obj)
定制排序:对应的接口是Comparator,对应的抽象方法compare(Object obj1,Object obj2)
其它常用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)