Java 字符串

Java 字符串是 String 类!

Java 字符串工具类

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:

String str = "abc";

等效于:

char data[] = {'a', 'b', 'c'};
String str = new String(data);

Java 字符串特点

  • 字符串是不变的,字符串的值在创建以后是不可以被更改的,
  • 相同字符串可以被共享(内存地址一样)
  • 无法被其它类继承
    • 面试中也会问到,String 可以被继承吗?为什么?
  • 一切的一切,源于final 的修饰

相同字符串内存地址一样

public class Test
{
  public static void main(String[] args) {
    String str1 = "abc";
    String str2 = "abc";
    System.out.println("str1 的内存地址 = " + System.identityHashCode(str1));
    System.out.println("str2 的内存地址 = " + System.identityHashCode(str2));
  }
}

输出结果

str1 的内存地址 = 366712642
str2 的内存地址 = 366712642

Java 字符串本身提供的api方法

char charAt(int index)
返回指定索引处的 char 值。
int codePointAt(int index)
返回指定索引处的字符(Unicode 代码点)。
int codePointBefore(int index)
返回指定索引之前的字符(Unicode 代码点)。
int codePointCount(int beginIndex, int endIndex)
返回此 String 的指定文本范围中的 Unicode 代码点数。
int compareTo(String anotherString)
按字典顺序比较两个字符串。
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写。
String concat(String str)
将指定字符串连接到此字符串的结尾。
boolean contains(CharSequence s)
当且仅当此字符串包含指定的 char 值序列时,返回 true。
boolean contentEquals(CharSequence cs)
将此字符串与指定的 CharSequence 比较。
boolean contentEquals(StringBuffer sb)
将此字符串与指定的 StringBuffer 比较。
static String copyValueOf(char[] data)
返回指定数组中表示该字符序列的 String。
static String copyValueOf(char[] data, int offset, int count)
返回指定数组中表示该字符序列的 String。
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
boolean equals(Object anObject)
将此字符串与指定的对象比较。
boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。
static String format(Locale l, String format, Object... args)
使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
static String format(String format, Object... args)
使用指定的格式字符串和参数返回一个格式化字符串。
byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
byte[] getBytes(Charset charset)
使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)
已过时。 该方法无法将字符正确转换为字节。从 JDK 1.1 起,完成该转换的首选方法是通过 getBytes() 方法,该方法使用平台的默认字符集。
byte[] getBytes(String charsetName)
使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此字符串复制到目标字符数组。
int hashCode()
返回此字符串的哈希码。
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引。
int indexOf(int ch, int fromIndex)
返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(String str, int fromIndex)
返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
String intern()
返回字符串对象的规范化表示形式。
boolean isEmpty()
当且仅当 length() 为 0 时返回 true。
int lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引。
int lastIndexOf(int ch, int fromIndex)
返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
int lastIndexOf(String str)
返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(String str, int fromIndex)
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
int length()
返回此字符串的长度。
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。
int offsetByCodePoints(int index, int codePointOffset)
返回此 String 中从给定的 index 处偏移 codePointOffset 个代码点的索引。
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等。
boolean regionMatches(int toffset, String other, int ooffset, int len)
测试两个字符串区域是否相等。
String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement)
使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement)
使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit)
根据匹配给定的正则表达式来拆分此字符串。
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始。
boolean startsWith(String prefix, int toffset)
测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
CharSequence subSequence(int beginIndex, int endIndex)
返回一个新的字符序列,它是此序列的一个子序列。
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。
char[] toCharArray()
将此字符串转换为一个新的字符数组。
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String toLowerCase(Locale locale)
使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。
String toString()
返回此对象本身(它已经是一个字符串!)。
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
String toUpperCase(Locale locale)
使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。
String trim()
返回字符串的副本,忽略前导空白和尾部空白。
static String valueOf(boolean b)
返回 boolean 参数的字符串表示形式。
static String valueOf(char c)
返回 char 参数的字符串表示形式。
static String valueOf(char[] data)
返回 char 数组参数的字符串表示形式。
static String valueOf(char[] data, int offset, int count)
返回 char 数组参数的特定子数组的字符串表示形式。
static String valueOf(double d)
返回 double 参数的字符串表示形式。
static String valueOf(float f)
返回 float 参数的字符串表示形式。
static String valueOf(int i)
返回 int 参数的字符串表示形式。
static String valueOf(long l)
返回 long 参数的字符串表示形式。
static String valueOf(Object obj)
返回 Object 参数的字符串表示形式。

