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()

目录
相关文章
|
6天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
12天前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
23天前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
36 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
6天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
22天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
42 8
|
22天前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
45 7
|
19天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
29 2
|
22天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
42 1
|
1月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
58 17
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。

热门文章

最新文章