一、String 的含义
String 是定义一个字符串对象(内存中的字符串都是一个对象。)
String 一旦被初始化就不能被改变(可以改变变量指向,但是不能改变对象内容)
定义方式: String s1 = “abc”; //在内存中存在一个对象。
String s2 = new String("abc"); //在内存中存在两个对象。
String s3 = "abc";
比较: s1 == s2 为false
s1 == s3 为true (相同的字符串在静态池中一旦存在,就不会再产生新的该字符串了,以后其再出现,都使用它)
String的equals方法: s1.equals(s2) == true;
二、字符串的常见方法
1、获取
1.1、字符串中包含的字符数(也就是字符串的长度)
int length(); (注意与数组中的length做区别,数组中为属性,字符串中为方法)
1.2、某一个角标位置上的字符
char charAt(int index); (当访问的角标不存在时,提示字符串角标越界异常)
1.3、根据字符获取该字符在字符串中的角标位置
int indexOf(int ch); 返回的是字符第一次出现的角标位置。
int indexOf(int ch,int fromIndex); 返回的是从fromIndex开始字符出现的角标位置。
int indexOf(String str); 返回的是字符串第一次出现的角标位置。
int indexOf(String str,int fromIndex); 返回的是从fromIndex开始字符串 出现的角标位置。
(当访问的字符 或 字符串不存在时,返回 -1)
int lastIndexOf(int ch): 反向索引(种类和解释与正向索引相同 )
注:反向索引只是从右向左索引找到第一次出现目标的角标位置, 返回的依然是角标位置。
2、判断
2.1、判断字符串中是否包含指定字符串
boolean contains(CharSequence s) :CharSequence:为String实现的接口
特殊之处:indexOf(String str):可以索引字符串str第一次出现的位置,如果返回 -1,则表示该str不在字符串内。
所以,也可以用于对指定字符串判断是否包含。
if(str1.indexOf(“aaa”) == -1)
而且该方法既可以判断,由能获取位置。
2.2、判断字符串是否有内容
boolean isEmpty() :当且仅当长度为0时返回true。
2.3、判断字符串是否以某某开头
boolean startsWith(String prefix)
2.4、判断字符串是否以某某结尾
boolean endsWith(String suffix)
2.5、判断字符串的内容是否相同
boolean equals(Object anObject) (复写了Object 类中的equals方法)
2.5、判断字符串的内容是否相同 ,(不考虑大小写)
boolean equalsIgnoreCase(String anotherString)
3、转换。
3.1、 将字符数组转换成字符串
构造函数: String(char[] value)
String(char[] value, int offset, int count): 将数组中从下标offset开始,一共count位字符转换成字符串。
静态方法: static String copyValueOf(char[] data)
static String copyValueOf(char[] data, int offset, int count)
static String valueOf(char[] data)
3.2、 将字符串转换成字符数组
char[] toCharArray()
3.3、 将字节数组转换成字符串
String(byte[] value)
String(byte[] value, int offset, int count): 将数组中从下标offset开始,一共count位字符转换成字符串。
其他方法参见 3.5。
3.4、 将字符串转换成字节数组
byte[] getBytes(String charsetName)
3.5、 将基本数据类型转换成字符串
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(char[] data)
static String valueOf(double d) 等等。
注意:字符串和字节数组在转换过程中是可以指定编码表的。
4、替换
String replace(char oldChar, char newChar) : 返回一个数组,它是用newChar 替换就数组中的oldchar等到的。(一个一个的替换)
String replace(CharSequence target, CharSequence replacement) : 后替前,用新串替换原串中的子串。
注:原字符串没有改变,只是新出现了一个替换后的字符串(字符串一旦初始化,不能改变)
如果要替换的字符没有,还是返回原串,不会生成新的字符串。
5、切割,分割
String[] split(String regex) : 指定其中某一个字符或字符串,以其下刀,切割字符串(其实应当依据正则表达式规则拆分)
6、子串:(获取一个字符串的一部分)
String substring(int beginIndex) //从指定下标位置到结尾。
String substring(int beginIndex, int endIndex) //从指定下标位置到结束下标位置前一个
7、转换、去除空格、比较
7.1:将字符串转换成大写或者小写。
String toUpperCase()
String toLowerCase()
7.2:将字符串两端多余的空额去除。
String trim()
7.3:将两个字符串进行自然顺序的比较。
int compareTo(String anotherString)
int compareToIgnoreCase(String str) :不考虑大小写。
从第一位开始比较,比参数大返回正数,比参数小返回负数,都相等返回参数为0:一旦在某一位上分出大小了,便不再向后比较。
三、StringBuffer
定义:字符串缓冲区, 为一个容器。
特点:
1、长度可变化。
2、可以直接操作多个数据类型。
3、最终通过toString方法返回一个字符串。
c: create u: update r:read d: delete
1、存储
StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。
注:在StringBuffer对象调用appeed方法后,返回的就是其本身。
StringBuffer insert(int offset, 基本数据 b) : 从offest下标位开始插入 基本数据类型、字符串或者数组 b。
注:在StringBuffer对象调用insert方法后,返回的就是其本身。
2、删除
StringBuffer delete(int start, int end) : 移除下标start到 end-1的字符。
注:在StringBuffer对象调用delete方法后,返回的就是其本身。
StringBuffer deleteCharAt(int index) : 移除此序列指定下标位置的字符(char)。
注:在StringBuffer对象调用deleteCharAt方法后,返回的就是其本身。
清空缓冲区: sb.delate(0,sb.length());
3、获取
char charAt(int index) 返回此序列中指定索引处的 char 值。
int indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。
int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str, int fromIndex) 返回最后一次出现的指定子字符串在此字符串中的索引。
String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。
注意:这里返回的是String,不StringBuffer。
String toString():放回当前缓存区字符串。
int length(): 返回字符数。
4、修改
StringBuffer replace(int start, int end, String str) 在start和end之间,用str替换
void setCharAt(int index, char ch) 在index下标位置使用 字符dh替换原字符
5、反转
StringBuffer reverse()
6、
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将缓冲区中的指定数据存到指定的字符数组中,从指定位置开始存。
四、StringBuilder
在jdk 1.5之后新加功能
其余StringBuffer功能一样。
与StringBuffer的区别:
StringBuffer是线程同步的。
StringBuilder是线程不同步的。
当是单个线程操作缓冲区时,建议使用 StringBuilder 其有更高的效率。
五、jdk版本升级的三因素
1、提高安全性
2、提高效率
3、简化书写