Java String 基本操作方法

  • lenght() 获取字符串长度
  • chatAt(index) 获取指定索引位置中的字符
  • getChars(4个参数)
public class Test
{
  public static void main(String[] args) {
    String str = "如何从一个初级程序员变成一个公司的CTO?";
    System.out.println(str);

    int length = str.length();
    System.out.println("字符串的长度为:"+length);

    char ch = str.charAt(5);
    System.out.println("字符串中的第5个字符为:"+ch);

    //定义容量为20的字符数组,用于存储从字符串中提取出的一串字符
    char[] charArray = new char[20];
    str.getChars(0,7,charArray,0);
    System.out.println(charArray);
  }
}

运行结果为

如何从一个初级程序员变成一个公司的CTO?
字符串的长度为:21
字符串中的第5个字符为:初
如何从一个初级

Java 字符串与其他数据类型的转换

  • 字符串转成其它数据类型
    • Byte.parseByte(str)
    • Integer.parseInt(str)
    • Long.parseLong(str)
    • Float.parseFloat(str)
    • Double.parseDouble(str)
    • Boolean.getBoolean(str)
    • str.charAt()
  • 其它数据类型转成字符串
    • 第一种 : String.valueOf(基础数据类型);
    • 第二种 : toString() 方法

转换的方法类似,这里就以boolean 和 String 为例

public class Test
{
  public static void main(String[] args) {
    boolean bool = Boolean.getBoolean("false"); //字符串类型转换为布尔类型
    String str1 = String.valueOf(bool); //将布尔类型转换为字符串类型
  }
}

太简单了,连输出都省下了

Java 字符串比较

  • equals
  • equalsIgnoreCase
  • compareTo
  • compareTOIgnoreCase
public class Test
{
  public static void main(String[] args)
  {
    String str1 = "hello";
    String str2 = "HELLO";  //定义两个字符串

    // compareTo 不忽略字符串字符大小写
    if(str1.compareTo(str2)>0)
    {
        System.out.println("使用compareTo , " +str1+">"+str2);
    }
    else if(str1.compareTo(str2) == 0)
    {
        System.out.println("使用compareTo , " +str1+"="+str2);
    }
    else
    {
        System.out.println("使用compareTo , " +str1+"="+str2);
    }

    //忽略字符串字符大小写
    if(str1.compareToIgnoreCase(str2)>0)
    {
        System.out.println("使用compareToIgnoreCase , " +str1+">"+str2);
    }
    else if(str1.compareToIgnoreCase(str2) == 0)
    {
        System.out.println("使用compareToIgnoreCase , " +str1+"="+str2);
    }
    else
    {
        System.out.println("使用compareToIgnoreCase , " +str1+"<"+str2);
    }

    // equals 不忽略字符串字符大小写
    if(str1.equals(str2))
    {
        System.out.println("使用equals , " + str1+"="+str2);
    }
    else
    {
        System.out.println("使用equals , " +str1+"!="+str2);
    }
    //  equalsIgnoreCase 忽略字符串字符大小写
    if(str1.equalsIgnoreCase(str2))
    {
        System.out.println("使用equalsIgnoreCase , " +str1+"="+str2);
    }
    else
    {
        System.out.println("使用equalsIgnoreCase , " +str1+"!="+str2);
    }
  }
}

输出结果为

使用compareTo , hello>HELLO
使用compareToIgnoreCase , hello=HELLO
使用equals , hello!=HELLO
使用equalsIgnoreCase , hello=HELLO

