JAVA基础知识快速复习(一)-字符串

本文最后更新于:December 3, 2021 pm

JAVA基础知识快速复习(一)。包括数组的基本操作、三大特性、字符串及其有关的操作。

目录

1.遍历数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {
int n = ns[i];
System.out.println(n);
}

// 加强for
int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
System.out.println(n);
}
//在for (int n : ns)循环中,变量n直接拿到ns数组的元素,而不是索引。

// Arrays.toString()
int[] ns = { 1, 1, 2, 3, 5, 8 };
System.out.println(Arrays.toString(ns));

2.封装、继承、多态

  1. 子类自动获得了父类的所有字段,不能定义与父类重名的字段!在OOP的术语中,我们把Person称为超类(super class),父类(parent class),基类(base class),把Student称为子类(subclass),扩展类(extended class)。
  1. Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有Object特殊,它没有父类。
  1. super关键字表示父类(超类)。任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。
  1. Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override。继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final。用final修饰的方法不能被Override。
  1. 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为无法执行抽象方法,因此这个类也必须申明为抽象类,使用abstract修饰。无法实例化一个抽象类。
  1. 一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。在接口中,可以定义default方法。实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。

2.1 阻止继承

正常情况下,只要某个class没有final修饰符,那么任何类都可以从该class继承。从Java 15开始,允许使用sealed修饰class,并通过permits明确写出能够从该class继承的子类名称。这种sealed类主要用于一些框架,防止继承被滥用。

1
2
3
4
5
6
//定义一个Shape类:
public sealed class Shape permits Rect, Circle, Triangle {
...
}

//Shape类就是一个sealed类,它只允许指定的3个类继承它。

3.字符串

Java字符串String是不可变对象。字符串操作不改变原字符串内容,而是返回新字符串。

