测试

java.lang

String

String 是 Java 中的字符串表示,且该对象被 final 修饰,是不可变的。创建String 对象的方式有两种:1、通过双引号直接赋值。2、通过构造函数。

因为 String 是不可变的,所以对于 String 对象的任何操作(不涉及字符串常量池),产生的都是新的字符串。

//b 与 c 是同一个对象,a 与 d 不是同一个对象,a 与 b、d 与 b 也不是同一个对象。
String a=new String("123");
String b="123";
String c="123";
String d=new String("123");

通过构造函数创建的字符串是放在堆内存中,每次创建的都是不同的对象。而通过双引号创建的 String 对象会被放在字符串常量池中(位于方法区),相同字符序列是同一个对象。除了使用双引号创建 String 对象或使用对象的intern()方法,不然别的方式得到的 String 对象都是属于第二种,不会放到常量池中。

String 的构造函数:

方法 描述
String() 创建一个空字符串
String(String original) 初始化新创建的String对象,使其表示与参数相同的字符序列
String(StringBuffer buffer) 用于将 StringBuffer 转换为 String 类型
String(StringBuilder builder) 用于将 StringBuilder 转换为 String 类型
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(T[] t) 其中 T 可以是 char,int类型

根据索引得到某位置的字符

​ 1、charAt(int index)

​ String 的索引从 0 开始,所以长度为 3 的字符串,最大索引为 2。该方法返回值为 char 类型。

​ 2、codePointAt(int index)

​ 返回字符串中第 index 位字符的 ascii 编码,该方法的返回值为 int 类型。

​ 3、codePointBefore(int index)

​ 返回字符串中第 index 位之前的一个字符的 ascii 编码,该方法的返回值为 int 类型。

​ 4、codePointCount(int beginIndex, int endIndex)

​ 返回此 String指定文本范围(前闭后开)内的Unicode代码点数。

根据字符得到索引位置

​ 1、indexOf(int ch) 和 indexOf(int ch, int fromIndex)

​ 返回指定字符第一次出现的字符串内的索引,fromIndex表示从某个位置开始检索

​ 2、indexOf(String str) 和 indexOf(String str, int fromIndex)

​ 返回指定子字符串第一次出现的字符串内的索引,fromIndex表示从某个位置开始检索

这两个方法是查找第一次出现的索引位置,对应的 lastIndexOf() 方法是查找最后一次出现的索引位置。

判断

1、equals(Object anObject)

​ 将此字符串与指定对象进行比较,如果内容相等则返回 true。

2、equalsIgnoreCase(String anotherString)

​ 将此 String与其他 String的内容进行比较,忽略字符大小写,如果相等则返回 true。

3、endsWith(String suffix)

​ 判断此字符串是否以指定的后缀结尾。

4、startsWith(String prefix)

​ 判断此字符串是否以指定的前缀开头。

startsWith(String prefix, int toffset):判断在指定索引处开始的此字符串的子字符串是否以指定的前缀开头。

5、isEmpty()

​ 判断字符串是否为空。空是”“、没有赋值为 null、空格字符串是” “,这是不一样的概念。

6、matches(String regex)

​ 判断该字符串是否匹配给定的正则表达式。

7、contains(CharSequence s)

​ 当且仅当此字符串包含指定的char值序列时才返回true。

将基本数据类型转换为String类型

1、valueOf()

​ 该方法是静态方法,返回 String 类型,可将基本数据类型、char 类型的数组、Object 类型作为参数。其中传入 Object 实际调用的是 Object 的 toString() 方法。

static String	valueOf(boolean b) //返回 boolean参数的字符串 boolean形式。
static String	valueOf(char c) //返回 char参数的字符串 char形式。
static String	valueOf(char[] data) //返回 char数组参数的字符串 char形式。
static String	valueOf(double d) //返回 double参数的字符串 double形式。
static String	valueOf(float f) //返回 float参数的字符串 float形式。
static String	valueOf(int i) //返回 int参数的字符串 int形式。
static String	valueOf(long l) //返回 long参数的字符串 long形式。
static String	valueOf(Object obj) //返回 Object参数的字符串 Object形式。
static String	valueOf(char[] data, int offset, int count) //返回 char数组参数的特定子阵列的字符串 char形式。

如果给出的数值不能转化为 String,valueOf()方法会抛出异常。

2、toString()

这里调用的不是 String 的 toString()方法,而是基本数据类型的包装类的 toString 方法。

Integer.toString(int i);
Character.toString(char c);
...

将 String 类型转换为基本数据类型,可通过包装类的parseXxx()方法:

Integer.parseInt(String s);
...

包装类的 parseXxx() 方法作用是将 String 类型转换为基本数据类型。Character类是没有 parseXxx()方法的。但是 String 类有 toCharArray() 方法,可将此字符串转换为新的字符数组。

