[关闭]
@liruiyi962464 2017-03-23T03:32:30.000000Z 字数 4560 阅读 505

String对象的声明和操作

java

String对象的声明和操作

  • String字符是不可变的
  • 类中每一个看来会修改String值得发布方法,其实都是创建了新的String对象(包含修改后的字符串内容)
  • String的只读性带来效率优化可能
  • 字符串字面值存储在字符串池中,String对象优先指向该字符池,避免发生成重复的字符串实例
  • 系统对String的非修改处理效率很高,远远的超出了另外俩个字符串类的StringBuffer和StringBuilder(下边解释)

String对象的常用方法

  1. String str = "Made In China";
  2. String str1 = " bach";
  3. //返回字符串的长度
  4. System.out.println(str.length());//结果为:13
  5. //根据指定的索引值返回对应的单个字符
  6. System.out.println(str.charAt(0));//结果为:m
  7. //字符串的拼接
  8. System.out.println(str.concat(str1));//结果为: made in china bach
  9. //是否包含指定的字符串
  10. System.out.println(str.contains("m"));//结果为:true
  11. //比较字符串的大小 根据ASCII比较
  12. System.out.println(str.compareTo(str1));//结果为:
  13. //指定子串在字符串中第一次出现的索引值位置,默认情况是单个字符进行编号
  14. //如果指定子串不存在则返回 -1
  15. System.out.println(str.indexOf("m"));//结果为:0
  16. //指定子串在字符串中最后一次出现的索引值位置,默认情况是单个字符进行编号
  17. //如果指定子串不存在则返回 -1
  18. System.out.println(str.lastIndexOf("a"));//结果为:12
  19. //根据制定子串对字符串进行分割
  20. String[] strs = str.split(" ");
  21. System.out.println(strs[0]);//made
  22. System.out.println(strs[1]);//in
  23. System.out.println(strs[2]);//china
  24. //字符串截取1个参数的截取方式
  25. System.out.println(str.substring(3));//结果为:e in china
  26. //字符串截取2个参数的截取方式
  27. System.out.println(str.substring(2,6));//结果为:de i
  28. //将字符串中的字母全部转换成小写
  29. System.out.println(str.toLowerCase());//结果为:made in china
  30. //将字符串中的字母全部转换成大写
  31. System.out.println(str.toUpperCase());//结果为: MADE IN CHINA
  32. //将字符串中的:“a”全部替换成A“”
  33. System.out.println(str.replace("a", "A"));//结果为:MAde In ChinA

String

  • Java语言中的字符串值属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一般使用String类作为字符串的标准格式,Java编辑器把字符串值作为String对象
  • String对象一旦创建就不能改变,如果需要进行大量的字符串修改操作,应该使用StringBuffer/StringBuilder类或者字符数组,最终修改结果可以被转换成String

StringBuffer

  • StringBuffer线程安全的可变字符序列(可变的字符数组)
  • 一个类型与String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容
  • 每个字符缓冲区都有一定的容量,只有字符缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲数组
  • 如果缓冲区溢出,则此容量自动增大

StringBuilder

  • 从JDK5开始,为StringBuffer类补充了一个单线程使用的等价类,即StringBuilder
  • 与StringBuffer相比,通常应该优先使用StringBuilder类,因为它支持所有相同操作,但由于它不执行同步,所以速度更快

StringBuffer操作

  1. StringBuilder sb = new StringBuilder();//默认的构造方法 默认长度为16
  2. //StringBuilder sb = new StringBuilder("abc");//添加容量 +3 长度为19
  3. //StringBuilder sb = new StringBuilder(100);//指定长度
  4. StringBuffer sb = new StringBuffer();
  5. sb.append(1);
  6. sb.append(true);
  7. sb.append("hello");//扩充 是容量满了之后 (n+1)*2
  8. //length()长度
  9. System.out.println(sb.length());
  10. //capacity()容器大小
  11. System.out.println(sb.capacity());
  12. //添加
  13. sb.append("worddddddddddddd");
  14. System.out.println(sb.capacity());
  15. //插入
  16. sb.insert(18, "6666666");
  17. System.out.println(sb);
  18. //取出指定下标的字符
  19. System.out.println(sb.charAt(2));
  20. System.out.println(sb);
  21. //删除【0,3)左避右开
  22. sb.delete(0, 3);
  23. System.out.println(sb);
  24. //出现的位置
  25. System.out.println(sb.indexOf("hello"));
  26. //替换
  27. System.out.println(sb.replace(6, 8, "**"));
  28. //翻转
  29. System.out.println(sb.reverse());
  30. //截取(返回类型不可变)
  31. System.out.println(sb.substring(3,8));
  32. //截取 (返回类型可变)
  33. System.out.println(sb.subSequence(3, 15));

