-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
1、概述
String是一个特殊的类,一旦被初始化,那么就不能被改变,String类是一个被final修饰的类。
2、String初始化
String s1=”abc”;这个表示的是一个对象,但是不是在内存中创建的,而是在内存的缓冲区(常量池)中创建了一个“abc”对象,只有通过new关键字创建的,才在堆中申请了内存空间,并且在栈中有声明的变量名称。
当有Strings1=”abc”,String s2=”abc”;都执行的话,当执行了s1后,会在内存的缓冲区(常量池)中创建了”abc”字符串对象,然后在执行s2的时候,那么先去内存缓冲区查找,要是存在了,那么就直接指向此对象,直接使用,所以,这两句话也就纯创建了一个”abc”字符串。
String str=new String(“xyz”);这是创建了两个对象,一个是先在内存中通过new创建了一个对象,然后在内存缓冲区中又创建了一个字符串“xyz”,然后在内存中的指向了内存缓冲区(常量池)中的对象。
在常量池中只有一个相等的字符串,但是在内存中可以有多个相等的字符串。
3、获取
3.1、字符串中包含的字符数,也就是字符串的长度。
int length();获取长度
3.2、根据位置获取位置上的某个字符。
char CharAt(int index);
3.3、根据字符获取该字符在字符串中的位置。
int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
int indexOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中的位置。
int indexOf(String str);返回的是str在字符串中第一次出现的位置。
int indexOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中的位置。
注意:当访问到字符串中不存在的角标时,会发生StringIndexOutOfBoundsException角标越界。
int lastIndexOf(int ch);和indexOf相反,从右往左查找。
4、判断
4.1、字符串中是否包含某一个字串。
boolean contains(String str);
特殊之处:indexOf(string str):可以索引str第一次出现位置,如果返回-1,表示str不在字符串中存在,所以也可以用于对指定判断是否包含;所以该方法即可以判断,又可以获取出现位置。
4.2、字符串中是否有内容。
boolean isEmpty();就是判断长度是否为0;
4.3、字符串是否以指定内容开头。
boolean startsWith(String str);
4.4、字符串是否以指定后缀结尾。
4.5、判断字符串内容是否相同,复写了Object类中的equals()方法。
boolean equals(String str);
4.6、判断内容是否相同,并忽略大小写;
boolean equalsIgnoreCase();
5、转换
5.1、将字符数组转换成字符串。
构造函数:String(char());String(char[],offset,count);将字符数组中的一部分转成字符串。char[]是字符数组,offset是开始位置,count是个数。
静态方法:static String copyValueOf(char[] data,int offset,int count);
5.2、将字符串转成字符数组。
char[] toCharArray();
5.3、将字节数组转成字符串。
String(byte());String(byte[],offset,count);将字字节数组中的一部分转成字符串。char[]是字节数组,offset是开始位置,count是个数。
5.4、将字符串转成字节数组。
byte[] getBytes();
5.5、将基本数据类型转成字符串。static String valueOf(int);static String valueOf(double);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
6、String-切割和替换
替换:String replace(oldchar,newchar);如果要替换子字符不存在,返回的是原串。
切割:String[] split(regex);
字串:获取字符串中的一部分。
String substring(begin);从指定位置开始到结尾。如果角标不存在,会发生角标越界异常。
String substring(begin,end);包含头,不包含尾。
7、String-转换-去除空格-比较
1.将字符串转换成大写或小写。
String toUpperCase();String toLowerCase();
2.将字符串两端的空格去掉;
String trim();
3.对两个字符串进行自然顺序的比较。
boolean compareTo(String);
8、练习1
需求:
模拟一个trim方法,去除字符串两端的空格
思路:
判断字符串第一个位置是否是空格,如果是继续向下判断,知道不是空格为止。判断结尾处空格也是如此。
当开始和结尾都判断不是空格时,就是要获取的字符串。
class TrimDemo
{
//判断字符串前空格的截止位置
private int getStartIndex(String str)
{
int index=0;
while(index<=str.length()-1&&str.charAt(index)==' ')
{
index++;
}
return index;
}
//判断字符串后空格的截止位置
private int getLastIndex(String str)
{
int index=str.length()-1;
while(index>=0&&str.charAt(index)==' ')
{
index--;
}
return index;
}
//获取去掉前后空格的字符串
public String getTrim(String str)
{
int startIndex=getStartIndex(str);
int lastIndex=getLastIndex(str);
return str.substring(startIndex,lastIndex+1);
}
}
class TrimTest
{
public static void main(String[] args)
{
String str=" 许前刚 ";
System.out.println("去空格前的字符串为:");
System.out.println(str);
System.out.println("去空格后的字符串为:");
System.out.println(new TrimDemo().getTrim(str));
}
}
9、练习2
需求:将一个字符串进行反转。将一个字符转指定位置进行反转,“abcdefg”;abedcfg
思路:
曾经学习过对数组元素进行反转
将字符串变成数组,对数组进行反转
将翻转后的数组变成字符串
只要将被翻转的部分的开始和结束位置作为参数传递即可
//将一个字符串指定部分进行反转
public static String fanZhuan(String str,int start,int end)
{
String str1=str.substring(start,end+1);
char[] ch=str1.toCharArray();
for(int i=0;i<=(ch.length-1)/2;i++)
{
char temp=ch[i];
ch[i]=ch[ch.length-1-i];
ch[ch.length-1-i]=temp;
}
//for(int start=0,end=ch.length;start<end;start++,end--)
//{
// char temp=ch[start];
// ch[start]=ch[end];
// ch[end]=temp;
//}
String str2=new String(ch);
return str.substring(0,start)+str2+str.substring(end+1);
}
10、练习3
需求:
获取一个字符串在另一个字符串中出现的次数。abkkcdkkefkkghkk
思路:
定义一个计数器
获取kk第一次出现的位置
从第一次出现位置后剩余的字符串中继续获取kk出现的位置
每获取一次计数一次
当获取不到时,计数完成
//获取一个字符串在另一个字符串中出现的次数
public static int getCount(String fatherStr,String sonStr)
{
int count=0;
int index=0;
while(true)
{
int y=fatherStr.indexOf(sonStr,index);
if(y!=-1)
{
count++;
index=y+1;
}
else
{
break;
}
}
return count;
}
11、练习4
需求:
获取两个字符串中最大相同字串。第一个动作:将短的那个串进行长度依次递减的字串打印
思路:
将短的那个字串按照长度依次递减的方式获取到
将每获取到的字串去长串中判断是否包含,如果包含已经找到。
//获取两个字符串中最大相同字串。
public static String getMaxSubString(String maxStr,String minStr)
{
for(int x=0;x<minStr.length();x++)
{
for(int y=0,z=minStr.length()-x;z!=minStr.length()+1;y++,z++)
{
String temp=minStr.substring(y,z);
if(maxStr.contains(temp))
{
return temp;
}
}
}
return "";
}
12、StringBuffer-常见功能
StringBuffer是一个容器,可以对字符串内容进行增删,可变长度的
特点:
长度是可变的
可以字节操作多个数据类型
最终会通过toString方法变成字符串
(1)存储
StringBuffer append():将指定数据添加到已有数据的结尾处
StringBuffer insert(index,数据):可以将数据插入到指定index位置
(2)删除
StringBuffer delete(int startint end):删除缓冲区中的数据,包含头,不包含尾。delete(0,sb.length());清空缓冲区
StringBuffer deleteCharAt(index):删除指定位置的字符,就是删一个字符。
(3)获取
char charAt(index);根据指定位置获取指定字符。
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start,int end);
(4)修改
StringBuffer replace(start,end,String str);str是替换成的字符。这是替换一部分。
void setCharAt(index,char ch);替换指定位置的字符
(5)反转
StringBuffer reverse();反转
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):把缓冲区中的指定数据存储到指定数组中。
13、StringBuilder
在JDK1.5版本之后出现了StringBuilder,不同之处在于:StringBuffer是线程同步的,StringBuilder是线程不同步。
建议:多线程用StringBuffer,单线程用StringBuilder
以后开发建议使用StringBuilder
java升级三因素:提高效率;简化书写;提高安全性。
14、基本数据类型对象包装类
byte Byte
short short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
最常见作用:用于基本数据类型和字符串之间相互转换。