黑马程序员技术交流社区

标题: 深入Java之String [打印本页]

作者: 936994215    时间: 2016-7-4 18:04
标题: 深入Java之String
String是专门用来处理字符串的类,其中包含了很多对字符串的操作。本文面向希望对Java有更深入理解的同学,对java.lang.String作深入分析:先通过一个Java文件对String有个感性的认识:
  1. package string;

  2. /*
  3. * String类是对字符串的封装。
  4. * 那么它就提供了对字符串进行操作的方法。
  5. *
  6. * 常见的操作有哪些?
  7. * 1. 获取
  8. *     1.1 字符串的长度。
  9. *         int length()
  10. *     1.2 根据位置获取位置上的某个字符(从0开始),如果不存在则出现StringIndexOutOfBoundsException。
  11. *         char charAt(int index)
  12. *     1.3 根据字符获取该字符在字符串中的位置(从0开始)。
  13. *         int indexOf(int ch):返回ch在字符串中第一次出现的位置,如果不存在则返回-1
  14. *         int indexOf(int ch, int fromIndex):从fromIndex开始,获取ch在字符串中出现的位置
  15. *         
  16. *         int indexOf(String str):返回str在字符串中第一次出现的位置
  17. *         int indexOf(String str, int fromIndex):从fromIndex开始,获取str在字符串中出现的位置
  18. *         
  19. *         int lastIndexOf(int ch)
  20. *         int lastIndexOf(int ch, int fromIndex)
  21. *         int lastIndexOf(String str)
  22. *         int lastIndexOf(String str, int fromIndex)
  23. *     1.4 获取子串
  24. *         CharSequence subSequence(int beginIndex, int endIndex):返回一个新的字符序列,它是此序列的一个子序列。
  25. *         String substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串。
  26. *         String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串的一个子字符串,包含头,不包含尾。
  27. *
  28. * 2. 判断
  29. *     2.1 字符串是否为空
  30. *         boolean isEmpty():原理就是判断该字符串的length()是否为0
  31. *         
  32. *     2.2 字符串是否包含一个子串
  33. *         boolean contains(CharSequence s)
  34. *         * indexOf(str)可以索引子串第一次出现的位置,如果不存在则返回-1,所以也可以判断是否包含
  35. *         
  36. *         * public interface CharSequence
  37. *         * 所有已知实现类: CharBuffer, Segment, String, StringBuffer, StringBuilder
  38. *         * CharSequence 是 char 值的一个可读序列。此接口对许多不同种类的 char 序列提供统一的只读访问。char 值表示 Basic Multilingual Plane (BMP) 或代理项中的一个字符。有关详细信息,请参阅 Unicode 字符表示形式。
  39. *         * 此接口不修改 equals 和 hashCode 方法的常规协定。因此,通常未定义比较实现 CharSequence 的两个对象的结果。每个对象都可以通过一个不同的类实现,而且不能保证每个类能够测试其实例与其他类的实例的相等性。
  40. *         * 因此,使用任意 CharSequence 实例作为集合中的元素或映射中的键是不合适的。

  41. *     2.3 字符串是否以某个子串开头
  42. *         boolean startsWith(String str)
  43. *     2.4 字符串是否以某个子串结尾
  44. *         boolean endsWith(String str)
  45. *     
  46. *     2.5 判断字符串的内容是否相同,复写了Object中的equals方法
  47. *         boolean equals(Object obj):将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
  48. *         boolean equals(CharSequence cs):将此字符串与指定的 CharSequence 比较。当且仅当此 String 与指定序列表示相同的 char 值序列时,结果才为 true。
  49. *         boolean equalsIgnoreCase(String str):忽略大小写进行内容比较
  50. *         
  51. *     2.6 判断字符串是否符合给定的规则
  52. *         boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
  53. *         
  54. *     2.7 对两个字符串进行比较
  55. *         int compareTo(String anotherString):按字典顺序比较两个字符串。主要用于String排序,更多: http://blog.csdn.net/scyatcs/article/details/16974893
  56. *         int compareToIgnoreCase(String str):按字典顺序比较两个字符串,不考虑大小写。
  57. *
  58. * 3. 转换
  59. *     3.1 将字符数组转换成字符串
  60. *         构造函数: String(char[] value)
  61. *                    String(char[] value, int offset, int count):将字符数组的一部分转换成字符串
  62. *         
  63. *         静态方法: static copyValueOf(char[] data)
  64. *                    static copyValueOf(char[] data, int offset, int count)
  65. *                    
  66. *                    static valueOf(char[] data)
  67. *                    static valueOf(char[] data, int offset, int count)
  68. *     3.2 将字符串转成字符数组
  69. *         char[] toCharArray()
  70. *         
  71. *     3.3 将字节数组转换成字符串
  72. *         String(byte[] bytes)
  73. *         String(byte[] bytes, Charset charset)
  74. *         String(byte[] bytes, String charsetName)
  75. *         
  76. *         String(byte[] bytes, int offset, int length)
  77. *         String(byte[] bytes, int offset, int length, Charset charset)
  78. *         String(byte[] bytes, int offset, int length, String charsetName)
  79. *         
  80. *     3.4 将字符串转换成字节数组
  81. *         byte[] getBytes()  
  82. *         byte[] getBytes(Charset charset)
  83. *         byte[] getBytes(String charsetName)
  84. *     
  85. *     3.5 将基本数据类型转换成字符串
  86. *         static String valueOf(boolean b)
  87. *         static String valueOf(char c)
  88. *         static String valueOf(double d)
  89. *         static String valueOf(float f)
  90. *         static String valueOf(int i)                 //3+"";String.valueOf(3);
  91. *         static String valueOf(long l)
  92. *         static String valueOf(Object obj)        //由obj的toString方法实现
  93. *         
  94. *     3.6 分割字符串成字符串数组
  95. *         String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
  96. *         String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串。
  97. *         例如,字符串 "boo:and:foo" 使用这些参数可生成以下结果:
  98. *         Regex Limit 结果
  99. *                        :         2         { "boo", "and:foo" }
  100. *                        :         5         { "boo", "and", "foo" }
  101. *                        :         -2         { "boo", "and", "foo" }
  102. *                        o         5         { "b", "", ":and:f", "", "" }
  103. *                        o         -2         { "b", "", ":and:f", "", "" }
  104. *                        o         0         { "b", "", ":and:f" }
  105. *
  106. *    3.7 转换大小写
  107. *        String toLowerCase():使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
  108. *        String toLowerCase(Locale locale):使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。
  109. *        String toUpperCase()
  110. *        String toUpperCase(Locale locale)
  111. *   
  112. *    3.8 去除空格
  113. *        String trim():返回字符串的副本,忽略前导空白和尾部空白。
  114. *        
  115. *    3.9 格式化
  116. *    static String format(Locale l, String format, Object... args):使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
  117. *    static String format(String format, Object... args):使用指定的格式字符串和参数返回一个格式化字符串。
  118. *    更多关于format()的使用:http://blog.csdn.net/lonely_fireworks/article/details/7962171/
  119. *
  120. * 4. 替换
  121. *        String replace(char oldChar, char newChar)
  122. *        返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
  123. *        String replace(CharSequence target, CharSequence replacement)
  124. *        使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
  125. *        String replaceAll(String regex, String replacement)
  126. *        使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
  127. *        String replaceFirst(String regex, String replacement)
  128. *        使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
  129. *        
  130. */
  131. public class StringMethodDemo {
  132.         public static void method_replace() {
  133.                 String s = "Hello Java";
  134.                 String s1 = s.replace('a', 'b');//如果要替换的字符不存在则返回原字符串
  135.                
  136.                 sop("s="+s);//字符串一旦被初始化就不会改变
  137.                 sop("s1="+s1);
  138.         }
  139.        
  140.         public static void method_trans() {
  141.                 char[] arr = {'a','b','c','d','e','f','g'};
  142.                 String str = new String(arr,1,3);//bcd,1为下标(从0开始),3为个数
  143.                 sop("str="+str);
  144.                
  145.                 char[] chs = str.toCharArray();
  146.                 for(char c : chs) {
  147.                         sop(c);
  148.                 }
  149.         }
  150.        
  151.         public static void method_is() {
  152.                 String str = "ArrayDemo.java";
  153.                
  154.                 //判断文件名称是否是以"Array"开头
  155.                 sop(str.startsWith("Array"));
  156.                 //判断文件类型是否是java文件
  157.                 sop(str.endsWith(".java"));
  158.                 //判断文件名是否包含"Demo"
  159.                 sop(str.contains("Demo"));
  160.                
  161.                 //判断内容是否相同
  162.                 sop(str.equals(new StringBuilder("ArrayDemo.java")));//参数必须为String类型,false
  163.                 sop(str.contentEquals(new StringBuilder("ArrayDemo.java")));//参数为CharSequence接口,true
  164.         }
  165.        
  166.         public static void method_get() {
  167.                 String str = "abcdefabss";
  168.                
  169.                 //长度
  170.                 sop(str.length());
  171.                
  172.                 //根据索引获取字符
  173.                 sop(str.charAt(4));//当访问到字符串中的下标不存在时会出现StringIndexOutOfBoundsException
  174.                
  175.                 //根据字符获取索引
  176.                 sop(str.indexOf('a'));
  177.                 sop(str.indexOf('a',3));//如果没有找到则返回-1
  178.                
  179.                 //反向索引一个字符出现的位置,返回该字符在String中的下标。
  180.                 sop(str.lastIndexOf('a'));
  181.                
  182.                 //子串
  183.                 sop(str.substring(2));
  184.                 sop(str.substring(2,4));
  185.         }
  186.        
  187.         public static void main(String[] args) {
  188. //                method_get();
  189. //                method_is();
  190. //                sop(reverse(str));
  191. //                sop(reverse(str,2,6));
  192.                 sop(getMaxSubString("dsalkjflksdfj","rrueuiorsaxcmvm"));
  193.         }
  194.        
  195.         public static void sop(Object obj) {
  196.                 System.out.println(obj);
  197.         }
  198.        
  199.         /*
  200.          * 模拟一个trim方法,去除字符串两端的空格。
  201.          * 思路:
  202.          *     1.获取字符串第一个不为空格字符的下标(分别从左到右和从右到左)
  203.          *     2.将左右两边第一个不为字符的下标的中间部分截取出来就是trim后的字符串
  204.          *
  205.          */
  206.         public static String myTrim(String str) {
  207.                 int start=0;
  208.                 int end=str.length()-1;
  209.                 while(start<=end && str.charAt(start) == ' ')
  210.                         start++;
  211.                 while(start<=end && str.charAt(end) == ' ')
  212.                         end--;
  213.                
  214.                 return str.substring(start,end+1);
  215.         }
  216.        
  217.         /*
  218.          * 将一个字符串进行反转。
  219.          * 思路:
  220.          *     1.将字符串转换成字符数组
  221.          *     2.将字符数组进行反转
  222.          *     3.将反转后的字符数组转换成字符串
  223.          */
  224.         public static String reverse(String str) {
  225.                 //方法一
  226. //                StringBuilder sb = new StringBuilder(str);
  227. //                sb.reverse();
  228. //                return sb.toString();
  229.                 //方法二
  230.                 char[] chs = str.toCharArray();
  231.                 for(int start=0,end=chs.length-1; start < end; start++,end--)
  232.                         swap(chs,start,end);
  233.                
  234.                 return String.valueOf(chs);
  235.         }
  236.        
  237.         public static void swap(char[] chs, int start, int end) {
  238.                 char temp = chs[start];
  239.                 chs[start] = chs[end];
  240.                 chs[end] = temp;
  241.         }
  242.        
  243.         //将字符串中指定部分进行反转。
  244.         public static String reverse(String str, int start, int end) {
  245.                 char[] chs = str.toCharArray();
  246.                 for(int left=start,right=end-1; left<right; left++,right--)
  247.                         swap(chs,left,right);
  248.                
  249.                 return String.copyValueOf(chs);               
  250.         }
  251.        
  252.         /*
  253.          * 获取一个字符串在另一个字符串中出现的次数
  254.          */
  255.         public static int subCount(String str,String key) {
  256.                 int count = 0;
  257.                 int index = 0;
  258.                 while((index=str.indexOf(key,index))!=-1) {
  259.                         count++;
  260.                         index+=key.length();
  261.                 }
  262.                 return count;
  263.         }
  264.        
  265.         /*
  266.          * 获取两个字符串中最大相同子串
  267.          * 思路:
  268.          *     1.将短的字符串依次缩减在长的字符串中进行匹配
  269.          */
  270.         public static String getMaxSubString(String s1, String s2) {
  271.                 String max = s1.length()>s2.length()?s1:s2;
  272.                 String min = max==s1?s2:s1;
  273.                 for(int x=0; x<min.length(); x++)
  274.                         for(int y=0,z=min.length()-x; z<=min.length(); y++,z++) {
  275.                                 String temp = min.substring(y, z);
  276.                                 if(max.contains(temp))
  277.                                         return temp;
  278.                         }
  279.                
  280.                 return "";
  281.         }
  282. }
复制代码
以上基本上可以干掉绝大部分String的问题。
接下来还需要从JVM或更高的角度对String作深入分析,以下是我从网上看的很好的博客,写的比我的好就引用一下:
深入理解Java:String
后面的就需要项目来进行巩固了,比如hadoop对String的处理就比较多,还有就是面试题,多看多写多思考。


作者: 936994215    时间: 2016-7-4 18:05
郁闷了,还是不太会用黑马论坛,大家有兴趣的可以去我的博客,地址:http://codeforgod.github.io
作者: Huyaal    时间: 2016-7-5 00:56
支持一下下
作者: 糊图    时间: 2016-7-5 23:46
比较用心,顶你
作者: 呆呆的小呆    时间: 2016-7-6 00:09
太棒啦 赶快收藏
作者: perfect_class    时间: 2016-7-6 10:16
楼主分析的很透彻,赞一下!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2