1.字符串相关
1.1 String基本概念
String str = “String” 与 String str = new String(“String”) 的区别:
- 字符串常量存储在字符串常量池,目的是共享
- 字符串非常量对象存储在堆中
康师傅的这张图表现的非常清晰:
1.2 String、StringBuffer和StringBuilder
直接看底层的实现:
- String:
private final byte[] value
- StringBuffer:
// 构造器
AbstractStringBuilder(int capacity) {
if (COMPACT_STRINGS) {
value = new byte[capacity];
coder = LATIN1;
} else {
value = StringUTF16.newBytesFor(capacity);
coder = UTF16;
}
}
// 扩容时
int newCapacity = (oldCapacity << 1) + 2
- StringBuilder:
// 构造器
AbstractStringBuilder(int capacity) {
if (COMPACT_STRINGS) {
value = new byte[capacity];
coder = LATIN1;
} else {
value = StringUTF16.newBytesFor(capacity);
coder = UTF16;
}
}
// 扩容时
int newCapacity = (oldCapacity << 1) + 2
- 可以发现三者都在java.lang包下,其中String被声明为final的,所以不可变;
- 而StringBuffer和StringBuilder都是调用了父类AbstractStringBuilder的构造器,在该父类中声明了大小为capacity(默认为16)的byte[],因此二者可变;
- 同时,扩容方法都是变为原字符串长度的2倍+2,为了避免多次扩容,应当尽量使用含参构造器。
其中StringBuffer是线程安全的,效率较低:
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
而StringBuilder是线程不安全的,效率更高:
public StringBuilder append(String str) {
super.append(str);
return this;
}
1.3 字符串常用方法
- charAt(int index): 返回某索引处的字符return value[index]
- isEmpty():判断是否是空字符串:return value.length == 0
- toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
- toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
- trim():返回字符串的副本,忽略前导空白和尾部空白
- equals(Object obj):比较字符串的内容是否相同
- equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
- concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
- compareTo(String anotherString):比较两个字符串的大小
- substring(int beginIndex):返回一个新的字符串,它是此字符串的从index开始截取到最后的一个子字符串。
- substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
- endsWith(String suffix):测试此字符串是否以指定的后缀结束
- startsWith(String prefix):测试此字符串是否以指定的前缀开始
- startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
- contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
- indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
- indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
- lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
- lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注意:indexOf和lastIndexOf方法如果未找到都是返回-1- replace(str, str1): 替换str中所有str1
- replaceALL/replaceFirst/matches(): 包含正则的替换/替换第一个/查找匹配
- split(str, int(可选)): 按str分割字符串为int份,超出的都放在最后一份
- Integer.parseInt(): 将数字组成的字符串转换成int, Double/Byte…都有类似的方法
- String.valueOf(): 将int/double…转换成字符串
- toCharArray(): 转化成char[]
- getChars(begin, end, target, start): 将字符串begin到end-1部分放入target中,从target[start]开始放,需要提供足够大的char[]
- str.getBytes(): 将str转换成编码存放在byte[]
- Arrays.toString(): 数组类型的用这个方法打印
- append/delete/insert/reverse
- replace(start, end, str): 把start到end位置替换成str,可以不等长
- setCharAt(): 更改单个字符
2. 时间相关方法
2.1 获取当前时间的几种方式
- System.currentTimeMillis():返回从1970.1.1.0:00:00至今的毫秒数——时间戳
- Date date = new Date():创建日期类,调用相关方法
date.toString(): 返回到秒的时间
date.getTime(): 返回时间戳
date(long): 将long毫秒数变为具体时间
- SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”):按指定格式获取时间
2.2 时间的其它方法
- cal.get(Calendar.XXX):设置某个时间cal以获取至今的时间间隔
3. 比较器
为了比较对象,不只是使用 == 或 !=, 需要实现Comparable/Comparator接口:
- Comparable用于在类中实现,实现后,类的实例化对象具备CompareTo方法
class ComTest implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
- Comparator用于不可修改代码且未实现Comparable接口的对象, 利用比较器比较,对象不具备比较的方法,需要重写Compare方法并抛出异常
Arrays.sort(str, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof String && o2 instanceof String){
String s1 = (String) o1;
String s2 = (String) o2;
return s1.compareTo(s2);
}
throw new RuntimeException("数据异常");
}
});
4. 枚举类
当类的对象只有有限个确定值时可以使用,尤其是定义一组常量时建议使用。
enum可以有属性,方法,可以实现接口,注意对象间用 ‘,’ 间隔,结束用 ‘;’
- 可以在enum中实现抽象方法,也可以在每个对象处实现方法
enum Students{
// 枚举类需要写上注释让人知道这是啥
Zhao,
Qian,
Sun,
Li;
}
main(){
@Test
public void test(){
Students zhou = Students.Zhao;
}
}