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;
}
}