我们经常会使用到String和stringbuffer和stringbuilder简单说几个方法。
一、String类
String类在java.lang包中,是一个引用类,java使用String类创建一个字符串变量,字符串变量属于对象。java把String类声明的final类,不能有类。String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间。
1.String str = "Hello";
2.String str = new String("Hello");
三、String类常用方法
1.求字符串的长度
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "爱党爱国,乐于助人";
-
- System.out.println("我的长度int"+str.length());//str.length()返回字符串的长度9
- System.out.println("我的长度int"+str1.length());//str.length()返回字符串的长度9
-
- }
2.提取子串
用String类的substring方法可以提取字符串中的子串,该方法有两种常用参数:
.public String substring(int beginIndex) // 该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
.public String substring(int beginIndex, int endIndex) // 该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "爱党爱国,乐于助人";
-
- System.out.println(str.substring(3));//456789
- System.out.println(str1.substring(0,4));//爱党爱国
- }
3.求字符串某一位置字符
public char charAt(int index) // 返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "爱党爱国,乐于助人";
-
- System.out.println(str.charAt(0));//1
- System.out.println(str1.charAt(8)); //人
- }
4.字符串比较
1)public int compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
2)public int compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
3)public boolean equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
4)public boolean equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "爱党爱国,乐于助人";
- String str2 = "abc";
- String str3 = "ABC";
-
- System.out.println(str.compareTo(str1)); //-29184
- System.out.println (str.compareToIgnoreCase(str1));//-29184
- System.out.println (str2.compareTo(str3));//32
- System.out.println (str2.compareToIgnoreCase(str3));//0
- boolean c = str2.equals(str3); //c=false
- boolean d = str2.equalsIgnoreCase(str3); //d=true
-
- }
5、字符串连接
public String concat(String str) // 将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "爱党爱国,乐于助人";
- String str2 = "abc";
- String str3 = "ABC";
-
- System.out.println(str.concat(str1)); //123456789爱党爱国,乐于助人
-
- }
6、字符串中单个字符或字符串的查找
1)public int indexOf(int ch/String str)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
2)public int indexOf(int ch/String str, int fromIndex)//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
3)public int lastIndexOf(int ch/String str)//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
4)public int lastIndexOf(int ch/String str, int fromIndex)//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "爱党爱国,乐于助人";
-
- System.out.println(str.indexOf('5'));//4
- System.out.println(str.indexOf('3',1));//2
- System.out.println(str.lastIndexOf('5'));//4
- System.out.println(str.lastIndexOf('3',1));//-1
- }
7、字符串中字符的大小写转换
1)public String toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
2)public String toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串
- public static void main(String[] args) {
- String str = "123456789";
- String str1 = "abcdEFGH";
-
- System.out.println(str1.toLowerCase());//abcdefgh
- System.out.println(str1.toUpperCase());//ABCDEFGH
-
- }
8、字符串中字符的替换
1)public String replace(char oldChar, char newChar) //用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。
2)public String replaceFirst(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
3)public String replaceAll(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
- public static void main(String[] args) {
- String str = "Hello";
- String str1 = str.replace('e','E');//str1 = "HEllo"
- String str2 = str.replaceFirst("l","qw");//str2 = "Heqwlo"
- String str3 = str.replaceAll("l","df");//str3 = "Hedfdfo"
- System.out.println(str1);
- System.out.println(str2);
- System.out.println(str3);
- }
9.string若干方法
1)String trim //忽略字符串前导和尾部的空格,返回字符串
String s = " Hello ";
System.out.println(s.trim()); // s = "Hello"
2)isEmpty() // 判断字符串是否为空。
String s = " Hello ";
System.out.println(s.isEmpty()); // s = "false"
3) contains() //判断是否包含指定的字符串
String s = " Hello ";
System.out.println(s.contains("ll")); // s = "true"
4) char[] toCharArray() // 将此字符串转换为一个新的字符数组。
5)boolean startsWith(String prefix) // 测试此字符串是否以指定的子串开始。
6) boolean endsWith(String prefix) // 测试此字符串是否以指定的子串结束。
7)String[] split(String regex,int limit) // 根据匹配给定的正则表达式来拆分此字符串
有借鉴的地方~ 表示欢迎~
我们在实际的开发中,如果需要进行字符串的频繁拼接,会出现以下问题:
java中的字符串是不可变的,每一次拼接都会产生新字符串。
这样会占用大量的方法区内存。造成内存空间的浪费。
==String为什么是不可变的?
源代码内,String类中有一个 byte[ ] 数组,这个byte[ ]数组采用了 final 修饰,因为数组一旦创建长度不可变。并且被final修饰的引用一旦指向某个对象之后,不可再指向其它对象,所以String是不可变的!
所以"abc" 无法变成 “abcd”
因此引出StringBuffer和StringBuilder可变字符串!
==StringBuilder和StringBuffer为什么是可变的呢?
源代码内,StringBuffer和StringBuilder内部实际上是一个 byte[ ]数组,这个byte[]数组没有被final修饰,StringBuffer和StringBuilder的初始化容量是 16,当存满之后会进行扩容,底层调用了数组拷贝的方法System.arraycopy()。所以StringBuilder和StringBuffer适合于使用字符串的频繁拼接操作。
注意:
StringBuffer和StringBuilder默认初始化容量为16个byte[] 数组
1,StringBuffer和StringBuilder的创建方法
- public static void main(String[] args) {
- StringBuffer s1 = new StringBuffer();//创建一个容量为16的StringBuffer对象
-
- StringBuffer s2 = new StringBuffer("我是中国人");
- System.out.println(s2);
-
- StringBuffer s3 = new StringBuffer(100);//创建一个容量为100的StringBuffer对象
- StringBuilder s4 = new StringBuilder(100);//创建一个StringBuffer对象
- }
2. 优化StringBuffer和StringBuilder的性能?
在创建StringBuffer和StringBuilder的时候尽可能给定一个初始化容量。
最好减少底层数组的扩容次数。预估计一下,给一个大一些初始化容量。
关键点:给一个合适的初始化容量。可以提高程序的执行效率。
3.StringBuffer和StringBuilder的区别?
StringBuffer中的方法都有:synchronized 关键字修饰。表示StringBuffer在多线程环境下运行是安全的。
StringBuilder中的方法都没有:synchronized 关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。
-StringBuffer是线程安全的。
-StringBuilder是非线程安全的。
4.方法(StringBuffer和StringBuilder构造方法和方法一样)
构造方法名 |
---|
StringBuilder() |
StringBuilder(int capacity) |
StringBuilder(String str) |
--StringBuilder append(char c) 在字符串尾巴追加字符
--int capacity() 当前StringBuffer/StringBuilder的容量
--char charAt(int index) 返回指定位置的字符
--StringBuilder delete(int start, int end) 删除[start, end)范围的字符
--StringBuilder deleteCharAt(int index) 删除指定位置的字符
--void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符串转换成char复制到dst数组中
--int indexOf(String str) 返回str第一次出现的位置
--int lastIndexOf(String str) 返回str最后一次出现的位置
--StringBuilder insert(int offset, char c) 在offset位置插入字符
--int length() 返回字符串长度
--StringBuilder replace(int start, int end, String str) 将[start, end)的内容替换成str
--StringBuilder reverse() 字符串翻转
--void setCharAt(int index, char ch) 将index位置的字符设置为ch
--String substring(int start) 从start开始截取字串
--String substring(int start, int end) 截取start到end - 1的字符串
--void setLength(int newLength) 设置StringBuffer/StringBuilder的长度,默认补空格,并自动扩充容量
--CharSequence subSequence(int start, int end) 和substring一样,只不过返回CharSequence
--StringBuffer/StringBuilder可以看做 可变长度字符串。
--StringBuffer/StringBuilder初始化容量 16.
--StringBuffer/StringBuilder是完成字符串拼接操作的,方法名:append
--StringBuffer是线程安全的。StringBuilder是非线程安全的。
--频繁进行字符串拼接不建议使用“+”