将 char 类型转换为 int 类型是常见的,转换方法为

Integer.parseInt(String.valueOf(char c));

如果直接将 char 赋值给 int,虽然不会报错,但是 int 的值却是 char 类型的 ASCII 码表示。

public static void main(String[] args) {
        char a = '1';
        int b = a;
        System.out.println(b);
    }
//结果
49

1 这个字符的 ASCII 码表中就是用 49 这个数字表示的。常用的还有 a 使用 97 表示的,b 使用 98 表示的。

截取字符串

1、split(String regex) 和 split(String regex, int limit)

​ 按照给定的正则表达式切分字符串,返回 String[]。

limit参数控制应用模式的次数,因此影响生成的数组的长度。 如果极限n大于0,则模式最多应用n -1次,数组的长度不大于n ,数组的最后一个条目将包含超出最后一个匹配分隔符的所有输入。 如果n是非正的,那么模式将被应用到尽可能多的次数,并且数组可以有任何长度。 如果n为0,则模式将被应用尽可能多次,数组可以有任何长度,并且尾随的空字符串将被丢弃。

 public static void main(String[] args) {
        String s="a!b!ca!!!!df";
        String[] s1 = s.split("!");
        String[] s2 = s.split("!{1,}");
        System.out.println("s1="+Arrays.toString(s1));
        System.out.println("s2="+Arrays.toString(s2));
    }
//结果
s1=[a, b, ca, , , , df]
s2=[a, b, ca, df]

注意二者的区别,当切割符连续 n 次时,会出现 n-1 个空字符。

2、substring(int beginIndex)

​ 返回一个字符串,从原字符串的 beginIndex 位置开始,直到最后。索引从 0 开始

3、substring(int beginIndex, int endIndex)

​ 返回一个字符串,从原字符串的 beginIndex 位置开始,直到 endIndex 的前一位。遵循前闭后开的原则

public static void main(String[] args) {
        String s="012345";
			  System.out.println(s.substring(2,2));
        System.out.println(s.substring(2,4));
}
//结果

23

第一个结果为空字符串。

4、subSequence(int beginIndex, int endIndex)

​ 作用同 subString()方法,只是该方法的返回值类型为 CharSequence。

该方法是属于 CharSequence 接口,因为 String 类实现了 CharSequence接口,所以重写了里面的方法。CharSequence接口的意思就是 char 序列,charAt()方法也是该接口的。

5、trim()

​ 返回一个字符串,其值为原字符串删除任何前导和尾随空格。

转换大小写

1、toLowerCase() 和 toUpperCase()

​ 将所有在此字符 String使用默认的语言环境规则转换为小写或大写。

2、toLowerCase(Locale locale) 和 toUpperCase(Locale locale)

​ 将所有在此字符 String使用指定的语言环境规则转换为小写或大写。

其中 Locale 是java.util 包下的一个类:

public final class Locale implements Cloneable, Serializable {

    static private final  Cache LOCALECACHE = new Cache();
  
    static public final Locale ENGLISH = createConstant("en", "");

    static public final Locale CHINESE = createConstant("zh", "");
		...
}

内部定义了很多的静态常量,用于指明语言环境。其实没啥用,就用默认的就行了,基本都是英文字母之间大小写的转换。可能别的国家的语言也会有不同的转换规则,所以为 String 的方法设计了这个参数。

替换

1、replace(char oldChar, char newChar)

​ 用 newChar 替换字符串中的所有 oldChar。

2、replace(CharSequence target, CharSequence replacement)

​ 将与字面目标序列匹配的字符串的每个子字符串替换为指定的字面替换序列。

CharSequence也是使用双引号表示,同 String,因为 String 就是它的子类。

3、replaceAll(String regex, String replacement)

​ 用 replacement 替换原字符串中与正则表达式相匹配的每个子串。

4、replaceFirst(String regex, String replacement)

​ 用 replacement 替换原字符串中与正则表达式相匹配的第一个子串,从左边开始。

StringBuilder

java.util

regex

java.util.regex 包是 Java 的正则表达式包,内部包含一个接口:MatchResult,三个类:MatcherPatternPatternSyntaxException

PatternSyntaxException 是异常类,属于运行时异常。Matcher 实现了 MatchResult 接口,Pattern 是正则表达式类。

Pattern

该类是正则表达式的编译表示,该类的构造方法为私有,可通过静态方法 compile() 来创建 Pattern 对象。

//私有构造
private Pattern(String p, int f) {...}
//compile()方法
public static Pattern compile(String regex) {return new Pattern(regex, 0);}
public static Pattern compile(String regex, int flags) {return new Pattern(regex, flags);}

flags为可选模式(如:Pattern.CASE_INSENSITIVE 忽略大小写)。

Matcher

正则表达式

正则语法

1、普通字符