Java 字符串查找(String index)

  • indexOf
  • lastIndexOf
public class Test
{
  public static void main(String[] args) {
    String str = "Hello Word, my name is Java! name, what, Hello Word!"; //定义一个长字符串
    // indexOf
    System.out.println("第一个空格所在索引为:" + str.indexOf(" "));
    System.out.println("索引6以后的第一个空格所在索引为:"+str.indexOf(" ",6));

    //
    System.out.println("子字符串name第一次出现位置的索引号为:"+ str.indexOf("name"));
    System.out.println("索引5以后子字符串name第一次出现位置的索引号为:"+str.indexOf("name",5));

    System.out.println("===================================================");

    // astIndexOf()
    System.out.println("最后一个空格所在索引为:" + str.lastIndexOf(" "));
    System.out.println("索引6以前最后一个空格所在索引为:"+str.lastIndexOf(" ",6));

    System.out.println("子字符串name最后一次出现位置的索引号为:"+str.lastIndexOf("name"));
    System.out.println("索引号5以后子字符串name最后一次出现位置的索引号为:"+str.lastIndexOf("name",5));
  }
}

运行结果为

第一个空格所在索引为:5
索引6以后的第一个空格所在索引为:11
子字符串name第一次出现位置的索引号为:15
索引5以后子字符串name第一次出现位置的索引号为:15
===================================================
最后一个空格所在索引为:46
索引6以前最后一个空格所在索引为:5
子字符串name最后一次出现位置的索引号为:29
索引号5以后子字符串name最后一次出现位置的索引号为:-1

Java 字符串截取与拆分

  • substring
  • split
public class Test
{
  public static void main(String[] args) {
    String str = "Hello Word, my name is Java!";

    // substring
    System.out.println("从左开始截取5字符 => " + str.substring(0, 5)); //截取出第一个单词
    System.out.println("从左开始,从5的位置截取到最后 => " + str.substring(5, str.length()));//截取出最后一个单词

    // split()方法拆分出所有单词
    String[] stringArray = str.split(" "); //根据空格要求拆分出所有单词保存到字符串数组中
    System.out.println("拆分之后的各个词汇为:"); //输出提示信息
    for(int i = 0;i<stringArray.length;i++){
      System.out.print(stringArray[i]+"\t");
    }
  }
}

运算结果为

从左开始截取5字符 => Hello
从左开始,从5的位置截取到最后 =>  Word, my name is Java!
拆分之后的各个词汇为:
Hello	Word,	my	name	is	Java!

Java 字符串替换或修改

  • concat
  • toLowerCase、toUpperCase
  • replaceAll
  • replaceFirst(regex, replacement)
  • replace("被替换的字符串", "newCharString");
public class Test
{
  public static void main(String[] args) {
    String str1 = "Hello";
		String str2 = "World";

		System.out.println("concat =》 str1和str2合并后的字符串为:"+str1.concat(str2));
		System.out.println("toLowerCase =》 str1的字符全部转换为小写:"+str1.toLowerCase());
		System.out.println("toUpperCase =》 str2的字符全部转换为大写:"+str2.toUpperCase());

		System.out.println("========================================");
		String str3 = "Hello pangugle, Hello pangugle, Java is the best language!";
		System.out.println("replace =》 替换后的 str3 :" + str3.replace("pangugle", "China"));
		System.out.println("replaceFirst =》 替换后的 str3 : " + str3.replaceFirst("(.*)pangugle", "I love China"));
  }
}

运算结果为

concat =》 str1和str2合并后的字符串为:HelloWorld
toLowerCase =》 str1的字符全部转换为小写:hello
toUpperCase =》 str2的字符全部转换为大写:WORLD
========================================
replace =》 替换后的 str3 :Hello China, Hello China, Java is the best language!
replaceFirst =》 替换后的 str3 : I love China, Java is the best language!

Java 判断字符串是否为乱码

Java 表情处理