本文整理下java中字符串
的相关知识,持续更新。
基于jdk版本:jdk8
。
1 基本知识
1.1 String是否是基本类型?
String不属于基本类型
,String是jdk
包中的一个类
,类路径:java.lang.String
。
java中的8种基本数据类型:
byte(1个字节,8位),short(2个字节,16位),int(4个字节,32位),long(8个字节,64位),float(4个字节,32位),double(8个字节,64位),boolean,char
1.2 创建String的方式
(1)使用字面值(双引号)创建
String str="abc";
采用双引号
的方式创建字符串,JVM
先去字符串池
中查找是否存在abc这个对象。
如果字符串池中不存在
此对象,在字符串池中创建
abc这个对象,然后将池中对象abc的引用地址
传给字符串变量
str,str指向字符串池中
的对象abc;如字符串池中已存在,则不再创建对象
,直接将池中对象abc的引用地址
传给字符串变量str。
通过这种方式创建string时,如果字符串内容一样
,则定义的多个字符串变量
,对应的字符串池中的引用地址一致
。如下:
String str = "abc";
String str1 = "abc";
System.out.println(str == str1);
输出结果如下:
true
(2)使用new关键字创建
String str = new String("abc");
采用new
关键字创建字符串abc,jvm先去字符串池中查找是否有
abc这个对象,如字符串池中没有
,则先在字符串池中创建
abc这个对象,然后在堆上创建
abc这个对象,将堆上创建的abc
这个对象的引用地址
传给字符串变量str;如字符串池中已有
abc这个对象,则在堆上创建
abc这个对象,将堆上创建的abc
这个对象的引用地址
传给字符串变量str。
采用new创建字符串时,每次都会在堆上创建新的对象
,字符串变量均指向堆上
新的对象。如下:
String str = new String("123");
String str1 = new String("123");
System.out.println(str == str1);
输出结果如下:
false
1.3 String、StringBuilder、StringBuffer之间的关系
String是final修饰的,String对象的值是不可更改
,每次对String对象进行更改,都会生成新的
String对象。对String对象进行大量操作,将会生成大量
的String对象,造成大量的内存空间浪费。
StringBuilder和StringBuffer内部设有字符数组
,适用于对String进行大量更改
,不会生成新
的String对象。
StringBuilder非线程安全,StringBuffer是线程安全的。StringBuilder比StringBuffer有速度优势,绝大多数情况下建议使用StringBuilder
。
2 常用工具类
开发过程中,对字符串进行相关操作, 建议使用字符串工具类。
2.1 commons-lang3
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
工具类:
org.apache.commons.lang3.StringUtils
(1)判断是否为空
// 判断字符串不为"",且不为null
public static boolean isNotEmpty
// 判断字符串不为"",且不为null,且不为whitespace
public static boolean isNotBlank
// 判断字符串为"",或不为null
public static boolean isEmpty
// 判断字符串不为""或不为null,或为whitespace
public static boolean isBlank
(2)省略号缩写字符串
public static String abbreviate(final String str, final int maxWidth)
public static String abbreviate(final String str, final int offset, final int maxWidth)
public static String abbreviate(final String str, final String abbrevMarker, final int maxWidth)
public static String abbreviate(final String str, final String abbrevMarker, int offset, final int maxWidth)
(3)截断字符串
public static String abbreviateMiddle
(4)字符串的末尾删除一个换行符(若有)
public static String chomp
(5)比较字符串
public static int compare(final String str1, final String str2)
public static int compare(final String str1, final String str2, final boolean nullIsLess)
public static int compareIgnoreCase(final String str1, final String str2
(6)判断子字符串出现位置
public static int indexOf(final CharSequence seq, final CharSequence searchSeq)
public static int indexOf(final CharSequence seq, final CharSequence searchSeq, final int startPos)
public static int indexOf(final CharSequence seq, final int searchChar)
public static int indexOf(final CharSequence seq, final int searchChar, final int startPos)
(7)拼接字符串
public static String join(final byte[] array, final char separator)
public static String join(final Iterable<?> iterable, final char separator)
......
(8)其他
略
3 常见面试题
3.1 判断一个字符串是回文
(1)手动判断
public static boolean isPalindrome(String str) {
if (str == null || "".equals(str)) {
return false;
}
int length = str.length();
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) != str.charAt(length - 1 - i)) {
return false;
}
}
return true;
}
(2)StringBuilder判断
public static boolean isPalindrome(String str) {
if (str == null) {
return false;
}
StringBuilder builder = new StringBuilder(str);
builder.reverse();
return str.equals(builder.toString());
}
3.2 统计某个在字符串中出现的次数
public static int getRepeatCharCount(String sourceStr, String queryStr) {
if (sourceStr != null && queryStr != null) {
String tmpStr = sourceStr.replaceAll(queryStr, "");
return sourceStr.length() - tmpStr.length();
}
return 0;
}
网友评论