博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串String,StringBuffer和StringBuilder
阅读量:5322 次
发布时间:2019-06-14

本文共 9463 字,大约阅读时间需要 31 分钟。

一、字符串

字符串就是一连串的字符序列(字符数组),Java提供了String,StringBuffer和StringBuilderString来封装字符串,String,StringBuffer和StringBuilder都实现了CharSequence接口

二、String

1.String对象是不可变的

2.String类继承Object,重写了equals方法,建立了字符串自己的比较方法(判断字符串中的每个字符是否相等)

示例代码:

1 public static void main(String[] args) {2         String str1 = new String("1");3         String str2 = "1";4         System.out.println(str1 == str2);//false5         System.out.println(str1.equals(str2));//true6 }

3.String类的构造方法

1)String(byte[] bytes)  查询默认编码表

2)String(byte[] bytes, int offset, int length)  offset:数组的起始索引,length:个数

3)String(char[] value)  传递字符数组,将字符数组转成字符串,不查询编码表

示例代码:

1 public static void main(String[] args) { 2         byte[] bytes = {116,104,97,110,107,0,121,111,117,33}; 3         String s1 = new String(bytes); 4         System.out.println(s1);//thank you! 5         String s2 = new String(bytes, 2, 3); 6         System.out.println(s2);//ank 7         char[] ch = {'y', 'o', 'u', ' ', 'a', 'r', 'e', ' ', 'w', 'e', 'l', 'c', 'o', 'm', 'e'}; 8         String s3 = new String(ch); 9         System.out.println(s3);//you are welcome10     }

4.String类的方法

1)String substring(int beginindex, int end)获取字符串的一部分,包含头,不包含尾;这个方法返回一个新的字符串,原来的字符串不会改变

 String substring(int beginindex)重载方法,见示例

示例代码:

1 public static void main(String[] args) {2     String str = "happy";3     String s1 = str.substring(2, 3);4     System.out.println(s1);//p5     String s2 = str.substring(2);6     System.out.println(s2);//ppy7 }

2)String concat(String str)  将指定字符串连接到此字符串的结尾

3)String copyValueOf(char[] data, int offset, int count)  字符数组生成字符串;offset:子数组的初始偏移量,count:子数组长度

   String copyValueOf(char[] data)  重载方法

4)boolean startWith(String str)和endsWith(String str)  判断字符串是否以指定前缀开头和(后缀)结尾

   boolean startWith(String str, int index)  重载方法,在指定索引后开始判断;

5)boolean equalsIgnoreCase(String anotherString)  比较两个字符串,不考虑大小写

6)void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)  将字符从字符串中复制到目标字符数组中!

  rcBegin:字符串中要复制的第一个字符的索引

  srcEnd:字符串中要复制的最后一个字符之后的索引(不要后面的)
  dst:目标数组
  dstBegin:目标数组中的起始偏移量

7)int indexOf(int ch, int fromIndex)与lastIndexOf(int ch, int fromIndex)  返回指定字符在第一次或最后一次出现的索引,并从该进行进行正向或反向搜索

   int indexOf(String str)  重载方法,此字符串第一次出现的索引

8)boolean isEmpty()  判断字符串是不是空即length() == 0

9)String toLowerCase()  将字符串转换为小写(默认语言环境)

 String toLowerCase(Locale locale)  重载方法,应用指定语言环境

10)String toUpperCase()  同上,变为大写,其他相同

11)String trim()  返回字符串的副本,忽略前后空白(不包括中间)

12)String replace(char oldChar, char newChar)  替换方法

13)int length()  长度。。。

示例代码:

1 public static void main(String[] args) { 2     String str1 = "hello"; 3     String str2 = "world"; 4     System.out.println(str1.concat(str2));//helloworld 5     char[] ch1 = {'a', 'b', 'c'}; 6     System.out.println(str1.copyValueOf(ch1, 1, 2));//bc 7     boolean b = str1.startsWith("h"); 8     System.out.println(b);//true 9     String str3 = "Hello";10     System.out.println(str1.equalsIgnoreCase(str3));//true11     char[] ch2 = new char[10];12     str1.getChars(1, 3, ch2, 1);13     System.out.println(ch2);// el14     System.out.println(str1.indexOf("l"));//215     System.out.println(str2.toUpperCase());//WORLD16     String str4 = "   go  home!  ";17     System.out.println(str4.trim());//go  home!18 }

14)String format()  字符串格式转换(小部分)