模拟StringBuildetr

  1. package com.stringbuilderdemo;
  2. public class StringBuilderDemo {
  3. public static void main(String[] args) {
  4. StringBuilderTest sbt = new StringBuilderTest("abcdefg");
  5. System.out.println(sbt.capacity());
  6. System.out.println(sbt.length());
  7. sbt.append("123");
  8. sbt.delete(3, 2);
  9. System.out.println(sbt);
  10. sbt.append("aaaaaaaaaa");
  11. sbt.append("aaaaaaaaaa");
  12. System.out.println(sbt.capacity());
  13. }
  14. }
  15. class StringBuilderTest {
  16. // 声明一个字符数组来保存数据
  17. private char[] test = null;
  18. // 无参的构造方法,初始容量为16
  19. public StringBuilderTest() {
  20. this.test = new char[16];
  21. }
  22. // int类型的构造方法,指定初始容量
  23. public StringBuilderTest(int capacity) {
  24. this.test = new char[capacity];
  25. }
  26. // String类型的构造方法,指定初始内容
  27. public StringBuilderTest(String str) {
  28. this.test = new char[str.length() + 16];
  29. // 把初始内容保存到test数组中
  30. this.append(str);
  31. }
  32. // 返回StringBuilder容量
  33. public int capacity() {
  34. return this.test.length;
  35. }
  36. // 返回StringBuilder内容长度
  37. public int length() {
  38. int length = 0;
  39. for (int i = 0; i < test.length; i++) {
  40. if (test[i] == 0) {
  41. break;
  42. }
  43. length = i + 1;
  44. }
  45. return length;
  46. }
  47. // 增加内容
  48. public void append(String str) {
  49. // 获得当前数组中的字符长度,确定拼接位置
  50. int length = this.length();
  51. // 确保长度能够容纳
  52. int length2 = str.length();
  53. while (true) {
  54. int capacity = this.capacity();
  55. if(capacity < (length + length2)){
  56. // 扩充数组容量
  57. dilatation();
  58. }else{
  59. break;
  60. }
  61. }
  62. // 把字符串放到数组中
  63. str.getChars(0, str.length(), this.test, length);
  64. }
  65. // 扩充数组容量
  66. public void dilatation() {
  67. // 获得原有的容量值
  68. int capacity = this.capacity();
  69. // 创建一个新的扩充后的数组
  70. //新数组的长度
  71. int newCapacity = (capacity + 1) * 2;
  72. char[] newTest = new char[newCapacity];
  73. // 将原有数组中的数据复制到新的数组中
  74. for (int i = 0; i < test.length; i++) {
  75. newTest[i] = test[i];
  76. }
  77. // 用新数组覆盖掉原有数组
  78. test = newTest;
  79. }
  80. // 获取指定位置的字符串
  81. public String get(int start, int count) {
  82. String str = new String(test, start, count);
  83. return str;
  84. }
  85. // 删除指定位置的字符串
  86. public void delete(int start, int count) {
  87. //获得数组内容长度
  88. int length = this.length();
  89. // 移动数据的起始点
  90. int startCopy = start + count;
  91. // 移动的数据的长度
  92. int countCopy = length- startCopy;
  93. for (int i = start; i < startCopy; i++) {
  94. test[i] = 0;
  95. }
  96. // 将后面的数据移动到前面进行拼接
  97. String str = new String(test, startCopy, countCopy);
  98. //将需要移动的数据在数组中清掉
  99. for(int i = startCopy;i<length;i++){
  100. test[i] = 0;
  101. }
  102. append(str);
  103. }
  104. @Override
  105. public String toString() {
  106. // TODO Auto-generated method stub
  107. String str = new String(test, 0, length());
  108. return str;
  109. }
  110. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注