Java基础系列文章
Java基础(一):语言概述 | Java基础(二):原码、反码、补码及进制之间的运算 | Java基础(三):数据类型与进制 | Java基础(四):逻辑运算符和位运算符 |
---|---|---|---|
Java基础(五):流程控制语句 | Java基础(六):数组 | Java基础(七):面向对象编程 | Java基础(八):封装、继承、多态性 |
Java基础(九):Object 类的使用 | Java基础(十):关键字static、代码块、关键字final | Java基础(十一):抽象类、接口、内部类 | Java基础(十二):枚举类 |
Java基础(十三):注解(Annotation) | Java基础(十四):包装类 | Java基础(十五):异常处理 | Java基础(十六):String的常用API |
Java基础(十七):日期时间API | Java基础(十八):java比较器、系统相关类、数学相关类 | Java基础(十九):集合框架 | Java基础(二十):泛型 |
Java基础(二十一):集合源码 | Java基础(二十二):File类与IO流 | Java基础(二十三):反射机制 | Java基础(二十四):网络编程 |
Java基础(二十五):Lambda表达式、方法引用、构造器引用 | Java基础(二十六):Java8 Stream流及Optional类 |
public String()
:初始化新创建的 String对象,以使其表示空字符序列 String(String original)
: 初始化一个新创建的 String
对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本public String(char[] value)
:通过当前参数中的字符数组来构造新的Stringpublic String(char[] value,int offset, int count)
:通过字符数组的一部分来构造新的String举例:
//字面量定义方式:字符串常量对象
String str = "hello";
//构造器定义方式:无参构造
String str1 = new String();
//构造器定义方式:创建"hello"字符串常量的副本
String str2 = new String("hello");
//构造器定义方式:通过字符数组构造
char chars[] = {'a', 'b', 'c','d','e'};
String str3 = new String(chars); // abcde
String str4 = new String(chars,0,3); // abc
public byte[] getBytes()
:使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中public byte[] getBytes(String charsetName)
:使用指定的字符集将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组String(byte[])
:通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 StringString(byte[], String charsetName )
或 new String(byte[], int, int,String charsetName ):解码,按照指定的编码方式进行解码举例:
byte[] b_gbk = "中".getBytes("gbk");
byte[] b_utf8 = "中".getBytes("utf-8");
byte[] b_iso88591 = "中".getBytes("iso-8859-1");
String s_gbk = new String(b_gbk, "gbk");
String s_utf8 = new String(b_utf8, "utf-8");
String s_iso88591 = new String(b_iso88591, "iso-8859-1");
String s_iso88591 = new String("中".getBytes("utf-8"), "iso-8859-1");
String s_utf8 = new String(s_iso88591.getBytes("iso-8859-1"), "utf-8");
byte[] b = "中".getBytes("utf-8");
for(int i=0; i<b.length; i++) {
System.out.println(b[i]);
}
输出:
-28
-72
-83
boolean equalsIgnoreCase(Object obj)
:比较字符串是否相等,不区分大小写int compareTo(String other)
:比较字符串大小,区分大小写,按照Unicode编码值比较大小String toLowerCase()
:将字符串中大写字母转为小写String toUpperCase()
:将字符串中小写字母转为大写@Test
public void test1(){
String s1 = "hello";
String s2 = "HellO";
System.out.println(s1.equals(s2));
System.out.println(s1.equalsIgnoreCase(s2));
String s3 = "abcd";
String s4 = "adef";
System.out.println(s3.compareTo(s4));
String s5 = "abcd";
String s6 = "aBcd";
System.out.println(s5.compareTo(s6));
System.out.println(s5.compareToIgnoreCase(s6));
String s7 = "张ab";
String s8 = "李cd";
System.out.println(s7.compareTo(s8));
String s9 = " he llo ";
System.out.println("****" + s9.trim() + "*****");
}
int indexOf(xx)
:从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1int indexOf(String str, int fromIndex)
:返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始int lastIndexOf(xx)
:从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1int lastIndexOf(String str, int fromIndex)
:返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索@Test
public void test2(){
String s1 = "教育尚硅谷教育";
System.out.println(s1.contains("硅谷")); // true
System.out.println(s1.indexOf("教育")); // 0
System.out.println(s1.indexOf("教育",1)); // 5
System.out.println(s1.lastIndexOf("教育")); // 5
System.out.println(s1.lastIndexOf("教育",4)); // 0
}
String substring(int beginIndex)
:返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串String substring(int beginIndex, int endIndex)
:返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串@Test
public void test3(){
String s1 = "教育尚硅谷教育";
System.out.println(s1.substring(2)); // 尚硅谷教育
System.out.println(s1.substring(2,5));//[2,5) // 尚硅谷
}
char charAt(index)
:返回[index]位置的字符char[] toCharArray()
: 将此字符串转换为一个新的字符数组返回@Test
public void test4(){
String s1 = "教育尚硅谷教育";
System.out.println(s1.charAt(2)); // 尚
// valueOf和copyValueOf源码一模一样的,就是用char数组new String(char[] ch)
String s2 = String.valueOf(new char[]{'a', 'b', 'c'}); // abc
String s3 = String.copyValueOf(new char[]{'a', 'b', 'c'}); // abc
}
boolean startsWith(xx)
:测试此字符串是否以指定的前缀开始boolean startsWith(String prefix, int toffset)
:测试此字符串从指定索引开始的子字符串是否以指定前缀开始boolean endsWith(xx)
:测试此字符串是否以指定的后缀结束@Test
public void test5(){
String s1 = "教育尚硅谷教育";
System.out.println(s1.startsWith("教育a")); // false
System.out.println(s1.startsWith("教育",5)); // true
}
String replace(char oldChar, char newChar)
:返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 不支持正则String replace(CharSequence target, CharSequence replacement)
:使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串String replaceAll(String regex, String replacement)
:使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串String replaceFirst(String regex, String replacement)
:使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串@Test
public void test6(){
String s1 = "hello";
String s2 = s1.replace('l', 'w');
System.out.println(s1); // hello
System.out.println(s2); // hewwo
String s3 = s1.replace("ll", "wwww");
System.out.println(s3); // hewwwwo
}
思路:查看字符串前缀后缀是否存在“ ”,去除后继续判断
public static String trimStr(String str) {
while (str.startsWith(" ") || str.endsWith(" ")) {
if (str.startsWith(" ")) {
str = str.substring(1);
}
if (str.endsWith(" ")) {
str = str.substring(0, str.length() - 1);
}
}
return str;
}
cdef
g”反转为”abfedc
g”方法一思路:字符串转换为字符数组,从指定角标到结束角标,互换数据
public static String reversalStr(String str, int fromIndex, int toIndex) {
char[] charArray = str.toCharArray();
for (int i = fromIndex, j = toIndex; i < j; i++, j--) {
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
}
return new String(charArray);
}
方法二思路:截取前中后三个字符串,中是需要反转的,从新拼接,拼接中字符串时候,从后开始拼接
public static String reversalStr2(String str, int fromIndex, int toIndex) {
String strReturn = str.substring(0, fromIndex);
for (int i = toIndex; i >= fromIndex; i--) {
strReturn += str.charAt(i);
}
strReturn += str.substring(toIndex + 1);
return strReturn;
}
思路:获取字符首次出现的角标,然后从出现的位置继续向后找
public static int getCount(String str, String subStr) {
int count = 0;
int index = str.indexOf(subStr);
while (index != -1) {
index = str.indexOf(subStr, index + subStr.length());
count++;
}
return count;
}
思路:从小字符串下手,通过不同长度截取
public static String getMaxStr(String str1, String str2) {
for (int i = 0; i < str2.length(); i++) {
for (int x = 0, y = str2.length() - i - x; y <= str2.length(); x++, y++) {
String substring = str2.substring(x, y);
if (str1.contains(substring)) {
return substring;
}
}
}
return null;
}
可变的字符序列
,JDK1.0中声明//情况1:
String s = new String("我喜欢学习");
//情况2:
StringBuffer buffer = new StringBuffer("我喜欢学习");
buffer.append("数学");
StringBuilder、StringBuffer的API是完全一致的,并且很多方法与String相同
常用API
@Test
public void test1(){
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("abc").append("123").append("def"); //方法链的调用
System.out.println(sBuilder);
StringBuilder sBuilder = new StringBuilder("hello");
sBuilder.insert(2, "中");
System.out.println(sBuilder); // he中llo
StringBuilder sBuilder1 = sBuilder.reverse();
System.out.println("反转字符串:" + sBuilder); // oll中eh
System.out.println("反转返回字符串:" + sBuilder1); // oll中eh
System.out.println("反转字符串是否与返回字符串是同一个对象:" + (sBuilder == sBuilder1)); // true
System.out.println("字符串长度:" + sBuilder.length()); //实际存储的字符的个数 // 6
}
其它API
测试String、StringBuffer、StringBuilder在操作数据方面的效率
@Test
public void test4() {
//初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
}
输出结果:
StringBuffer的执行时间:14
StringBuilder的执行时间:2
String的执行时间:264