本文最后更新于:December 3, 2021 pm
JAVA基础知识快速复习(一)。包括数组的基本操作、三大特性、字符串及其有关的操作。
目录 1.遍历数组 int [] ns = { 1 , 4 , 9 , 16 , 25 };for (int i=0 ; i<ns.length; i++) { int n = ns[i]; System.out.println(n); }int [] ns = { 1 , 4 , 9 , 16 , 25 };for (int n : ns) { System.out.println(n); }int [] ns = { 1 , 1 , 2 , 3 , 5 , 8 }; System.out.println(Arrays.toString(ns));
2.封装、继承、多态
子类自动获得了父类的所有字段,不能定义与父类重名的字段!在OOP的术语中,我们把Person称为超类(super class),父类(parent class),基类(base class),把Student称为子类(subclass),扩展类(extended class)。
Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有Object特殊,它没有父类。
super关键字表示父类(超类)。任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。
Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override。继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final。用final修饰的方法不能被Override。
如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。因为无法执行抽象方法,因此这个类也必须申明为抽象类,使用abstract修饰。无法实例化一个抽象类。
一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。在接口中,可以定义default方法。实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。
2.1 阻止继承 正常情况下,只要某个class没有final修饰符,那么任何类都可以从该class继承。从Java 15开始,允许使用sealed
修饰class,并通过permits
明确写出能够从该class继承的子类名称。这种sealed
类主要用于一些框架,防止继承被滥用。
public sealed class Shape permits Rect , Circle , Triangle { ... }
3.字符串 Java字符串String是不可变对象。字符串操作不改变原字符串内容,而是返回新字符串。
3.1 字符串比较
两个字符串比较,总是使用equals()方法。== 比较的是两个的地址。
忽略大小写比较(equalsIgnoreCase()
)
String s1="abcdefghijklmnopkrstuvwxyz" String s2="ABCDEFGHIJKLMNOPKRSTUVWXYZ" boolean flag=s1.equalsIgnoreCase(s2)
3.2 查找子串
String s = "abcdefghijklmnopkrstuvwxyz" ; System.out.println(s.contains("bc" )); System.out.println(s.contains("bd" ));true false
查看子串是否在母串的开始(startsWith()
)
String s = "abcdefghijklmnopkrstuvwxyz" ; System.out.println(s.startsWith("abc" )); System.out.println(s.startsWith("bcd" ));true false
String s = "abcdefghijklmnopkrstuvwxyz" ; System.out.println(s.endsWith("wxy" )); System.out.println(s.endsWith("xyz" ));false true
找子串第一次出现的下标,从下标0开始(indexOf()
),没有找到返回-1
String s = "abcdabcedaaq" ; System.out.println(s.indexOf("bc" )); System.out.println(s.indexOf("fgh" ));1 -1
找子串最后一次出现的下标(lastIndexOf()
)
String s = "abcdbcq" ; System.out.println(s.lastIndexOf("bc" )); System.out.println(s.lastIndexOf("fgh" ));4 -1
String s = "abbcccdddd" ; System.out.println(s.substring(2 )); System.out.println(s.substring(1 ,5 )); bcccdddd bbcc
3.3 去除首位空白字符
去除字符串首尾空白字符(trim()
)。空白字符包括空格,\t,\r,\n
:
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();
移除字符串首尾空白字符(strip()
)。它和trim()
不同的是,类似中文的空格字符\u3000也会被移除。
"\u3000Hello\u3000" .strip(); " Hello " .stripLeading(); " Hello " .stripTrailing();
3.4 判断字符串 判断字符串是否为 空(isEmpty()
)和空白字符串(isBlank()
)
"" .isEmpty(); " " .isEmpty(); " \n" .isBlank(); " Hello " .isBlank();
3.5 替换 替换子串(replace()
),返回一个新字符串。
String s = "abcbabca" ; String s1 = s.replace('a' ,'t' ); String s1 = s.replace("ab" ,"tttt" );
正则表达式替换:
String s = "A,,B;C ,D" ; s.replaceAll("[\\,\\;\\s]+" , "," );
3.6 分割字符串 split(),其中表达式就是一个正则表达式。返回的是一个字符串数组。
特殊情况(斜线\
)
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]); }
需要加双斜线的:+
、*
、$
、^
、
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
其他
String s = "ab,cde,fgh" ; String[] s1 = s.split("," ); ab cde fgh
多个符号作为分隔符,使用多个分隔符则需要借助 |
符号
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 类型转换
其他类型转字符(String.valueOf()),返回一个字符串。
int n = 15 ; String nns = Integer.toString(n); System.out.println(Integer.toString(n));boolean fl = false ; System.out.println(Boolean.toString(fl)); 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 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 ); System.out.println(Integer.valueOf(s)); String sint = "123456" ;int resu = Integer.parseInt(sint);int re = Integer.parseInt(sint,11 ); System.out.println(resu); resu+=10 ; System.out.println(resu); String sbool = "true" ;boolean fresu = Boolean.parseBoolean(sbool); if (fresu) { System.out.println("YES" ); } else { System.out.println("NO" ); } String sdouble = "13.324" ;double resu2 = Double.parseDouble(sdouble); System.out.println(resu2);
要特别注意,Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer。例如:
Integer.getInteger("java.version" );
将整数格式化为指定进制的字符串
System.out.println(Integer.toString(100 )); System.out.println(Integer.toString(100 , 36 )); System.out.println(Integer.toHexString(100 )); System.out.println(Integer.toOctalString(100 )); System.out.println(Integer.toBinaryString(100 )); System.out.println(Integer.toString(100 , radix));
3.10 字符串与char[]相互转化 char [] cs = "Hello" .toCharArray(); String s = new String(cs);
如果修改了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(); System.out.println("StringBuilder:" +strB.append("ch" ).append("111" ).append('c' )); System.out.println("String:" +strB.toString()); System.out.println("StringBuilder.appendCodePoint:" +strB.appendCodePoint(2 )); strB.setCharAt(2 , 'd' ); System.out.println("StringBuilder.setCharAt:" + strB); System.out.println("StringBuilder.insertString:" + strB.insert(2 , "LS" )); System.out.println("StringBuilder.insertChar:" + strB.insert(2 , 'L' )); System.out.println("StringBuilder.delete:" + strB.delete(2 , 4 ));
示例:
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" ); System.out.println(sb); String mid = sb.toString(); System.out.println(mid); sb.insert(1 ,"www." ); System.out.println(sb); sb.delete(1 ,5 ); System.out.println(sb); sb.setCharAt(1 ,'w' ); System.out.println(sb); sb.appendCodePoint(65 ); System.out.println(sb); tothefor tothefor.com tothefor.com twww.othefor.com tothefor.com twthefor.com twthefor.comA