奋斗黑马程序员----Java之String对象

来源:互联网 发布:java多线程处理高并发 编辑:程序博客网 时间:2024/04/29 20:40
----------android培训java培训、期待与您交流! ----------
 
/**Java之String类小结 *  *//**1,String对象 * String对象的API解释: *    public final class String--extends Object -implements Serializable,  * Comparable<String>, CharSequenceString 类代表字符串。Java 程序中的所 * 有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值 * 在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不 * 可变的,所以可以共享 *  *  * 在java中,字符串是一个特殊的“对象”,字符串一旦初始化就不可以改变 *  String str = "abc"; *  String str1 = new String("abc"); * 有什么区别?? */public class StringDemo {public static void main(String[] args){String s = new String();String s1 = "";System.out.println(s==s1);//结果:falseSystem.out.println(s.equals(s1));//结果:true/* * 上面两个是一回事,但下面的比上面的要简单的多 *//* * 解读:String s1 = "abc"; *   其中,s1是一个类类型变量,"abc"是一个对象。一个特殊的对象。 * 只要用双引号引起来的,都是一个对象。。 * 字符串最大的特点在于:一旦被初始化,就不可以被改变。。 */String s2 = "abc";String s3 = new String("abc");System.out.println(s2==s3);//false,s2和s3是不同的对象,所以不相等System.out.println(s2.equals(s3));//equals,比较的是值,所以为true。//String类复写了Object类中的equals方法,该方法用于判断字符串是否相同/* 重点: * s2和s3在使用起来是一样的,但是有区别: *  s2在内存中有一个对象,s3有两个对象【"abc"是一个对象,new String()也 * 是一个对象,所以有两个对象】 */String s1 = "abc";String s2 = "abc";System.out.println(s1==s2);//结果:true/*因为,当s1存储了一个"abc"时,常量池中就存在了“abc”,已经在内存中存在了, *初始化s2时,发现内存中已经存在了,s2就不会再独立开辟内存空间,以节省内存.  * 所以打印s1==s2时,会是true */}}/**2,String常用功能: *  String类是用于描述字符串事物,操作字符串,它最清楚. * 那么它就提供了多个方法对字符串进行操作. *  * 常见的操作有:"abcde" * 1,获取: *  int length()  返回此字符串的长度。 [数组的长度length不带括号"()"] *      char charAt(int index) 返回指定索引处的 char 值。 返回值类型是char类型的 *       *  indexOf()系列: *      int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。  *      int indexOf(int ch, int fromIndex) 返回在此字符串中第一次出现指定字符处 * 的索引,从指定的索引开始搜索。  * int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。  * int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第 * 一次出现处的索引,从指定的索引开始。 *  * lastIndexOf()系列: * int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。  * int lastIndexOf(int ch, int fromIndex) 返回指定字符在此字符串中最后一 * 次出现处的索引,从指定的索引处开始进行反向搜索。  * int lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引。  * int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串 * 中最后一次出现处的索引,从指定的索引开始反向搜索。  *  * 2.判断. * boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序 * 列时,返回 true。(只能是串,不能使字符,否则报错);特殊之处,indexOf(str);可 * 以索引str第一次出现的位置,如果返回-1,表示该str不存在字符串中,所以,也可以 * 用于对指定字符串的判断是否包含。if(str.indexOf("aa")!=-1)而且该方法,既可 * 以判断,又可以获取出现的位置, * boolean isEmpty() 当且仅当 length() 为 0 时返回 true。 * boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始。   * boolean startsWith(String prefix, int toffset) 测试此字符串从指定索 * 引开始的子字符串是否以指定前缀开始。 *  * boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。  * boolean equals(Object anObject) 将此字符串与指定的对象比较。  * boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个  * String 比较,不考虑大小写。  *   * 3,装换: * 构造函数:String(char[]); * 构造函数:String(char[] offset,coutn);将字符数组中的一部分转成字符串。 *  * static String copyValueOf(char[] data) 返回指定数组中表示该字符序列的 String。  * static String copyValueOf(char[] data, int offset, int count) 返回 * 指定数组中表示该字符序列的 String。(取子串 ) * static String valueOf(基本数据类型   b) 返回 基本数据类型 参数的字符串表示形式。 *  char[] toCharArray() 将此字符串转换为一个新的字符数组。   *  * 构造函数:String(byte[]); * 构造函数:String(byte[] offset,coutn);将字节数组中的一部分转成字符串 *  getBytes();系列: * byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列, * 并将结果存储到一个新的 byte 数组中。  *  * static String valueOf(int);参数类型多样 * static String valueOf(double); *  * 特殊:字符串和字节数组在转换过程中,是可以指定编码表的。 *  * 4,替换: * String replace(char oldChar, char newChar) 返回一个新的字符串,它 * 是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 * String replace(CharSequence target, CharSequence replacement) 使 * 用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。  *  * 5,切割: * String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。  *  * 6,子串.获取字符串中的一部分。 * String substring(int beginIndex) 返回一个新的字符串,它是此字符 * 串的一个子字符串。 * String substring(int beginIndex, int endIndex) 返回一个新字符串, * 它是此字符串的一个子字符串。(包含头不包含尾) *  * 7,转换,去除空格,比较 * String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字 * 符都转换为小写。 * String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字 * 符都转换为大写。 * String trim() 返回字符串的副本,忽略前导空白和尾部空白。(删除空格) * char[] toCharArray() 将此字符串转换为一个新的字符数组。     * int compareTo(String anotherString) 按字典顺序比较两个字符串。 (结果: * 如果,相等,则结果为0,如果大于参数,为正数;如果小于参数,结果<0) */public class StringMethods {public static void main(String[] args){//method_get();//method_is();//method_trans();//method_replace();method_other();}/** * 获取方法 */public static void method_get(){String str = "abcdefighfijklmn";sop(str.length());//str的长度System.out.println(str.charAt(5));//结果:f,根据索引找字符,从0开始sop((str.charAt(4)));//esop(str.indexOf('i'));//6sop(str.indexOf('i',7));//10,从指定位置开始sop(str.indexOf("fig"));//5sop(str.indexOf("fi",6));//9sop(str.indexOf("kjdk"));//找不到就返回-1sop(str.lastIndexOf("fi",14));//9,反向索引}/** * 判断字符串方法 */public static void method_is(){String str = "StringMethod.java";sop(str.contains("r"));//要以字符串的形式传入,truesop(str.isEmpty());//falsesop(str.startsWith("str"));//falsesop(str.endsWith(".java"));//truesop(str.startsWith("d.j",11));//truesop(str.equals("stringMethod.java"));//falsesop("忽略大小写:"+str.equalsIgnoreCase("stringmethod.java"));//true}/** * 转换方法 */public static void method_trans(){char[] ch = new char[]{'a','b','3','d','i','0','k'};sop(new String(ch,1,5));//b3di0,包含首,不包含尾String str = String.copyValueOf(ch,1,5);//转换成字符串:b3di0sop(str);sop(String.copyValueOf(ch).getClass());//java.lang.Stringchar[] chh = str.toCharArray();//将字符串转成数组for(int i=0;i<chh.length;i++){System.out.print(chh[i]+" ");}sop("");byte[] by = str.getBytes();System.out.println(by[0]);for(int i=0;i<by.length;i++){System.out.print(by[i] +" ");}/* * 98 51 100 105 48 ,应该是对应的ASCII码 */sop(String.valueOf(true));sop(String.valueOf(3.289));}/** * 替换字符串的方法 */public static void method_replace(){String str = "StringMethod.java";String s1 = str.replace(".java",".txt");sop(s1);String s2 = str.replace('a','t');sop(s2);}/** * 字符串的其他方法 */public static void method_other(){String str = "   String.Method.java   ";sop("原来的字符串:"+str);String s1 = str.trim();sop("新字符串:"+s1);String str1 = "String,Method,java";String[] s2 = str1.split(",");for(int i=0;i<s2.length;i++){System.out.print(s2[i]+" ");}System.out.println();sop(str1.substring(8));//ethod,javasop(str1.substring(3,8));//ing,Msop(str1.toLowerCase());//string,method,javasop(str1.toUpperCase());//STRING,METHOD,JAVAsop(str1.compareTo("String,Method,}"));//根据ascii码}public static void sop(Object obj){System.out.println(obj);}}/**2:字符串练习一 * 1,模拟一个trim方法,去除字符串两端的空格。 * 思路: * 1,判断字符串第一个位置是否是空格,如果是,继续向下判断,知道不 * 是空格为止,结尾处判断空格也是如此 * 2,当开始和结尾都判断到不是空格时,就是要获取的字符串。 * 2,将一个字符串进行反转,将字符串中指定部分进行反转,“abcdefg”,abfedcg * 思路: * 1,曾经学习过对数组的元素进行反转 * 2,将字符串编程数组,对数组进行反转 * 3,将反转后的数组变成字符串, * 4,只要将或反转的部分的开始和结束位置作为参数传递即可。 * 3,获取一个字符串在两个字符串中出现的次数,"abkkcdkkefkkskk" * 思路: * 1,定义一个计数器 * 2,获取kk第一次出现的位置 * 3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置。 * 每获取一次就计数一次 * 4,当获取不到时,计数完成 * 4,获取两个字符串中最大相同子串。第一个操作:将短的那个串进行长度一次递减的 * 子串打印 * "abcwerthelloyuiodef" * "cvhellohmld" * 思路: * 1,将短的那个子串按照长度递减的方法获取到 * 2,将每获取到的子串去长串中判断是否包含,如果包含,已经找到! *  */public class StringExercise {public static void main(String[] args){String str = "    jaidfoj  lkk";String s2 = trim_1(str);System.out.println(s2);String s3 = myTrim(str);System.out.println(s3);String ss = "abcdefghijklmnopqrstuvwxyz";System.out.println(reverseString(ss));System.out.println(reverseString(ss,8,26));}//练习一(方法1,自己),去除字符串两端的空格public static String trim_1(String str){boolean b1 = str.startsWith(" ");boolean b2 = str.endsWith(" ");while(b1 || b2){if(str.startsWith(" ")){str = str.substring(1);//System.out.println(str);}if(str.endsWith(" ")){str = str.substring(0,str.length()-1);//System.out.println(str);}if(!str.startsWith(" ") && !str.endsWith(" ")){b1 = false;b2 = false;}}return str;}//练习一(方法2,老毕),去除字符串两端的空格public static String myTrim(String str){int start = 0,end = str.length()-1;while(start<=end && str.charAt(start)==' '){start++;}while(start<=end && str.charAt(end) == ' '){end--;}return str.substring(start,end+1);}//转换一个整串public static String reverseString(String str){/*char[] chs = str.toCharArray();reverse(chs,0,chs.length);return new String(chs);*///也可以这样return reverseString(str,0,str.length());}//转换字符串中的一部分public static String reverseString(String str,int start,int end){char[] chs = str.toCharArray();reverse(chs,start,end);return new String(chs);}//循环交换数组中的元素public static void reverse(char[] arr,int x,int y){for(int start = x,end = y-1;start < end;start++,end--){swap(arr,start,end);}}//交换数组中的两个元素public static void swap(char[] arr,int start,int end){char temp = arr[start];arr[start] = arr[end];arr[end] = temp;}}/** * 练习3 */public class StringTest3 {public static void main(String[] args){String str = "kkkkkkkkkkkkkkkkk";String sub = "kk";int count = getSubCount(str,sub);System.out.println(count);System.out.println("第二种方法");int count1 = getSubCount_2(str,sub);System.out.println("\""+sub+"\"在\""+str+"\"出现的次数是:"+count1);}public static int getSubCount(String str,String sub){int count = 0;int index = 0;while((index = str.indexOf(sub))!=-1){//System.out.println("index="+index);str = str.substring(index+sub.length());/* * 去子串,会让字符串的长度变短,所以index的值是不能相对于 * 原来的串来确定 * 该方法在内存中会产生很多字符串,效率低。 */count++;}return count;}/** * int lastIndexOf(int ch, int fromIndex) 返回指定字符在此字符串中最后一 * 次出现处的索引,从指定的索引处开始进行反向搜索。  * @param str * @param sub * @return */public static int getSubCount_2(String str,String sub){int count = 0;int index = 0;while((index = str.indexOf(sub,index))!=-1){index = index+sub.length();count++;//System.out.println("count===="+str.split(sub).length);//切割方法,不建议。/* * 切割为什么不行?因为,如果要查找的内容如果出现在两端的话,就会 * 切割出两个串,一个为空,另外一个是正常的。此时,次数就会多算一次 *  * String str = "kkkkkkkkkkkkkkkkk"; * String sub = "kk"; * 如果字符串和其子串是这样的话,怎么办? */}return count;}}/**练习四: * 问题: * String s1 = "adjfkdsfkkkkk"; * String s2 = "adjakkk"; * 如果子串是这样的,那么就只能判断出一个"adj",而没有判断出"kkk". * 怎么解决? * 思路:将取到的相同子串不用return返回,而是存到一个集合里,这样 * 就不必担心return后会结束循环了。 *  */public class StringTest4 {public static void main(String[] args){String s1 = "adjfkdsfkkkkk";String s2 = "adjakkk";String s = getMaxSubString(s1,s2);System.out.println(s);}public static String getMaxSubString(String s1,String s2){String max = (s1.length()>s2.length())?s1:s2;String min = (max == s1)?s2:s1;for(int x=0;x<min.length();x++){for(int y=0,z=min.length()-x;z!=min.length()+1;y++,z++){/*if(max.contains(min.substring(y, z))){return min.substring(y,z);}*/String temp = min.substring(y,z);if(max.contains(temp)){/* * 也可以这么判断:if(max.indexOf(temp)!=-1) */return temp;}}}return null;}}

----------android培训java培训、期待与您交流!----------

  详细请查看:http://edu.csdn.net/heima/