3.1 字符串比较

  1. 两个字符串比较,总是使用equals()方法。== 比较的是两个的地址。
  1. 忽略大小写比较(equalsIgnoreCase()
1
2
3
String s1="abcdefghijklmnopkrstuvwxyz"
String s2="ABCDEFGHIJKLMNOPKRSTUVWXYZ"
boolean flag=s1.equalsIgnoreCase(s2)

3.2 查找子串

    1. 是否包含子串(contains()
1
2
3
4
5
6
7
String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.contains("bc"));
System.out.println(s.contains("bd"));

//输出
true
false
    1. 查看子串是否在母串的开始(startsWith()
1
2
3
4
5
6
7
String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.startsWith("abc"));
System.out.println(s.startsWith("bcd"));

//输出
true
false
    1. 查看子串是否在母串的最后(endsWith()
1
2
3
4
5
6
7
String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.endsWith("wxy"));
System.out.println(s.endsWith("xyz"));

//输出
false
true
    1. 找子串第一次出现的下标,从下标0开始(indexOf()),没有找到返回-1
1
2
3
4
5
6
7
String s = "abcdabcedaaq";
System.out.println(s.indexOf("bc"));
System.out.println(s.indexOf("fgh"));

//输出
1
-1
    1. 找子串最后一次出现的下标(lastIndexOf()
1
2
3
4
5
6
7
String s = "abcdbcq";
System.out.println(s.lastIndexOf("bc"));
System.out.println(s.lastIndexOf("fgh"));

//输出
4
-1
    1. 提取子串(substring()
1
2
3
4
5
6
7
String s = "abbcccdddd";
System.out.println(s.substring(2)); //从下标2开始
System.out.println(s.substring(1,5)); //从下标1到下标5(不包括5),即[1,5)

//输出
bcccdddd
bbcc

3.3 去除首位空白字符

    1. 去除字符串首尾空白字符(trim())。空白字符包括空格,\t,\r,\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String s = "  fw few ewf we  q qwf ";
System.out.println(s.length());
System.out.println(s);
s = s.trim();
System.out.println(s.length());
System.out.println(s);

//输出
23
fw few ewf we q qwf . //!!!并没有点号,只是为了方便看尾部的空格才手动加上的
20
fw few ewf we q qwf.


" \tHello\r\n ".trim(); // "Hello"
    1. 移除字符串首尾空白字符(strip())。它和trim()不同的是,类似中文的空格字符\u3000也会被移除。
1
2
3
"\u3000Hello\u3000".strip(); // "Hello"。
" Hello ".stripLeading(); // "Hello "。移除字符串首部的空白符
" Hello ".stripTrailing(); // " Hello"。移除字符串尾部的空白符

3.4 判断字符串

判断字符串是否为 空(isEmpty())和空白字符串(isBlank()

1
2
3
4
"".isEmpty(); // true,因为字符串长度为0
" ".isEmpty(); // false,因为字符串长度不为0
" \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符

3.5 替换

替换子串(replace()),返回一个新字符串。

1
2
3
String s = "abcbabca";
String s1 = s.replace('a','t');//tbcbtbct,所有的字符a都被替换为t
String s1 = s.replace("ab","tttt"); //ttttcbttttca,所有的子串ab都被替换为tttt

正则表达式替换:

1
2
String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D",把匹配的子串统一替换为","

3.6 分割字符串

split(),其中表达式就是一个正则表达式。返回的是一个字符串数组。

  1. 特殊情况(斜线\
1
2
3
4
5
6
7
String s = "ab\\cd\\ef\\g\\h";
String[] s1 = s.split("\\\\"); //以 \ 为分割线
System.out.println(s);
int len=s1.length;
for(int i=0;i<len;++i){
System.out.println(s1[i]);
}
  1. 需要加双斜线的:+*$^
1
2
3
4
5
6
7
8
9
10
11
12
13
String s = "ab+cdef+gh";
String[] s1 = s.split("\\+");
String s = "ab*cdef*gh";
String[] s1 = s.split("\\*");
String s = "ab$cdef$gh";
String[] s1 = s.split("\\$");
String s = "ab^cdef^gh";
String[] s1 = s.split("\\^");
//输出
ab
cdef
gh

  1. 其他
1
2
3
4
5
6
String s = "ab,cde,fgh";
String[] s1 = s.split(",");
//输出
ab
cde
fgh
  1. 多个符号作为分隔符,使用多个分隔符则需要借助 | 符号
1
2
String s = "ab,c+de@fgh";
String[] s1 = s.split(",|\\+|@"); //以逗号、加号、@为分隔符,之间用或(|)

3.7 拼接字符串

拼接字符串使用静态方法join(),它用指定的字符串连接字符串数组。返回一个字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String s = "ab,c+de@fgh";
String[] s1 = s.split(",|\\+|@");
System.out.println(s);
int len=s1.length;
for(int i=0;i<len;++i){
System.out.println(s1[i]);
}
System.out.println("===============================");
String s3 = String.join("****",s1);
System.out.println(s3);
//输出
ab,c+de@fgh
ab
c
de
fgh
===============================
ab****c****de****fgh

3.8 格式化字符串

详见 《每日一点-JAVA保留小数点位数》

若链接失效,请直接搜索🔍

3.9 类型转换

  1. 其他类型转字符(String.valueOf()),返回一个字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int n = 15;
String nns = Integer.toString(n);
System.out.println(Integer.toString(n));
boolean fl = false;
System.out.println(Boolean.toString(fl)); //false

int a = 2123;
String resu = String.valueOf(a);
System.out.println(resu);
boolean flag = true;
resu = String.valueOf(flag);
System.out.println(resu);
double f = 23.4324;
resu = String.valueOf(f);
System.out.println(resu);
  1. 字符串转其他类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//整数字符串转整数
String s = "123456";
int nn = Integer.valueOf(s);
System.out.println(nn+100); //123556
System.out.println(Integer.valueOf(s));//123456

String sint = "123456";
int resu = Integer.parseInt(sint);
int re = Integer.parseInt(sint,11); //194871 把字符串里的数字当成11进制数,再转换为10进制。
System.out.println(resu); //123456
resu+=10;
System.out.println(resu); //123466

//boolean字符串转布尔值
String sbool = "true";
boolean fresu = Boolean.parseBoolean(sbool);
if(fresu) {
System.out.println("YES");
}
else {
System.out.println("NO");
}
//YES

//浮点数字符串转浮点数
String sdouble = "13.324";
double resu2 = Double.parseDouble(sdouble);
System.out.println(resu2); //13.324

要特别注意,Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer。例如:

1
Integer.getInteger("java.version"); // 版本号,11
  1. 将整数格式化为指定进制的字符串
1
2
3
4
5
6
7
8
 System.out.println(Integer.toString(100)); // "100",表示为10进制
System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制
System.out.println(Integer.toHexString(100)); // "64",表示为16进制
System.out.println(Integer.toOctalString(100)); // "144",表示为8进制
System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制

//或者
System.out.println(Integer.toString(100, radix)); // 将100转换为radix进制的字符串

3.10 字符串与char[]相互转化

1
2
char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

如果修改了char[]数组,String并不会改变。因为通过new String(char[])创建新的String实例时,它并不会直接引用传入的char[]数组,而是会复制一份,所以,修改外部的char[]数组不会影响String实例内部的char[]数组,因为这是两个不同的数组。

4.StringBuilder

StringBuilder 是一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
StringBuilder strB = new StringBuilder();

//1、append(String str)/append(Char c):字符串连接
System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));
//return "StringBuilder:ch111c"

//2、toString():返回一个与构建起或缓冲器内容相同的字符串
System.out.println("String:"+strB.toString());
//return "String:ch111c"

//3、appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this
System.out.println("StringBuilder.appendCodePoint:"+strB.appendCodePoint(2));
//return "StringBuilder.appendCodePoint:ch111c"

//4、setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)
strB.setCharAt(2, 'd');
System.out.println("StringBuilder.setCharAt:" + strB);
//return "StringBuilder.setCharAt:chd11c"

//5、insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)
System.out.println("StringBuilder.insertString:"+ strB.insert(2, "LS"));
//return "StringBuilder.insertString:chLSd11c"
System.out.println("StringBuilder.insertChar:"+ strB.insert(2, 'L'));
//return "StringBuilder.insertChar:chLLSd11c"

//6、delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串
System.out.println("StringBuilder.delete:"+ strB.delete(2, 4));
//return "StringBuilder.delete:chSd11c"

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
StringBuilder sb = new StringBuilder("tothefor");
System.out.println(sb);
sb.append(".com"); // append(String str)/append(Char c)
System.out.println(sb);
String mid = sb.toString(); // toString()
System.out.println(mid);
sb.insert(1,"www.");//insert(int offset, String str)/insert(int offset, Char c)
System.out.println(sb);
sb.delete(1,5);//delete(int startIndex,int endIndex) [startIndex,endIndex)
System.out.println(sb);
sb.setCharAt(1,'w');//setCharAt(int i, char c)
System.out.println(sb);

sb.appendCodePoint(65); //ASCII码65是大写的A
System.out.println(sb);

//输出
tothefor
tothefor.com
tothefor.com
twww.othefor.com
tothefor.com
twthefor.com
twthefor.comA

本文作者: 墨水记忆
本文链接: https://tothefor.com/DragonOne/1944324598.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!