```java
```java
1.字符串相关的类:String
String :字符串,使用一对""引起来表示。
1.String 声明为 final 的,不可被继承。
2.String 实现了 Serializable 接口:表示字符串是支持序列化的。
实现了 Comparable 接口:表示 String 可以比较大小。
3.String 内部定义了 final char[] value 用于存储字符串数据。
4.String : 代表不可变的字符序列。简称不可变性。【方法区(字符串常量池)】
体现:1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的 value 进行赋值。
2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能在原有的 value 上操作。
3.当调用 String 的 replace() 方法修改指定字符或字符串时,也必须重新指定内存区域赋值。
5.通过字面量的方式(区别于 new )给一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会存储相同内容的字符串的。
7.String 对象的创建:
内存:
1.字符串常量存储在字符串常量池,目的是共享。
2.字符串非常量对象存储在堆中。
实例化方式:
1.通过字面量定义的方式
2.通过 new + 构造器的方式
面试题:String s = new String("abc"); 创建了几个对象?
1.一个是堆空间 new 结构创建的对象。(堆内存)
2.char[] 数对应的常量池中的数据:"abc".(方法区)
1.常量与常量的拼接结果在常量池中。且常量池中不会存在相同内容的常量。
2.只要其中有一个是变量,结果就在堆中。
3.如果拼接的结果是调用 intern() 方法,返回值就在常量池中。
常用方法:
1.int length() : 返回字符串的长度 return value.length
2.char charAt(int index) : 返回某索引处的字符return value[index]
3.boolean isEmpty() : 判断是否为空字符串 : return value.length == 0
4.String toLowerCase() : 将 String 中的所有字符转化为小写
5.String toUpperCase() : 将 String 中的所有字符转换为大写
6.String trim() : 返回字符串的副本,忽略首尾步空白
7.booelan equals() : 比较字符串的内容是否相同
8.boolean equalsIngnoreCase(String anotherString):忽略大小写比较字符串的内容是否相同。
9.String concat(String str) : 将指定字符串连接到此字符串的结尾。
10.int compareTo(String anotherString) : 比较两个字符串的大小
11.String substring(int beginIndex):返回一个新的字符串,它是此字符串的从 beginIndex 开始截取到最后一个子字符串。
.....
字符数组 ——> 字符串
String 类的构造器:String(char[]) 和 String(char[] , int offset, int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。
字符串 ——> 字符数组
1.public char[] toCharArray() : 将字符串中的全部字符存放在一个字符数组中的方法。
2.public void getChars(int srcBegin,int srcEnd, char[] dst, int dstBegin):
提供了将指定索引范围内的字符串存放到数组中的方法。
String 与 byte[] 之间的转换:
String ——> byte[] : 调用 String 的 getBytes()
String 的算法考察:
1.模拟一个 trim 方法,去除字符串两端的空格。
2.将一个字符串进行反转。将字符串中指定部分进行反转。比如"abcdefg"反转为"abfedcg".
3.获取一个字符串在另一个字符串中出现的次数:
比如:获取"ab"在"abkkcadkabkebfkabkskab"中出现的次数。
4.获取两个字符串中最大相同子串。比如:str1="abcwerthelloyuiodef";
str2 = "cvhellobnm";
提示:将短的那个串进行长度依次递减的子串与较长的串比较。
5.对字符串中字符进行自然顺序排序。
提示:
1.字符串变成字符数组。
2.对数组排序,选择,冒泡,Arrays.sort().
3.将排序后的数组变成字符串。
StringBuffer:
1.java.lang.StringBuffer 代表可变的字符序列,jdk1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
2.很多方法与 String 相同。
3.作为参数传递时,方法内部可以改变值。
String, StringBuffer 和 StringBuilder 三者的异同?
1.String : 不可变的字符序列;底层使用 char[] 存储;
2.StringBuffer : 可变的字符序列;线程安全,效率低;底层使用 char[] 存储;
3.StringBuilder : 可变的字符序列;jdk5.0 新增的,线程不安全的,效率高;底层使用 char[] 存储;
4.String,StringBuffer,StringBuilder 效率对比
从高到低排列: StringBuilder > StringBuffer > String
StringBuffer 源码分析:
String str = new String(); // new char[0];
String str1 = new String("abc"); // new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer();
// char[] value = new char[16] : 底层创建了一个长度是16的数组。
sb1.append('a'); // value[0] = 'a';
sb1.append('b'); // value[1] = 'b';
sb1.append('c'); // value[2] = 'c';
StringBuffer sb2 = new StringBuffer("abc"); //char[] value = new char["abc".length];
扩容问题:
如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的 2 倍 + 2,同时将
原有数组中的元素复制到新的数组中。
当 append 和 insert 时,如果原来 value 数组长度不够,可扩容。
方法链的原理:
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer 类的常用方法:
1.StringBuffer append(xxx) : 提供了很多的 append() 方法,用于进行字符串拼接。
2.StringBuffer delete(int start, int end) : 删除指定位置的内容
3.StringBuffer replace(int start, int end, String str) : 把[start, end) 位置替换为 str.
4.StringBuffer insert(int offset, xxx); 在指定位置插入 xxx
5.StringBuffer reverse() : 把当前字符序列逆转
总结:
增: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()
在开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity);
JDK8 之前日期时间 API:
1.java.lang.System 类:
System 类提供的 public static long currentTimeMills() 用来返回当前时间与 1970年1月1日0时0分0秒之间
以毫秒为单位的时间差。时间戳。
此方法适于计算时间差。
计算世界时间的主要标准:
UTC
GMT
CST
2.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 yyy
其中: dow 是一周中的某一天(sun, mon,tue,wed,thu, fri,sat), zzz 是时间标准。
3.java.text.SimplateDateFormat 类
1.Date类的 API 不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化
和解析日期的具体类。
2.它允许进行格式化:日期 ——> 文本、 解析:文本 ——> 日期
3.格式化:
SimpleDateFormat() : 默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern) : 该构造方法可以用参数 pattern 指定的格式创建一个对象,该对象调用:
public String format(Date date) : 方法格式化时间对象 date
4.解析:
public Date parse(String source) : 从给定的字符串的开始解析文本,以生成一个日期。
4.java.util.Calendar(日历)类
1.Calendar 是一个抽象基类,主要用于完成日期字段之间相互操作的功能。
2.获取 Calendar 实例的方法
1.使用 Calendar.getInstance()方法。
2.调用它的子类 GregorianCalendar 的构造器
3.一个 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, int amout)
public final Date getTime()
public final void setTime(Date date)
注意:
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周二是2,,,周六是7
Instant : 瞬时
时间线上的一个瞬时点。可能被用来记录应用程序中的事件时间。
Java 比较器:
Java 实现对象排序的方式有两种:
1.自然排序:java.lang.Comparable
2.定制排序:java.util.Comparator
说明:
Java 中的对象,正常情况下,只能进行比较 == 或 !=.不能使用 > 或 < 的。
但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小。
如何实现?
使用两个接口中的任何一个:Comparable 或 Comparator
Comparable 接口的使用
1.像String,包装类等实现了 Comparable 接口,重写了 compareTo() 方法,给出了比较两个对象大小的方式
2.像 String,包装类重写 compareTo() 方法以后,进行了从小到大的排列。
3.重写 compareTo() 的规则:
1.如果当前对象 this 大于形参对象 obj, 则返回正整数,
2.如果当前对象 this 小于形参对象 obj, 则返回负整数,
3.如果当前对象 this 等于形参对象 obj, 则返回零。
4.对于自定义类来说,如果需要排序,我们可以让自定义类实现 Comparable 接口,重写 compareTo(obj) 方法,
在 compareTo(obj) 方法中指明如何排序。
定制排序:java.util.Comparator
1.当元素的类型没有实现 java.lang.Comparable 接口而又不方便修改代码,或者实现了 java.lang.Comparable 接口的排序规则
不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较。
2.重写 compareTo(obj1,obj2)方法,比较 obj1 和 obj2 的大小:
如果方法返回正整数,则表示 obj1 大于 obj2;
如果返回 0,表示相等;
返回负整数,表示 obj1 小于 obj2.
3.可以将 Comparator 传递给 sort 方法,从而允许在排序顺序上实现精确控制。、
4.还可以使用 Comparator 来控制某些数据结构的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
Comparable 接口与 Comparator 的使用对比:
1.Comparable 接口的方式一旦确定,保证 Comparable 接口实现类的对象在任何位置都可以进行比较大小。
Comparator 接口属于临时性的比较。
System、Math、
BigInteger:表示不可变的任意精度的整数。
BigDecimal: 要求数字精度比较高。