一、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、判断字符串中是否包含指定字符串 booleancontains(CharSequence s) :CharSequence:为String实现的接口
特殊之处:indexOf(String str):可以索引字符串str第一次出现的位置,如果返回 -1,则表示该str不在字符串内。 所以,也可以用于对指定字符串判断是否包含。 if(str1.indexOf(“aaa”) == -1) 而且该方法既可以判断,由能获取位置。
2.2、判断字符串是否有内容 booleanisEmpty() :当且仅当长度为0时返回true。
2.3、判断字符串是否以某某开头 booleanstartsWith(String prefix)
2.4、判断字符串是否以某某结尾 booleanendsWith(String suffix)
2.5、判断字符串的内容是否相同 booleanequals(Object anObject) (复写了Object 类中的equals方法)
2.5、判断字符串的内容是否相同,(不考虑大小写)booleanequalsIgnoreCase(String anotherString)
3、转换。3.1、 将字符数组转换成字符串构造函数: String(char[] value) String(char[] value, int offset, int count): 将数组中从下标offset开始,一共count位字符转换成字符串。
静态方法: static StringcopyValueOf(char[] data) static StringcopyValueOf(char[] data, int offset, int count)
static StringvalueOf(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 StringvalueOf(boolean b) static StringvalueOf(char c) static StringvalueOf(char[] data) static StringvalueOf(double d) 等等。
注意:字符串和字节数组在转换过程中是可以指定编码表的。
4、替换
Stringreplace(char oldChar, char newChar) : 返回一个数组,它是用newChar 替换就数组中的oldchar等到的。(一个一个的替换) Stringreplace(CharSequence target, CharSequence replacement) : 后替前,用新串替换原串中的子串。
注:原字符串没有改变,只是新出现了一个替换后的字符串(字符串一旦初始化,不能改变) 如果要替换的字符没有,还是返回原串,不会生成新的字符串。
5、切割,分割
String[]split(String regex) : 指定其中某一个字符或字符串,以其下刀,切割字符串(其实应当依据正则表达式规则拆分)
6、子串:(获取一个字符串的一部分)
Stringsubstring(int beginIndex) //从指定下标位置到结尾。 Stringsubstring(int beginIndex, int endIndex) //从指定下标位置到结束下标位置前一个
7、转换、去除空格、比较
7.1:将字符串转换成大写或者小写。 StringtoUpperCase() StringtoLowerCase() 7.2:将字符串两端多余的空额去除。 Stringtrim() 7.3:将两个字符串进行自然顺序的比较。 intcompareTo(String anotherString) intcompareToIgnoreCase(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方法后,返回的就是其本身。 StringBufferdeleteCharAt(int index) : 移除此序列指定下标位置的字符(char)。 注:在StringBuffer对象调用deleteCharAt方法后,返回的就是其本身。
清空缓冲区: sb.delate(0,sb.length());
3、获取charcharAt(int index) 返回此序列中指定索引处的 char 值。intindexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。intindexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。intlastIndexOf(String str) 返回最右边出现的指定子字符串在此字符串中的索引。 intlastIndexOf(String str, int fromIndex) 返回最后一次出现的指定子字符串在此字符串中的索引。
Stringsubstring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。 Stringsubstring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。 注意:这里返回的是String,不StringBuffer。
String toString():放回当前缓存区字符串。 int length(): 返回字符数。
4、修改
StringBufferreplace(int start, int end, String str) 在start和end之间,用str替换
voidsetCharAt(int index, char ch) 在index下标位置使用 字符dh替换原字符
5、反转
StringBufferreverse()
6、 voidgetChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将缓冲区中的指定数据存到指定的字符数组中,从指定位置开始存。
四、StringBuilder在jdk 1.5之后新加功能其余StringBuffer功能一样。
与StringBuffer的区别: StringBuffer是线程同步的。 StringBuilder是线程不同步的。
当是单个线程操作缓冲区时,建议使用 StringBuilder 其有更高的效率。
五、jdk版本升级的三因素
1、提高安全性2、提高效率 3、简化书写