字母、数字、汉字、下划线、以及没有特殊含义的标点符号都是正则中的普通字符。在匹配时,表达式中的普通字符匹配与之相同的一个字符。

2、转义字符

转义字符 描述
\n 换行符
\t 制表符
\r 回车符
\\\$\.\(\)\{\}\[\]\?\+\*|\^ 表示这些字符本身

3、标准的字符集合

字符 描述
\d 匹配一个数字
\w 匹配一个字母或数字或下换线
\s 匹配空格、制表符、换行符等空白字符的其中任意一个
. 匹配任意一个字符(除了换行符)

注意区分大小写,大写表示相反的意思。如:\d 代表一个非数字字符

4、自定义字符集合

使用 [] 方括号的匹配方式,能够匹配方括号中的任意一个字符,一对 [] 方括号表示一个字符。^ 在方括号中表示非的意思,- 在方括号中表示之间的意思。

[abc] :匹配 a 或 b 或 c
[^abc]:匹配任意一个字符,除了 a、b、c
[0-9f-k]:匹配 0-9,f-k之间的任意一个字符,包含 0、9、f、k
[^0-9]:匹配任意一个字符,除了 0-9 之间的数字

对于特殊字符:除了 ^ 和 - ,正则中别的特殊字符在方括号中就会失去特殊意义。

对于标准字符集合:除了小数点,别的字符被包含在方括号中还具有它本身的作用。

5、量词

修饰匹配次数的特殊符号。

字符 描述
表达式重复 n 次
表达式至少重复 m 次,至多重复 n 次
表达式至少重复 m 次,没有{,n}这样的写法
? 匹配表达式 0 次或者 1 次,相当于
+ 表达式至少出现 1 次,相当于
* 表达式不出现或出现任意次,相当于

这里的表达式只是这些符号前面的一个,而不是整个表达式。默认为贪婪匹配模式。

示例:

\d{2}:匹配连续两个数字
\d\d{2}:匹配连续三个数字,并不是匹配连续 4 个数字
(\d\d){2}:匹配连续 4 个数字
\d{2,6}:默认为贪婪模式,即匹配的字符越多越好。如:1234567会匹配 123456。12345f67,会匹配 12345。
\d{2,6}?:表示非贪婪模式,即匹配的字符越少越好。如:1234567会匹配 123,456。1234f567,会匹配 123,567。
a\d?b:表示 a 与 b 之间没有数字或有一个数字

6、零宽字符

字符 描述
^ 与字符串开始的地方相匹配
$ 与字符串结尾的地方相匹配
\b 匹配一个单词边界,前面的字符和后面的字符不全是\w

判断是整个字符串,是否以某字符开头或结尾

示例:

字符串:为 wei wei1 1wei1 123,ff
  
^为:会匹配字符串开头处的“为”,或者说如果字符串以"为"开头,则匹配成功
f$:会匹配字符串结尾处的“f”,或者说如果字符串以"f"结尾,则匹配成功
wei\b:只会匹配“为”后面的 wei
\bwei:会匹配“为”后面的 wei 和 wei1中 1 前面的 wei
\bwei\b:只会匹配“为”后面的 wei

7、匹配模式

IGNORECASE 忽略大小写模式:匹配时或略大小写,默认是区分大小写的。

SINGLELINE 单行模式:整个文本看做一个字符串,只有一个开头,一个结尾。

在单行模式下,.可以匹配包括\n在内的任意字符

MULTILINE 多行模式:每行都是一个字符串,每行都有开头和结尾。默认为单行模式

^表示匹配字符串的开头,$表示匹配字符串的结尾。在多行模式下,这两个匹配的都是每行的开头和结尾,这时,可以使用\A\Z 来分别达到 ^ $ 在单行模式下的作用。

8、选择符和分组

字符 描述
` `
() 括号内的为一个整体
(?:Expression) 默认清空下,()匹配到的内容会保存在内存中,有时只是需要使用()的功能但并不需要在内存中保存匹配到的内容,这时就可以使用这种形式

每一对括号都会有一个编号,是以左括号的顺序从 1 开始计算的。如 ((aa)(bb)),从左边数左括号的位置就是这对括号的编号,最外边的()编号为 1、包裹 aa 的括号编号为 2、包裹 bb 的括号编号为 3。

反向引用:

字符串:aabbcc
(a)\1 : \1就表示(a)这个括号,相当于(a)(a)
((a)(b))\2 :相当于((a)(b))(a)
((a)(b))\3 :相当于((a)(b))(b)
(?:(a)(b)) :相当于((a)(b)),只是不会将匹配到的内容保存到内存中,去掉了()带来的副作用
(?:(a)(b))\3 :什么都不会匹配到,因为不会保存内容,所以\3失效

Scanner

该类表示扫描器

posted @ 2021-04-19 11:03  车马那么慢  阅读(96)  评论(2)    收藏  举报