Java:String类再回顾(下)

简介: Java:String类再回顾(下)

按字典顺序比较两个字符串,不考虑大小写


compareToIgnoreCase()


关于这个方法,不管参数是对象还是字符串,最终要比较的都是两个字符串的不同,以下称调用方法那边的为原字符串,方法参数里的为参数字符串。


这个方法分为两种比较方式:


1、不同的字符在较短字符串长度之内时


返回值=原字符串与参数字符串中第一个不同字符相差的ASCII码值,为原减参。

例子如下:


String str1="javDscrspt";
String str2="jAvascript";
str1.compareToIgnoreCase(str2);

此时返回值为3,是d的ASCII码(100)减去了a的ASCII码值(97)得到或者D与A相差得到的。


注意:只比较第一个不同(这个方法里不考虑字母大小写)的字符,后面的s和i也不一样但不会进行比较了,无关字母大小写所以只比较相同格式下相差的ASCII码值。


2、不同的字符在较短字符串长度之外时


返回=原字符串与参数字符串相差的字符个数,原字符串长度大时为正,反之为负。


例子如下:

String str1="javAScript";
String str2="JaVa";
str1.compareToIgnoreCase(str2);

此时返回值为6,是str1相比str2多出来的字符个数。


注意:此时只比较位数,而无关ASCII码值,并非是S(s)的ASCII码值减去0的ASCII码值,在参数字符串前面字符和原字符串一样时,返回值就是两者相差的字符个数,即使改变后面的字符也不会影响到返回的值,比如String str1=“jAva233666”,此时结果仍是6。


当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真


boolean contentEquals(StringBuffer sb)

返回指定数组中表示该字符序列的 String


static String copyValueOf(char[] data)

static String copyValueOf(char[] data, int offset, int count)

测试此字符串是否以指定的后缀结束


boolean endsWith(String suffix)

将字符串与指定的对象比较,不考虑大小写


boolean equalsIgnoreCase(String anotherString)

使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中


byte[] getBytes()


可用如下方法查看字符串用 getBytes() 方法处理后返回的 byte[] 数组中的内容:

class Main {
    public static void main(String[] args) {
    String str = "make a fortune";
    byte[] byt = str.getBytes();
        for (byte b : byt) {
            System.out.println(b);
        }
    }
}

以上程序运行结果为:

109
97
107
101
32
97
32
102
111
114
116
117
110
101


可见 byte[] 数组中存放的是字符串响应位置对应的字母的哈希值,如字符串中的字母 a 对应 byte[] 数组中的 97 。


另外:返回的 byte[] 数组的长度,与原字符串的长度相等


使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中


byte[] getBytes(String charsetName)

将字符从此字符串复制到目标字符数组


void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

返回此字符串的哈希码


int hashCode()

返回指定字符在此字符串中第一次出现处的索引


int indexOf()

返回字符串对象的规范化表示形式


String intern()


尽管在输出中调用intern方法并没有什么效果,但是实际上后台这个方法会做一系列的动作和操作。在调用”ab”.intern()方法的时候会返回”ab”,但是这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。


可以看下面一个范例:

String str1 = "a";
String str2 = "b";
String str3 = "ab";
String str4 = str1 + str2;
String str5 = new String("ab");
System.out.println(str5.equals(str3));
System.out.println(str5 == str3);
System.out.println(str5.intern() == str3);
System.out.println(str5.intern() == str4);

得到的结果:

true
false
true
false

为什么会得到这样的一个结果呢?我们一步一步的分析。


第一、str5.equals(str3)这个结果为true,不用太多的解释,因为字符串的值的内容相同。

第二、str5 == str3对比的是引用的地址是否相同,由于str5采用new String方式定义的,所以地址引用一定不相等。所以结果为false。

第三、当str5调用intern的时候,会检查字符串池中是否含有该字符串。由于之前定义的str3已经进入字符串池中,所以会得到相同的引用。

第四,当str4 = str1 + str2后,str4的值也为”ab”,但是为什么这个结果会是false呢?先看下面代码:

String a = new String("ab");
String b = new String("ab");
String c = "ab";
String d = "a" + "b";
String e = "b";
String f = "a" + e;
System.out.println(b.intern() == a);
System.out.println(b.intern() == c);
System.out.println(b.intern() == d);
System.out.println(b.intern() == f);
System.out.println(b.intern() == a.intern());

