String类-常见功能
字符串是一个特殊的对象;
字符串一旦初始化就不可以被改变;
package cn.itcast.p1.stirng.demo; public class StringDemo { /** * @param args */ public static void main(String[] args) { /* * String类的特点 * 字符串对象一旦被初始化就不会被改变 */ stringDemo2(); } private static void stringDemo2() { String s="abc";//在常量池中创建了"abc"字符串 String s1=new String("abc");//创建两个对象,一个new,一个子字符串,在堆内存中 // System.out.println("s="+s); // System.out.println("s="+s1); System.out.println(s==s1);//false,地址不同 System.out.println(s.equals(s1));//true,String类覆写了Object类中的equals方法 //字符串的equals比较的是内容 } /** * 演示字符串定义的第一种方式,并明确字符串常量池的特点 * 池中没有则建立,池中有则直接使用 */ private static void stringDemo1() { String s="abc";//"abc"存储在常量池中 String s1="abc"; System.out.println(s==s1);//true // System.out.println("s="+s); } }
按面向对象的思想对字符串进行功能分类
1.获取:
1.1 获取字符串中字符的个数(长度);
int length();
1.2 根据位置获取字符;
char charAt(int index);
1.3 根据字符,获取在字符串中第一次出现的位置;
int indexOf(int ch);
int indexOf(int ch,int fromIndex);//从指定位置进行查找ch第一次出现的位置,如果未出现该字符则返回-1
int indexOf(String str);int indexOf(String str,int fromIndex);
int lastIndexOf(int ch); // 返回指定字符在此字符串中最后一次出现处的索引
int lastIndexOf(int ch,int fromIndex);//返回指定字符在此字符串中最后一次出现处的索引,
//从指定的索引处开始进行反向搜索
int lastIndexOf(String str);int lastIndexOfndexOf(String str,int fromIndex);
1.4 获取字符串中的一部分字符串,也叫子串
String substring(int beginIndex, int endIndex);//从beginIndex开始到endIndex-1,包含begin而不包含end
String substring(int beginIndex);
示例:
private static void stringMethodDemo_1() { String s="abcdae"; System.out.println("length="+s.length());//6 System.out.println("char="+s.charAt(2));//c System.out.println("index="+s.indexOf('a'));//0 System.out.println("index="+s.indexOf('k'));//-1,可以根据-1来判断字符或者字符串是否存在 System.out.println("lastIndex="+s.lastIndexOf('a'));//4 System.out.println("substring="+s.substring(2,4));//cd }
2.转换:
2.1 将字符串转成字符串数组(字符串的切割);
String[] split(String regex);//涉及到正则表达式
2.2 将字符串转成字符数组;
char[] toCharArray();
2.3 将字符串转成字节数组;
byte[] bytes=s.getBytes();
2.4 将字符串中的字母转换大小写;
String toUpperCase();//转为大写
例:System.out.println("abc".toUpperCase());
String toLowerCase();//转为小写
2.5 将字符串中的内容进行替换;
String replace(char oldChar,char newChar);
例:System.out.println("java".replace('a','o'));
如果替换失败,则返回原字符串(地址不变)
String replace(String s1,String s2);
2.6 将字符串两端的空格去除
String trim();//返回字符串的副本,忽略前导空白和尾部空白
例:System.out.println("-"+" a b c ".trim()+"-");//-a b c-
2.7 将字符串进行连接
String concat(string);
例:System.out.println("abc".concat("kk"));
private static void stringMethodDemo_2() { String s="张三,李四,王五"; String[] arr=s.split(","); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } char[] chs=s.toCharArray(); for (int i = 0; i < chs.length; i++) { System.out.println(chs[i]); } s="ab你"; byte[] bytes=s.getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.println(bytes[i]); } }
3 判断
3.1 两个字符串内容是否相同
boolean equals(Object obj);
booleam equalsIgnoreCase(string str);//忽略大小写比较字符串内容是否相同
例:System.out.println(s.equalsIgnoreCase("ABC"));
3.2 字符串中是否包含指定字符串
boolean contains(string str);
例:System.out.println(s.contains("ab"));
3.3 字符串是否以指定字符串开头,是否以指定字符串结尾
boolean startsWith(string);
boolean endsWith(string);
例:String str="ArrayDemo.java";
System.out.println(str.startsWith("Array"));//true
System.out.println(str.endsWith(".java"));//true
4 比较
int compareTo(string);
例:System.out.println("a".compareTo("c"));//-2
intern方法
intern():对字符串池进行操作、
String类练习
package cn.itcast.p1.stirng.demo; /* * 1.给定一个字符串数组,按照字典书序进行从小到大的排序 * {"nba","abc","cba","zz","qq","haha"} * 思路: * 1.对数组排序。可以用选择、冒泡法等排序。 * 2.for嵌套、比较以及换位 * 3.对象中提供了用于字符串比较的功能 */ public class StringTest1 { public static void main(String[] args) { String[] arr = { "nba", "abc", "cba", "zz", "qq", "haha" }; printArray(arr); sortString(arr); printArray(arr); } public static void printArray(String[] arr) { System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i != arr.length - 1) System.out.print(arr[i] + ","); else System.out.println(arr[i] + "]"); } } public static void sortString(String[] arr) { for (int i = 0; i < arr.length-1; i++) { for(int j=i+1; j < arr.length; j++) { if(arr[i].compareTo(arr[j])>0)//字符串比较用compareTo方法 swap(arr,i,j); } } } private static void swap(String[] arr, int i, int j) { String temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } /* *输出结果 *[nba,abc,cba,zz,qq,haha] *[abc,cba,haha,nba,qq,zz] */
package cn.itcast.p1.stirng.demo; /* * 2.一个子串在整串中出现的次数 * "nbaernbatynbauinbaopnba" * 思路: * 1.获取要找的子串是否存在,如果存在,获取其出现的位置 ,这个可以使用indexOf()完成 * 2.如果找到了,那么记录出现的位置并在剩余的字符串中继续查找该子串, * 剩余字符串的起始位置为出现位置+子串长度 * 3.以此类推,通过循环完成查找,如果找不到就是-1,并在每次找到时用计数器count记录 */ public class StringTest2 { public static void main(String[] args) { String str = "nbaernbatynbauinbaopnba"; String key = "nba"; // int count = getKeyStringCount(str, key); int count = getKeyStringCount_2(str, key); System.out.println("count=" + count); } private static int getKeyStringCount_2(String str, String key) { int count=0; int index=0; while((index=str.indexOf(key,index))!=-1){ index=index+key.length(); count++; } return count; } /** * 获取子串在整串中出现的次数 * @param str * @param key * @return */ private static int getKeyStringCount(String str, String key) { // 1.定义计数器 int count = 0; // 2.定义变量记录key出现的位置 int index = 0; while ((index = str.indexOf(key)) != -1) { str = str.substring(index + key.length()); count++; } return count; } }
package cn.itcast.p1.stirng.demo; /* * 3.两个字符串中最大相同的子串 * "qwerabcdtyuiop" * "xcabcdxbn" * 思路: * 1.取的是最大子串,先看短的字符串是否是长字符串的子串; * 2.如果存在,则短串就是最大子串; * 3.如果不是,则将短串以递减的方式取子串,去长串中是否存在; * 4.如果存在,就已找到最大子串,否则重复3。 */ public class StringTest3 { public static void main(String[] args) { String s1="qwerabcdtyuiop"; String s2="xcabcdxbn"; String s=getMaxSubString(s1,s2); System.out.println("s="+s); } /** * 获取最大子串 * @param s1 * @param s2 * @return */ private static String getMaxSubString(String s1, String s2) { String max=null,min=null; max=(s1.length()>s2.length()?s1:s2); min=max.equals(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++){ String sub=min.substring(y,z); // System.out.println(sub); if(max.contains(sub)) return sub; } } return null; } }
package cn.itcast.p1.stirng.demo; /* * 4.模拟一个trim功能一致的方法,去除字符串两端的空白 * 1.定义两个变量,一个变量作为从头开始判断字符串空格的下标(++); * 另一个从尾开始判断(--); * 2.判断到不是空格为止,取首尾之间的子串即可; */ public class StringTest4 { /** * @param args */ public static void main(String[] args) { String s = " ab c "; s = myTrim(s); System.out.println("-" + s + "-"); } public static String myTrim(String s) { int start = 0, end = s.length() - 1; while (start <= end && s.charAt(start) == ' ') { start++; } while (start <= end && s.charAt(end) == ' ') { end--; } return s.substring(start, end + 1); } }
StringBuffer(字符串缓冲区对象)※
StringBuffer就是字符串缓冲区,用于存储数据的容器;
特点:
1.长度是可变的;
2.可以存储不同类型的数据;
3.最终要转成字符串进行使用;
4.可以对字符串进行修改;
既然是容器对象,则应具有什么方法?
1.添加;
StringBuffer append(data);
StringBuffer insert(index,data);
2.删除;
StringBuffer delete(start,end);// 包含头,不包含尾
StringBuffer deleteAt(int indxe);//删除指定位置元素
s.delete(0,s.length());//清空缓冲区
3.查找
char charAt(index);
int indexOf(string);
int lastIndexOf(string);
4.修改
StringBuffer replace(start,end);//包含头,不包含尾
void setCharAt(index,char);
void setLength(int newLength) //设置字符序列的长度
StringBuffer reverse();// 将此字符序列用其反转形式取代
StringBuffer示例:
public class StringBuilderTest { /** * @param args */ public static void main(String[] args) { int[] arr={3,1,5,3,8}; String s=arrayToString_2(arr); System.out.println(s); } /** * 将一个int数组变成字符串 */ public static String arrayToString_2(int[] arr){ StringBuilder sb=new StringBuilder(); sb.append("["); for (int i = 0; i < arr.length; i++) { if(i!=arr.length-1) sb.append(arr[i]+","); else sb.append(arr[i]+"]"); } return sb.toString(); } public static String arrayToString(int[] arr){ String str="["; for (int i = 0; i < arr.length; i++) { if(i!=arr.length-1) str+=arr[i]+","; else str+=arr[i]+"]"; } return str; } }