文章目录
String类
String类在Java属于引用类型,字符串在刷题时也是十分常见,Java语言提供了String类和相对应的各种操作方法。
String类基本使用
创建字符串
字符串的创建方法有三种:
//常量字符串创建
String str1 = "hello world";
//new创建
String str2 = new String("hello world");
//字符数组创建
char[] arr = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
String str3 = new String(arr);
String类中的中存储着数组value[]
和hash
,value中存放的地址指向的内存存放字符串内容。
String对象的比较
== 和 equals
==运算符用于基本类型的比较时,比较的是两个基本类型的值,用于引用类型比较时,比较的是两个引用的地址是否相同。
public class Test{
public static void main(String[] arg){
int a = 1, b = 1, c = 2;
System.out.println(a == b);//true
System.out.println(a == c);//false
}
}
equals方法默认是使用==进行判断,String类对equals进行了重写。
public boolean equals(Object anObject)
方法,将调用对象和指定对象进行比较,调用equals进行字符串间的比较时,先使用==比较两个对象引用的地址是否相同,不同则进行类型转换,然后从首个字符开始逐个向后比较比较,若全部相同返回true,否则返回false。
public class Test {
public static void main(String[] args) {
String str1 = "hello world";
String str2 = "hello world";
String str3 = "world";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//false
}
}
compareTo 和 compareToIgnoreCase
public int compareTo(String anotherString)
compareTo方法是根据以Unicode为基准的字典序对两个字符串中的同位置字符进行比较,若String 对象位于参数字符串之前,则比较结果为一个负整数。 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0。
compareToIgnoreCase方法与compareTo类似,不同之处在于compareToIgnoreCase忽略大小写。
String常用操作方法
此处列出部分常用的字符串操作方法
输出和查找等
方法 | 说明 |
---|---|
char charAt(int index) | 返回指定索引处的 char 值 |
int codePointAt(int index) | 返回指定索引处的字符Unicode |
String concat(String str) | 将指定字符串连接到此字符串的结尾 |
boolean contains(CharSequence s) | 当且仅当此字符串包含指定的char 值序列时,返回 true |
static String format(String format, Object… args) | 使用指定的格式字符串和参数返回一个格式化字符串 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
int indexOf(String str, int fromIndex) | 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 |
int lastIndexOf(String str) | 返回指定字符在此字符串中最后一次出现处的索引 |
int length() | 返回此字符串的长度 |
CharSequence:接口,已知实现类为CharBuffer,Segment,String,StringBuffer,StringBuilder
转化
方法 | 说明 |
---|---|
static String copyValue(char[] data) | 返回指定数组中表示该字符序列的 String |
byte[] getBytes() | 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的byte 数组中 |
char[] toCharArray() | 将此字符串转换为一个新的字符数组 |
String toLowerCase | 使用默认语言环境的规则将此 String 中的所有字符都转换为小写 |
static String valueOf(Base ) | 返回Base 参数的字符串表示形式,``Base`可以是基本类型,也可以是Object,char[] |
String replace(char oldChar, char newChar) | 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的 |
拆分和截取
方法 | 说明 |
---|---|
String split(String regex) | 根据给定的正则表达式匹配拆分此字符串 |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它是此字符串的一个子字符串 |
字符串常量池
字符串常量池实际上是一张固定大小的哈希表。为了提高运行效率和节省空间,Java为8种基本数据类型和String都提供了常量池。Java8的字符串常量池位于堆中,受整个应用程序内存大小限制。
字符串的创建
字面常量直接赋值
这种方式首先会检查常量池是否存在该字符串对象引用,若存在则返回对象的引用,否则在堆区创建该字符串对象,字符串常量池存放此对象引用,然后返回
String s1 = "hello world";//在中堆区创建对象,常量池存放该对象引用,然后返回对象引用
String s2 = "hello world";//先在常量池检查,存在该对象引用,返回
System.out.println(s1 == s2);//true
new创建对象
通过new创建的对象,会在堆区上创建对象,常量池创建对应字符串
String s1 = new String("hello world");//在堆区中创建对象,常量池存放该对象引用,然后返回对象引用
String s2 = new String("hello world");//在堆区中创建对象,value[]指向堆区中的字符串
String str = new String(new char[]{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'});
//在堆区中创建对象,利用copyOf将字符数组内容拷贝至String对象中
System.out.println(s1 == s2);//false
intern方法
intern方法的作用是手动把字符串对象添加入常量池中,当调用该方法时,会先检查字符串常量池中的字符串引用,若存在则返回引用,若不存在则把该字符串加入常量池,返回该引用
char[] ch = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' };
String s1 = new String(ch);//此时字符串没有被添加入常量池中
String s2 = s1.intern();//调用后会将s1指向字符串加入常量池中,返回其引用
StringBuffer和StringBuilder
String类在设计时就是不可改变的类型,在java.lang中String类和value[]都是被final修饰
/**
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
*/
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
在对字符串进行操作,如复制、替换等,都是创建一个新的String对象进行操作,处理的对象数量较多时,运行的效率低,因此Java提供了StringBuffer类和StringBuilder类
区别
-
String字符串对象内容不可修改,StringBuffer和StringBuilder字符串对象内容可修改
-
StringBuffer和StringBuilder方法大部分相似
-
StringBuffer采用同步处理,属于线程安全操作,StringBuilder没有采用同步处理,属于线程不安全操作
操作方法
StringBuilder类常用的方法有
方法 | 说明 |
---|---|
StringBuilder append(char c) | 将 char 参数的字符串表示形式追加到此序列 |
StringBuilder append(String str) | 将指定的字符串追加到此字符序列 |
int capacity() | 返回当前容量 |
char charAt(int index) | 返回此序列中指定索引处的 char 值 |
StringBuilder delete(int start, int end) | 移除此序列的子字符串中的字符 |
int indexOf(String str) | 返回第一次出现的指定子字符串在该字符串中的索引 |
StringBuilder insert(int offset, String str) | 将字符串插入此字符序列中 |
int lastIndexOf(String str) | 返回最右边出现的指定子字符串在此字符串中的索引 |
StringBuilder replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符 |
StringBuilder reverse() | 将此字符序列用其反转形式取代 |
CharSequence subSequence(int start, int end) | 返回一个新字符序列,该字符序列是此序列的子序列 |
String substring(int start) | 返回一个新的 String ,它包含此字符序列当前所包含字符的子序列 |
String toString() | 返回此序列中数据的字符串表示形式 |
int length() | 返回长度(字符数) |
本文的主要目的为记录学习笔记,同时强化学习效果,兼有分享所学之意,欢迎批评指正