JAVA面试部分重点内容
目录
四、String和StringBuffer
1.说说String的常用方法?
方法 | 描述 |
---|---|
public String[ ] | 创建一个空的字符串对象 |
public String(String value[ ]) | 创建一个值为value的字符串对象 |
public String(char value[ ]) | 将一个char数组转换为字符串对象 |
public String(char value[ ],int offset,int count) | 将一个制定范围的char数组转换为字符串对象 |
public String(byte value[ ]) | 将一个byte数组转换为字符串对象 |
public String(byte value[ ],int offset,int count) | 将一个制定范围的byte数组转换为字符串对象 |
public int length() | 获取字符串的长度 |
public boolean isEmpty() | 判断字符串是否为空 |
public char charAt(int index) | 返回指定下标的字符 |
public byte[ ] getBytes() | 返回字符串对应的byte数组 |
public boolean equals(Object anObject) | 判断两个字符串的值是否相等 |
public boolean equalsIgnoreCase(Object anObject) | 判断两个字符串值是否相等(忽略大小写) |
public int compareTo(String value) | 对字符串进行排序 |
public int compareToIgnoreCase(String value) | 忽略大写进行排序 |
public boolean startWith(String value) | 判断字符串是否以value开头 |
public boolean endsWith(String value) | 判断字符串是否以value结尾 |
public int hashcode() | 返回字符串的hash值 |
public int indexOf(String str) | 返回str在字符串中的下标 |
public int indexOf(String str,int fromIndex) | 从指定位置查找字符串的下标 |
public String subString(int beginIndex) | 从指定位置开始截取字符串 |
null和空是两个概念,null是指对象不存在,引用地址为空。
2.说说String和StringBuffer的区别?
String对象一旦创建,值不能修改(原来的值不能修改,一旦修改就是一个新的对象)修改之后会重新开辟内存空间来存储新的对象,会修改String的引用。因为String底层是用数组来存储的,数组长度一旦创建就不可修改,所以导致上述问题。StringBuffer可以解决String频繁改造的空间资源浪费的问题
- StringBuffer数组的默认长度是16,使用无参构造函数来创建对象。
@HotSpotIntrinsicCandidate
public StringBuffer() {
super(16);
}
- 使用有参构造函数,数组的长度=值的长度+16。
@HotSpotIntrinsicCandidate
public StringBuffer(String str) {
super(str.length() + 16);
this.append(str);
}
3.说说StringBuffer的字符串长度大于16,如何处理?
StringBuffer不会重新开辟一块新的内存区域,而是在原有的基础上进行扩容,通过调用父类ensureCapacityInternal()方法对底层数组进行扩容,保持引用不变。
private void ensureCapacityInternal(int minimumCapacity) {
int oldCapacity = this.value.length >> this.coder;
if (minimumCapacity - oldCapacity > 0) {
this.value = Arrays.copyOf(this.value, this.newCapacity(minimumCapacity) << this.coder);
}
}
4.说说StringBuffer的常用方法?
方法 | 描述 |
---|---|
public StringBuffer() | 创建一个空的StringBuffer对象 |
public StringBuffer(String str) | 创建一个值为str的StringBuffer对象 |
public synchronized int length() | 返回StringBuffer的长度 |
public synchronized char charAt(int index) | 返回指定位置的字符 |
public synchronized StringBuffer append(String str) | 追加内容 |
public synchronized StringBuffer delete(int start,int end) | 删除指定区间的值 |
public synchronized StringBuffer deleteCharAt(int index) | 删除指定位置的字符 |
public synchronized StringBuffer replace(int start,int end,String str) | 将指定区间的值替换成str |
public synchronized String substring(int start) | 截取字符串从指定位置到结尾 |
public synchronized String substring(int start,int end) | 截取字符串从start开始,到end结束 |
public synchronized StringBuffer insert(int offset,String str) | 在指定位置插入str |
public int indexOf(String str) | 从头开始查找指定字符的位置 |
public int indexOf(String str,int fromIndex) | 从fromIndex开始查找指定字符的位置 |
public synchronized StringBuffer reverse() | 进行反转 |
public synchronized String toString() | 转换为String |
读取数据不需要考虑线程安全问题,因为这种操作不存在线程安全隐患。