示例代码:

1 public static void main(String[] args) { 2     System.out.printf("ID:%05d%n",625);//ID:00625 3     System.out.printf("Tab:% 5d%n", 7);//Tab:    7 4     System.out.printf("整数分组:%,d%n", 62155569513L);//整数分组:62,155,569,513 5     System.out.printf("空格和小数点:% 10.4f$%n", 60.5);//空格和小数点:   60.5000$ 6     Date date = new Date(); 7     System.out.printf("全部信息:%tc%n", date);//全部信息:星期一 十二月 04 14:25:27 CST 2017 8     System.out.printf("年-月-日格式:%tF%n", date);//年-月-日格式:2017-12-04 9     System.out.printf("年/月/日格式:%tD%n", date);//年/月/日格式:12/04/1710     System.out.printf("HH:MM:SS PM格式(12):%tr%n", date);//HH:MM:SS PM格式(12):02:25:27 下午11     System.out.printf("HH:MM:SS格式(24):%tT%n", date);//HH:MM:SS格式(24):14:25:2712     System.out.printf("HH:MM格式(24):%tR", date);//HH:MM格式(24):14:2513         14     String str = String.format(Locale.US, "英文月份简称:%tb", date);15     System.out.println(str);//英文月份简称:Dec16     System.out.printf("本地月份简称:%tb%n", date);//本地月份简称:十二月17     String str4 = String.format(Locale.US, "英文月份简称:%tB", date);18     System.out.println(str4);//英文月份简称:December19     String str5 = String.format(Locale.US, "英文月份简称:%ta", date);20     System.out.println(str5);//英文月份简称:Mon21     System.out.printf("本地星期简称:%tA%n", date);//本地星期简称:星期一22 }

15)String intern()   intern()的设计就是为了重用String以节省内存消耗,调用intern()之后,去字符串池中寻找有没有该字符串,如果有则直接指向该字符串的对象

  详细解释请看:  

练习1:在字符串中寻找指定字符的出现次数;

示例代码:

1 public class Exercise { 2     public static void main(String[] args) { 3         String str = "Are you Ok?What happend?"; 4         int up = 0; 5         int low = 0; 6         int cha = 0; 7         int block = 0; 8         int a = str.length(); 9         char[] ch = new char[a];10         for(int i = 0; i < a; i++) {11             ch[i] = str.charAt(i);12             if(ch[i] >= 'A' && ch[i] <= 'Z') {13                 up++;14             }else if(ch[i] >= 'a' && ch[i] <= 'z') {15                 low++;16             }else if(ch[i] == '?') {17                 cha++;18             }else if(ch[i] == ' ') {19                 block++;20             }21         }22         System.out.println(up);//323         System.out.println(low);//1624         System.out.println(cha);//225         System.out.println(block);//326     }27 }

练习2:在字符串中寻找小串的出现次数;

示例代码:

1 public static void main(String[] args) { 2     String big = "demo01,demo02,demo03,demo04,demo05"; 3     String small = "demo"; 4  5     int p = big.indexOf(small); 6     int i = 0; 7     while(p != -1) { 8         i++; 9         p = big.indexOf(small, p+4);10     }11     System.out.println(i);//512 }

三、StringBuffer类(字符串缓冲区,提高原有字符串的操作效率)

1.内部采有了可变数组方式实现,类内部定义了数组,这个数组没有final;线程安全的可变字符数组,初始16个字符的数组容量

2.StringBuffer方法

1)StringBuffer append()   添加,将任意类型的数据添加到字符串的缓冲区中返回调用它的对象

2)StringBuffer insert(int offset, 任意类型)   插入,将任意类型数据插入缓冲区的指定索引上(不能越界)

3)StringBuffer replace(int start, int end, String str)   替换,将指定的索引范围内的所有字符,替换成新的字符串

4)StringBuffer delete(int start, int end)   删除缓冲区指定索引区间中的字符(包含头,不包含尾)

5)StringBuffer reverse()   将缓冲区的字符反转