运行结果:

false
true
true
false
true

由运行结果可以看出来,b.intern() == a和b.intern() == c可知,采用new 创建的字符串对象不进入字符串池,并且通过b.intern() == d和b.intern() == f可知,字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量(如f中的e)则不会进入字符串池中。但是字符串一旦进入字符串池中,就会先查找池中有无此对象。如果有此对象,则让对象引用指向此对象。如果无此对象,则先创建此对象,再让对象引用指向此对象。


当研究到这个地方的时候,突然想起来经常遇到的一个比较经典的Java问题,就是对比equal和的区别,当时记得老师只是说“”判断的是“地址”,但是并没说清楚什么时候会有地址相等的情况。现在看来,在定义变量的时候赋值,如果赋值的是静态的字符串,就会执行进入字符串池的操作,如果池中含有该字符串,则返回引用。


执行下面的代码:

String a = "abc";
String b = "abc";
String c = "a" + "b" + "c";
String d = "a" + "bc";
String e = "ab" + "c";
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
System.out.println(a == e);
System.out.println(c == d);
System.out.println(c == e);

运行的结果:

true
true
true
true
true
true


返回指定字符在此字符串中最后一次出现处的索引


lastIndexOf()

检测字符串是否匹配给定的正则表达式


matches()

测试两个字符串区域是否相等


boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)

替换为新字符串


replace()

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串


replaceAll()

使用给定的参数 replacement 替换字符串第一个匹配给定的正则表达式的子字符串


replaceFirst()

根据给定正则表达式的匹配拆分此字符串


split()


. 必须得加转义字符**\**,以下是拆分 IP 地址的实例:


public class Demo {
    public static void main(String args[]) {
        String str = "192.168.1.1";
        // . 必须得加 转义字符\\
        for(String s : str.split("\\.")){
            System.out.println(s);
        }
    }
}

检测字符串是否以指定的前缀开始


startsWith()

返回一个新的字符序列,它是此序列的一个子序列


subSequence() (返回的是String)

substring() (返回的是实现了CharSequence接口的类,可以直接下转为String对象)

将字符串转换为字符数组


toCharArray()

将字符串转换为小写


toLowerCase()

返回此对象本身


toString()

将字符串小写字符转换为大写


toUpperCase()

用于删除字符串的头尾空白符


trim()

返回给定data type类型x参数的字符串表示形式


valueOf()
System.out.println(s);
}
}
}
```


检测字符串是否以指定的前缀开始


startsWith()

返回一个新的字符序列,它是此序列的一个子序列


subSequence() (返回的是String)

substring() (返回的是实现了CharSequence接口的类,可以直接下转为String对象)

将字符串转换为字符数组


toCharArray()

将字符串转换为小写


toLowerCase()

返回此对象本身


toString()

将字符串小写字符转换为大写


toUpperCase()

用于删除字符串的头尾空白符


trim()

返回给定data type类型x参数的字符串表示形式


valueOf()

目录
相关文章
|
19小时前
|
存储
MyString:string类的模拟实现
MyString:string类的模拟实现
|
19小时前
string类重要接口(2):`+=`
string类重要接口(2):`+=`
|
19小时前
string类:`reserve()`,`resize()`详解
string类:`reserve()`,`resize()`详解
|
20小时前
|
存储 编译器 C语言
【C++航海王:追寻罗杰的编程之路】string类
【C++航海王:追寻罗杰的编程之路】string类
5 0
|
1天前
|
Java 机器人 程序员
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
1天前
|
Java 机器人 关系型数据库
Java中的类与接口:抽象与实现的艺术
Java中的类与接口:抽象与实现的艺术
|
1天前
|
Java
java反射-获取类的属性、构造方法、方法
java反射-获取类的属性、构造方法、方法
3 0
|
1天前
|
Java
java反射-获取类的Class对象方式
java反射-获取类的Class对象方式
3 0
|
1天前
|
存储 自然语言处理 Java
Java-File类与IO流(2)
Java-File类与IO流(2)
6 0
|
1天前
|
JSON Java 数据格式
IDEA插件-JSON转java类
IDEA插件-JSON转java类
7 0