提纲:
1. String概述
2. String类的构造方法
3. String类的判断功能
4. String类的获取功能
5. String类的转换功能
6. String练习
7. String类的常见面试题
8. StringBuffer类
9. StringBuilder类
10. 基本数据类型对象包装类
1、字符串是一个特殊的对象
2、一旦初始化不能被改变
如:String s = “abc”;
s = “ddd”;
System.out.println(s);
结果为:ddd
注:但不能证明字符串被改变,改变的只是地址,原先s指向“abc”,现在指向“ddd”
3、String str = “abc”与String str = new String(“abc”)有什么区别
他俩是一个意思,查看API可知String有带参数的构造函数。前者更简单一些
1.常见的构造方法
Public String():空构造//空字符序列
public String(byte[] bytes):把字节数组转成字符串//byte[] b = {98,93,101};
//String s = new String(b);
public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
public String(char[] value):把字符数组转成字符串//char[] ch = {‘a’,’c’,’d’};
//String s = new String(ch);
public String(char[] value,int index,int count):把字符数组的一部分转成字符串
public String(String original):把字符串常量值转成字符串//String s = new String(“orginal”);
boolean equals(Object obj)//:比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str)//:比较字符串的内容是否相同,忽略大小写
boolean contains(String str)//:判断大字符串中是否包含小字符串
boolean startsWith(String str)//:判断字符串是否以某个指定的字符串开头
boolean endsWith(String str)//:判断字符串是否以某个指定的字符串结尾
boolean isEmpty()//:判断字符串是否为空。
int length()//:获取字符串的长度。
char charAt(int index)//:获取指定索引位置的字符
int indexOf(int ch)//:返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str)//:返回指定字符串在此字符串中第一次出现处的索引。
int indexOf(int ch,int fromIndex)//:返回指定字符在此字符串中从指定位置后第一次出现处的索引。
int indexOf(String str,int fromIndex)//:返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
lastIndexOf
String substring(int start)//:从指定位置开始截取字符串,默认到末尾。
String substring(int start,int end)//:从指定位置开始到指定位置结束截取字符串。
byte[] getBytes()//:把字符串转换为字节数组。
char[] toCharArray()//:把字符串转换为字符数组。
static String valueOf(char[] chs)//:把字符数组转成字符串。
static String valueOf(int i)//:把int类型的数据转成字符串。
注意:String类的valueOf方法可以把任意类型的数据转成字符串。
String toLowerCase()//:把字符串转成小写。
String toUpperCase()//:把字符串转成大写。
String concat(String str)//:把字符串拼接。
通过对以上内容的学习,利用上面的知识作如下的练习加以巩固。
1. 练习一,去除字符串两端空格
代码:
public static String myTrim(String str)
{
int start = 0,end = str.length()-1;
while(start<=end&&str.charAt(start)==' ')
start++;
while(start<=end&&str.charAt(end)==' ')
end--;
return str.substring(start,end+1);
}
/*
1 将字符串变成数组
2 对数组反转
3 将数组变化层字符串
*/
public static String reverseString(String s)
{
char[] chs = s.toCharArray();
reverse(chs);
return new String(chs);
}
private static void reverse(char[] arr)
{
for(int start=0,end=arr.length-1;startprivate static void swap(char[] arr,int x,int y)
{
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
思路:
1,定义一个计数器
2,获取kk第一次出现的位置
3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置
每获取一次就计数一次
4,当获取不到indexOf返回-1时计数完成
*/
public static int getSubCount(String str,String key)
{
int count = 0;
int index = 0;
while((index = str.indexOf(key))!=-1)
{
sop("str="+str);
str = str.substring(index+key.length());
count++;
}
return count;
}
//练习三,方式2
public static int getSubCount_2(String str,String key)
{
int count = 0;
int index = 0;
while((index=str.indexOf(key,index))!=-1)
{
sop("index="+index);
index = index+key.length();
count++;
}
return count;
}
第二种方式利用int indexOf(int ch,int fromIndex)方法,获取查找位置,就不用获取子串了,更简单高效
思路:
1,将短的那个子串按照长度递减的方式获取到
2,将每获取到的子串中判断是否包含,如果包含,找到!
public static String getMaxSubString(String s1,String s2)
{
String max = "",min = "";
max = (s1.length()>s2.length())?s1:s2;
min = (max==s1)?s2:s1;
sop("max="+max+".....");
sop("min="+min+".....");
for(int x=0; x<min.length(); x++)
{
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
{
String temp = min.substring(y,z);
if(max.contains(temp))
return temp;
}
}
return "";
}
1.判断定义为String类型的s1和s2是否相等
String s1 = “abc”;
String s2 = “abc”;
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
2.下面这句话在内存中创建了几个对象?
String s1 = new String(“abc”); //2
3.判断定义为String类型的s1和s2是否相等
String s1 = new String(“abc”);
String s2 = “abc”;
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
4.判断定义为String类型的s1和s2是否相等
String s1 = “a” + “b” + “c”;//常量运算,编译时已经确定
String s2 = “abc”;
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
5.判断定义为String类型的s1和s2是否相等
String s1 = “ab”;
String s2 = “abc”;
String s3 = s1 + “c”;//变量运算,运行时动态分配,从而是新的abc 不是s2指向的
System.out.println(s3 == s2);//false
System.out.println(s3.equals(s2)); //true
与StringBuffer的区别:StringBuffer是线程同步,StringBuildr是线程不同步,由于简化同步操作,后者效率更高。多线程建议使用StringBuffer,单线程建议使用StringBuilder。
1.基本数据类型和它们对应的包装类如下:
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
将基本数据类型包装后能提供更多的方法,实现更强大的功能。最常见的作用:用于基本数据类型和字符串类型之间做转换。
基本数据类型转换成字符串:
基本数据类型+””
基本数据类型.toString(基本数据类型值)
字符串转成基本数据类型:
X a = X.parseX(String):X代表基本数据类型的包装类
若字符串书写格式不是基本数据,会报数据格式异常
2.重要的方法
十进制转换
Integer.toBinaryString();转换成二进制
Integer.toHexString();转换成十六进制
Integer.toOctalString();转换成八进制
其他进制转换成十进制
parseInt(String s,int radix)接收指定进制的数字字符串,转换成十进制
Integer()构造方法
Integer(String s)接收数字字符串
Integer.intValue();基本数据包装类转换成基本数据类型
3. 1.5版本新特性 基本数据类型自动装箱
Integer x=4;数值自动装箱变成对象
x=x+2;这个语句先进行自动拆箱,变成int类型,加法运算后,再自动装箱
注意:若x=null,会抛空指针异常
下面代码:
Integer a=128;
Integer b=128;
System.out.println(a==b);//打印结果为false
Integer a=127;
Integer b=127;
System.out.println(a==b);//打印结果为true
当数值在byte范围内时,对于新特性,不会开辟新的空间