6)StringBuffer toString()  将缓冲区的所有字符变成字符串(将可变的字符串缓冲区对象,变成了不可变String对象)

7)int capacity()   返回当前容量

StringBuffer扩容原理:当超出缺省容量时它会将自身容量增加到当前的2倍再加2;(2*旧值+2)

8)char charAt(int index)   返回此序列中指定索引处的 char

示例代码:

1 public class StringBufferTest { 2     public static void main(String[] args) { 3         int[] arr = {54,23,56,814,32}; 4         String s = toString(arr); 5         System.out.println(s);//{54,23,56,814,32} 6     } 7      8     public static String toString(int[] arr) { 9         StringBuffer sb = new StringBuffer();10         sb.append("{");11         for(int i = 0; i < arr.length; i++) {12             if(i != arr.length - 1)13                 sb.append(arr[i]+",");14             else15                 sb.append(arr[arr.length - 1]+ "}");16         }17         return sb.toString();18     }19 }

练习1:判断字符串数组里的数字是否对称,输出个数

示例代码:

1 public class Exercise { 2     public static void main(String[] args) { 3         String[] s = {"010", "3223", "666", "7890987", "123132","3215123", "6544456","6354", "65132"}; 4         int count = 0; 5         //循环遍历字符串数组s 6         for(int i = 0; i < s.length; i++) { 7             //判断数字的长度是不是奇数 8             if(s[i].length() % 2 == 1) { 9                 //求出中间的索引10                 int mid = s[i].length() / 2;11                 for(int j = 0; j < mid; ) {12                     //判断第一个索引处和最后索引处是否相等,以此类推,全部相等则count++13                     if(s[i].charAt(j) == s[i].charAt(s[i].length() - 1 - j)) {14                         j++;15                         if(j == mid)16                             count++;17                     }else {18                         j++;19                     }20                 }21             }22             //同上23             else {24                 double mid = s[i].length() / 2 + 0.5;25                 for(int j = 0; j < mid;) {26                     if(s[i].charAt(j) == s[i].charAt(s[i].length() - 1 - j)) {27                         j++;28                         if(j == s[i].length() / 2)29                             count++;30                     }31                     else {32                         j++;33                     }34                 }35             }36         }37         System.out.println(count);//638     }39 }

练习2:将字符串中的大写字母转换成小写字母,小写转换大写,其余转换为*;

示例代码:

1 public class Exercise { 2     public static void main(String[] args) { 3         Scanner sc = new Scanner(System.in); 4         String s = ""; 5         while(true) { 6             String s1 = sc.nextLine(); 7             if(s1.equals("end"))break; 8             StringBuffer sb = new StringBuffer(); 9             for(int i = 0; i < s1.length(); i++) {10                 char c = s1.charAt(i);11                 if(c >= 'A' && c <= 'Z') {12                     sb.append(s.valueOf(c).toLowerCase());13                 }14                 else if(c >= 'a' && c <= 'z') {15                     sb.append(s.valueOf(c).toUpperCase());16                 }else {17                     sb.append('*');18                 }19             }20             System.out.println(sb.toString());21         }        22     }23 }

四、StringBuilder类

1.StringBuilder类与StringBuffer类的方法完全一样

五、StringBuffer和Stringbuilder的区别

1.StringBuffer线程安全,StringBuilder线程不安全

2.StringBuilder运行效率高,StringBuffer则相对低

 

转载于:https://www.cnblogs.com/shak1ng/p/7977091.html

你可能感兴趣的文章
高精度1--加法
查看>>
在线文件管理器elFinder支持中文
查看>>
String比较
查看>>
Django之Models
查看>>
Spring缓存注解@Cache使用
查看>>
CSS 透明度级别 及 背景透明
查看>>
Linux 的 date 日期的使用
查看>>
PHP zip压缩文件及解压
查看>>
SOAP web service用AFNetWorking实现请求
查看>>
C# JSON字符串序列化与反序列化
查看>>
HTTPS、SPDY和HTTP/2的性能比较
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
Angular实践----理解数据绑定过程
查看>>
sublime快捷键
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Hyper-V Centos7 网络设置 虚拟机固定IP
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(31):画刷 转:http://blog.csdn.net/tcjiaan/article/details/7460226
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>