16.Java中的String详解
01.String(概述)
字符串是一个特殊对象。
字符串最大特点:一旦被初始化就不可以改变。
==是比较两个对象。而equals是比较对象引用的地址值。
String类复写了Object类中的equals方法,该方法用于判断字符串是否相同。
s1和s2的区别?
String s1="abc";
String s2=new String("abc");
s1有一个对象,s2有两个对象。
02.String(常见功能-获取和替换)
String类是用于描述字符串事物的,那么他就提供了多个方法对字符串进行操作。
常见操作:
1.获取。
1.1:字符串中包含的字符数,也就是字符串的长度。
int length();获取长度
1.2:根据位置获取位置上的某个字符。
char CharAt(int index);
1.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相反,从右往左查找。
2.判断。
2.1:字符串中是否包含某一个字串。
boolean contains(String str);
特殊之处:indexOf(string str):可以索引str第一次出现位置,如果返回-1,表示str不在字符串中存在,所以也可以用于对指定判断是否包含;所以该方法即可以判断,又可以获取出现位置。
2.2:字符串中是否有内容。
boolean isEmpty();就是判断长度是否为0;
2.3:字符串是否以指定内容开头。
boolean startsWith(String str);
2.4:字符串是否以指定后缀结尾。
2.5:判断字符串内容是否相同,复写了Object类中的equals()方法。
boolean equals(String str);
2.6:判断内容是否相同,并忽略大小写;
boolean equalsIgnoreCase();
03.String(转换)
3.1:将字符数组转换成字符串。
构造函数:String(char());String(char[],offset,count);将字符数组中的一部分转成字符串。char[]是字符数组,offset是开始位置,count是个数。
静态方法:static String copyValueOf(char[] data,int offset,int count);
3.2:将字符串转成字符数组。
char[] toCharArray();
3.3:将字节数组转成字符串。
String(byte());String(byte[],offset,count);将字字节数组中的一部分转成字符串。char[]是字节数组,offset是开始位置,count是个数。
3.4:将字符串转成字节数组。
byte[] getBytes();
3.5:将基本数据类型转成字符串。static String valueOf(int);static String valueOf(double);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
04.String-切割和替换
替换:String replace(oldchar,newchar);如果要替换子字符不存在,返回的是原串。
切割:String[] split(regex);
字串:获取字符串中的一部分。
String substring(begin);从指定位置开始到结尾。如果角标不存在,会发生角标越界异常。
String substring(begin,end);包含头,不包含尾。
05.String-转换-去除空格-比较
1.将字符串转换成大写或小写。
String toUpperCase();String toLowerCase();
2.将字符串两端的空格去掉;
String trim();
3.对两个字符串进行自然顺序的比较。
boolean compareTo(String);
06.String-字符串练习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));
}
}
07.String-字符串练习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);
}
08.String-字符串练习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;
}
}
//while((index=fatherStr.indexOf(sonStr))!=-1)
//{
// fatherStr=fatherStr.substring(index+sonStr.length());
// count++;
//}
return count;
}
09.String-字符串练习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 "";
}
10.11.StringBuffer-常见功能
字符串的组成原理就是通过该类实现的
StringBuffer可以对字符串内容进行增删
StringBufffer是一个容器
很多方法与String相同
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):把缓冲区中的指定数据存储到指定数组中。
12.StringBuilder
在JDK1.5版本之后出现了StringBuilder,不同之处在于:StringBuffer是线程同步的,StringBuilder是线程不同步。
建议:多线程用StringBuffer,单线程用StringBuilder
以后开发建议使用StringBuilder
java升级三因素:提高效率;简化书写;提高安全性。
13.基本数据类型对象包装类
byte Byte
short short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
基本数据类型对象包装类的最常见作用:
就是用于基本数据类型和字符串之间相互转换。
基本数据类型转字符串:
基本数据类型+"";
基本数据类型.toString(基本数据类型值);如Integer.toString(34):将34转成“34”。
字符串转基本数据类型:
Integer.parseInt(String str);将字符串转换成整数。
Long.parseLong(String str);将字符串转换成长整型数。
以此类推。。。。。。
xxx a=Xxx.parseXxx(String str);必须传入数字格式的字符串
boolean b=parseBoolean(str);
十进制转成其他进制:
toBinaryString()
toHexString()
toOctalString()
其他进制转成十进制:
Integer.parseInt(str,int wei):位代表str所代表的进制,转成十进制。
Integer i=new Integer("123");
int num=i.intValue();
这个是对象调用方式。
上面的是静态调用方式。
14.基本数据类型对象包装类新特性
Integer x=new Integer("123");
Integer y=new Integer(123);
x==y是false
x.equals(y)是true
JDK1.5以后出现以下新特性:
Integer i=4;
自动装箱。
还可以直接进行运算:i=i+2;
自动拆箱,变成int类型,和2进行加法运算,再将和进行拆箱赋给x。
还可以Integer i=null;
但当i=null时,进行运算会出现异常。
Integer x=128;Integer y=128;
(x==y)的值为false
Integer x=127;Integer y=127;
(x==y)的值为true
因为a和b指向了同一个Integer对象,因为当数值在byte范围内时,对于新特性,如果该数值已经存在,则不会开辟新空间。