String类
String类是对字符串对象的封装,在实际开发中应用十分广泛。字符串是一种特殊的对象,String类的对象创建后存在于常量池中,一旦初始化就不能被改变。
对象创建:
首先是String 的构造方法,说明一下String s = ""; 和String s = new String();的区别:
String s = "";是在常量池中创建了一个对象,而String s = new String();是创建了两个对象。
如果在用String s = "abc"方法创建一个值为"abc"的字符串对象时,且常量池中已经存在一个值为"abc"的对象,那么不会再创建一个新的对象,而是把引用指向之前已经存在的对象,而用new String()方法创建则是新建一个对象。
例如:String s1 = "abc"; String s2 = "abc";
System.out.println(s1 == s2); //输出为true
常见操作:
1、获取
1.1字符串中包含的字符数,也就是字符串的长度
int length()://获取长度。
1.2根据位置获取位置上的某个字符
char charAt(int index)://当访问到字符串中不存在的角标时,会发生字符串角标越界的错误。
1.3根据字符获取该字符存在字符串的位置
int indexOf(int ch)://返回的是ch在字符串中第一次出现的位置。传入的是字符对应的ASCII码。如果没有找到,返回-1。
int indexOf(int ch,int fromIndex)://从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str)://返回的是str在字符串中第一次出现的位置。
int indexOf(String str,int fromIndex)://从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf()://反向索引
2、判断
2.1字符串中是否包含某一个子串
boolean contains(str);
2.2字符串中是否有内容
boolean ifEmpty();//判断是否为空串
2.3字符串是否是以指定内容开头
boolean startsWith(str);
2.4字符串是否是以指定内容结尾
boolean endsWith(str);
2.5判断字符串内容是否相同,String类复写了Object类中的equals方法,只会判断字符串是否相同,而不会判断地址。
boolean equals(str);
2.6判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
3、转换
3.1将字符数组转成字符串
构造函数:String (char[]);
String(char[],offset,count);//将字符数组中的一部分转成字符串。
静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset ,int count );
static String valueOf(char[]);
3.2将字符串转成字符数组
char[] toCharArray();
3.3将字节数组转成字符串
String (byte[]);
String (byte[],offset,count);//将字节数组中的一部分转成字符串。count表示个数。
3.4将字符串转成字节数组
byte[] getBytes();
3.5将基本数据类型转成字符串
String valueOf(int);
String valueOf(double);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4、替换
String replace(oldchar,newchar);//返回的是一个新字符串。如果要替换的字符不存在,返回的还是原字符串。
5、切割
String[] split(regex);//涉及到正则表达式的点,不能作为切割字符串的regex。
6、子串,获取字符串中的一部分
String substring(begin);//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
String substring(begin,end);//包含头,不包含尾。
7、转换,去除空格,比较
7.1将字符串转成大写或小写
String toUpperCase();
String toLowerCase();
7.2将字符串两端的多个空格去除
String trim();
7.3对两个字符串进行自然顺序的比较
int compareTo(String);
1.1字符串中包含的字符数,也就是字符串的长度
int length()://获取长度。
1.2根据位置获取位置上的某个字符
char charAt(int index)://当访问到字符串中不存在的角标时,会发生字符串角标越界的错误。
1.3根据字符获取该字符存在字符串的位置
int indexOf(int ch)://返回的是ch在字符串中第一次出现的位置。传入的是字符对应的ASCII码。如果没有找到,返回-1。
int indexOf(int ch,int fromIndex)://从fromIndex指定位置开始,获取ch在字符串中出现的位置。
int indexOf(String str)://返回的是str在字符串中第一次出现的位置。
int indexOf(String str,int fromIndex)://从fromIndex指定位置开始,获取str在字符串中出现的位置。
int lastIndexOf()://反向索引
2、判断
2.1字符串中是否包含某一个子串
boolean contains(str);
2.2字符串中是否有内容
boolean ifEmpty();//判断是否为空串
2.3字符串是否是以指定内容开头
boolean startsWith(str);
2.4字符串是否是以指定内容结尾
boolean endsWith(str);
2.5判断字符串内容是否相同,String类复写了Object类中的equals方法,只会判断字符串是否相同,而不会判断地址。
boolean equals(str);
2.6判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
3、转换
3.1将字符数组转成字符串
构造函数:String (char[]);
String(char[],offset,count);//将字符数组中的一部分转成字符串。
静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset ,int count );
static String valueOf(char[]);
3.2将字符串转成字符数组
char[] toCharArray();
3.3将字节数组转成字符串
String (byte[]);
String (byte[],offset,count);//将字节数组中的一部分转成字符串。count表示个数。
3.4将字符串转成字节数组
byte[] getBytes();
3.5将基本数据类型转成字符串
String valueOf(int);
String valueOf(double);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4、替换
String replace(oldchar,newchar);//返回的是一个新字符串。如果要替换的字符不存在,返回的还是原字符串。
5、切割
String[] split(regex);//涉及到正则表达式的点,不能作为切割字符串的regex。
6、子串,获取字符串中的一部分
String substring(begin);//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。
String substring(begin,end);//包含头,不包含尾。
7、转换,去除空格,比较
7.1将字符串转成大写或小写
String toUpperCase();
String toLowerCase();
7.2将字符串两端的多个空格去除
String trim();
7.3对两个字符串进行自然顺序的比较
int compareTo(String);
下面是在视频中讲到的几个字符串操作练习,示例代码如下:
1、模拟一个trim方法,去除字符串两端的空格。
class StringMethodTest
{
String trim(String s)
{
int start = 0, end = s.length()-1;
while(s.charAt(start) == ' ' )//从两端判断是否为空格,如果是则循环
start++;
while(s.charAt(end) == ' ')
end--;
return s.substring(start, end);//截取字符串
}
public static void main(String[] args)
{
StringMethodTest st = new StringMethodTest();
String s = " asd qweqw gsgs ";
s = st.trim(s);
System.out.println(s);
}
}
2、将一个字符串进行反转。
class StringMethodTest
{
String reverse(String s)
{
char[] c = s.toCharArray();//将字符串转成字符数组
for(int i = 0, j = c.length-1; i < j; i++, j--)//用循环进行首尾字符的对换
{
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
return new String(c);
}
public static void main(String[] args)
{
StringMethodTest st = new StringMethodTest();
String s = " asd qweqw gsgs ";
String s2 = st.reverse(s);
print(s2);
}
public static void print(String s)
{
System.out.println(s);
}
}
3、获取一个字符串在另一个字符串中出现的次数
<pre name="code" class="java">class StringMethodTest
{
int subCount(String s, String sub)//获取子串出现次数方法
{
int count = 0;
int index = 0;
while((index = s.indexOf(sub, index)) != -1)
{
index=index + sub.length();
count++;
}
return count;
}
public static void main(String[] args)//------------主函数--------------------------
{
StringMethodTest st = new StringMethodTest();
String s = " aasd qwaaeqaaw aaagsgaas ";
String sub = "aa";
print(st.subCount(s, sub));
}
public static void print(Object s)
{
System.out.println(s);
}
}
4、获取两个字符串的最大相同子串
class StringMethodTest
{
String findMaxSub(String s1, String s2)
{
String min = (s1.length() < s2.length()) ? s1 : s2 ;//选取两个字符串中较短的一个作为查询
String max = (min == s1) ? s2 : s1;
for(int i = 0; i < min.length(); i++)//较短字符串的循环 控制子串长度递减
{
for(int start = 0, end = min.length()-i; end <= min.length() ;start++ , end++)//子串逐个右移,并在长串中比较是否存在
{
if(max.contains(min.substring(start, end)) == true)
return min.substring(start, end);
}
}
return "no common subString";
}
public static void main(String[] args)//------------主函数--------------------------
{
StringMethodTest st = new StringMethodTest();
String s1 = "jioqnfoanjavaqwidhello";
String s2 = "aflhellokjjavaqij";
print(st.findMaxSub(s1, s2));
}
public static void print(Object s)
{
System.out.println(s);
}
}
StringBuffer类
StringBuffer类是字符串缓冲区。他是一个容器类,而且长度可变换,可以字节操作多个数据类型,最终会通过toString方法变成字符串。相较于String类,对字符串的处理要灵
活许多。
常见操作有:
1、存储
StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。
StringBuffer insert(int offset ,数据):可以将数据插入到指定offset位置。
2、删除
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer delete CharAt(index):删除指定位置的字符。
清空缓冲区:对象.delete(0,对象.length());
3、获取
char CharAt(int index);
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start,int end);
4、修改
StringBuffer replace(int start,int end,String str);
void setCharAt(int index,char ch);
5、反转
StringBuffer reverse();
6、将缓冲区中指定数据存储到指定字符数组中
voidgetChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)
在JDK1.5版本之后出现了StringBuilder。
StringBuffer是线程同步的。有锁。效率低
StringBuilder是线程不同步的。无锁。效率高
以后开发,建议使用StringBuilder。如遇多线程,使用StringBuffer或自己加锁。
升级三因素:
1、提高效率
2、简化书写
3、提高安全性。
常见操作有:
1、存储
StringBuffer append():将指定数据作为参数添加到已有数据的结尾处。
StringBuffer insert(int offset ,数据):可以将数据插入到指定offset位置。
2、删除
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer delete CharAt(index):删除指定位置的字符。
清空缓冲区:对象.delete(0,对象.length());
3、获取
char CharAt(int index);
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start,int end);
4、修改
StringBuffer replace(int start,int end,String str);
void setCharAt(int index,char ch);
5、反转
StringBuffer reverse();
6、将缓冲区中指定数据存储到指定字符数组中
voidgetChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)
在JDK1.5版本之后出现了StringBuilder。
StringBuffer是线程同步的。有锁。效率低
StringBuilder是线程不同步的。无锁。效率高
以后开发,建议使用StringBuilder。如遇多线程,使用StringBuffer或自己加锁。
升级三因素:
1、提高效率
2、简化书写
3、提高安全性。
基本数据类型包装类
根据java面向对象的思想,讲一切事物视为对象,基本数据类型也被封装,而好处是可以在这些数据类型类内部定义一下对数据进行操作的方法,和数据类型的边界值等属性,方便与程序员的使用。
基本数据类型对应的包装类
byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
基本数据类型对象包装类的最常见的作用,就是用于基本数据类型和字符串类型之间做转换。
基本数据类型转成字符串:
基本数据类型 + ""
基本数据类型.toString(数据值)
如Integer.toString(15);
字符串转成基本数据类型:
xxx a = Xxx.parseXxx(String);
如:int a = Integer.parseInt("15");
Integer i = new Integer("123");
int num = i. intValue();
十进制转其他进制:
toBinaryString();
toHexString();
toOctalString();
其他进制转成十进制:
parseInt(String, radix);
JDK1.5以后出现的新特性:
Integer x = new Integer(4);
就相当于 Integer x = 4; //称作自动装箱
也可以 x = x+2;//称为自动拆箱,先变成的int型 再和2进行加法运算
还有一点:新特性中,Integer对象在数值在byte范围内时,如果该数已经存在,再定义同样数值的对象时则不会再开辟新的空间。