字符串
Java中的字符串基于字符数组实现,因此字符串也是不可变的(每当对String进行更改时,都会创建一个新的实例)。对于可变字符串,可以使用 StringBuffer 和 StringBuilder 类。
1.Java中的ClassLoader使用String对象作为参数。
2.保证线程安全,无需处理共享对象的同步
3.利于内存优化,最大限度地减少堆内存的使用
创建
1.字面量
String s=“welcome”;
每次创建字符串文字时,JVM首先检查“字符串常量池”。如果该字符串已存在于池中,则返回对池化实例的引用。如果池中不存在该字符串,则会创建一个新的字符串实例并将其放入池中。
2.动态分配
String s=new String(“Welcome”);
通过new 创建字符串实例,会在堆中分配一块内存,且该字符串不会被添加到字符常量池中。
String internedString = str.intern();
//若该字符串本不存在,则将字符串添加到字符串常量池中;
//若该字符串存在,则返回该字符串的引用
比较
1.equals( )方法:比较值是否相等
public boolean equals(String another)
public boolean equalsIgnoreCase(String another) //忽略大小写。
2.== 判断引用是否相同
class Teststringcomparison{
public static void main(String args[]){
String s1="Welcome";
String s2="Welcome";
String s3=new String("Welcome");
System.out.println(s1==s2);//true (because both refer to same instance)
System.out.println(s1==s3);//false(because s3 refers to instance created in nonpool)
}
}
3.compareTo( )方法:按字典顺序比较
int out = s1.compareTo(s2);
/*
out < 0 —— s1 在 s2 之前
out = 0 —— s1 和 s2 相等
out > 0 —— s1 在 s2 之后
*/
常用方法
- int length( ):返回字符串长度
- Char charAt(int i):返回第i个字符
- String substring (int i):从第i个字符开始截取字符串
String substring (int i, int j):返回(i, j-1)的子串 - public char[] toCharArray():将字符串转换为字符数组
- public static String join(CharSequence delimiter, CharSequence… elements):给字符串添加指定分隔符
public String split(String regex):按照指定规则分割字符串 - String.valueOf( )将给定的类型(如int、long、float、double、boolean、char和char数组)转换为String【与toString( )的区别?】
- String concat(String str):连接字符串
String output = s1.concat(s2); //s1, s2均为字符串
- int indexOf (String s): 返回字符串中第一次出现指定字符串的索引
int indexOf (String s, int i): 返回指定字符串第一次出现的字符串中的索引,从指定索引开始。
int lastIndexOf( String s): 返回指定字符串最后一次出现在字符串中的索引。 - String trim(): 返回删除两端空格后String的副本(不会影响中间的空格)。
- String replace (char oldChar, char newChar):字符替换
- String toLowerCase():转换为全小写
String toUpperCase():转换为全大写 - String startsWith()和endsWith():检查String是否以传递的参数(字母)开头/结尾
- public boolean isEmpty() :检查字符串是否为空
StringBuffer类
StringBuffer是String的对等类,它提供了字符串的大部分功能。字符串表示固定长度的、不可变的字符序列,而StringBuffer表示可增长和可写的字符序列。它是线程安全的。
构造器
Constructor | Description |
StringBuffer( ) | 创建一个初始容量为16的StringBuffer |
StringBuffer(String str) | 使用指定字符串创建 |
StringBuffer(int capacity) | 创建指定容量的StringBuffer |
常用方法
Method | Description |
public synchronized StringBuffer append(DataType s) | 添加指定字符(串) |
public synchronized StringBuffer insert(int offset, DataType s) | 在指定位置添插入指定字符(串) |
public synchronized StringBuffer replace(int startIndex, int endIndex, String str) | 将[startIndex, endIndex)字符串替换为指定字符串 |
public synchronized StringBuffer delete(int startIndex, int endIndex) | 将[startIndex, endIndex)字符串删除 |
public synchronized StringBuffer reverse() | 翻转字符串 |
public int capaity( ) | 返回当前StringBuffer容量,newcapacity = (oldcapacity*2)+2 ,初始容量 |
public char charAt(int index) | 返回指定位置的字符 |
public int length() | 返回字符数目 |
public String substring(int beginIndex) | 截取beginIndex起始的字符串 |
public String substring(int beginIndex, int endIndex) | 截取[beginIndex, endIndex)的字符串 |
StringBuilder类
用于创建可变大小的字符串,但是是线程不安全的。
构造器
Constructor | Description |
StringBuilder( ) | 创建一个初始容量为16的StringBuffer |
StringBuilder(String str) | 使用指定字符串创建 |
StringBuilder(int length) | 创建指定容量的StringBuffer |
常用方法
Method | Description |
public StringBuilder append(DataType s) | 添加指定字符(串) |
public StringBuilder insert(int offset, DataType s) | 在指定位置添插入指定字符(串) |
public StringBuilder replace(int startIndex, int endIndex, String str) | 将[startIndex, endIndex)字符串替换为指定字符串 |
public StringBuilder delete(int startIndex, int endIndex) | 将[startIndex, endIndex)字符串删除 |
public StringBuilder reverse() | 翻转字符串 |
public int capaity( ) | 返回当前StringBuffer容量 |
public char charAt(int index) | 返回指定位置的字符 |
public int length() | 返回字符数目 |
public String substring(int beginIndex) | 截取beginIndex起始的字符串 |
public String substring(int beginIndex, int endIndex) | 截取[beginIndex, endIndex)的字符串 |
StringBuilder比StringBuffer效率更高。