String 类
String类特点:是一个特殊的类,定义时被final修饰,所以它没有子类;
字符串一旦初始化,就不可以被改变;
① String s1 = "abc";
② String s2 =new String("abc");
两者有什么区别呢?
①中,s1是一个类类型,"abc"在内存中是一个对象,如果 s1="kk";其中"abc"没变,只是s1不指向"abc"而指向"kk";
②中,s2在内存中有两个对象,判断s1==s2吗?答案是false,==比较的是两个对象地址值,但是s1.equals(s2)是true,此时判断的是字符串中对象内容是否相同,因为String类复写了Object类中的equals方法。
String类常见的操作方法:
① 获取:
字符串中包含字符的个数,即字符串的长度: int length() :获取长度;
根据位置获取位置上的某个字符: char charAt(int index):如果访问不存在角标,会出现角标越界异常;
根据字符获取该字符在字符串中的位置: int indexOf(int ch): 返回的是ch在字符串中第一次出现的位置;
int indexOf(int ch,int fromIndex):从指定位置开始获取ch在字符串中出现的位置;
同理: int indexOf(String str); int indexOf(String str, fromIndex); int lastIndexOf(int ch):从后索引;
代码演示:
class StringDemo
{
public static void main(String[] args)
{
String s = "adfdklfjdfjk";
sop("s的长度:"+s.length());
char c = s.charAt(3);
sop("角标3上的字符是:"+c);
sop("d在字符串中第一次出现的位置:"+s.indexOf('d'));
sop("从2角标开始,第一次出现df的位置:"+s.indexOf("df",2));
sop(s.lastIndexOf('d'));//从后索引
}
public static void sop(Object o)
{
System.out.println(o);
}
}
②判断
字符串中是否包含某一字符串:
boolean contains(String str);
特殊之处:indexOf可以索引str第一次出现的位置,如果返回-1,则说明str不在字符串中,所以也可以用于判断是否包含一个字符子串;
判断字符串是否为空: boolean isEmpty(); 原理就是判断字符串长度是否为0;
注意:""和null的区别,""是空字符串,是对象,null是空;
字符串是否以指定内容开头或结尾:
boolean startsWith(str); boolean endsWith(str);
判断字符串内容提要是否相同,原理就是复写了object类中的equals方法;
boolean equals(str);
判断字符串内容提要是否相同,并忽略大小写:
boolean equalsIgnoreCase(str);
示例代码:
class StringDemo
{
public static void main(String[] args)
{
String s = "adpy.java";
String s1 = "ADPY.JaVA";
sop("s是否为空:"+s.isEmpty());
sop("是否包含dfdk:"+s.contains("dfdk"));
sop("是否以 ad 开头:"+s.startsWith("ad"));
sop("是否以.java结尾:"+s.endsWith(".java"));
sop(s.equalsIgnoreCase(s1));
}
public static void sop(Object o)
{
System.out.println(o);
}
}
③ 转换
将字符数组转换成字符串:
构造函数方法:String(char [ ]);
String ( char [ ] ,offset,count):将字符数组的一部分转成字符串;
静态方法:static String copyValueOf(char [ ]);
static String copyValueOf(char [ ],offset,count);
static String valueOf(char [ ]);
3+""和 String. valueOf(3)是一样的效果;
将字符串转成字符数组:
char[] toCharArray();
将字节数组转成字符串;
String(byte [ ]); String (byte [ ], offset, count );
将字符串转成字节数组:
byte[] getBytes();
将基本数据类型转成字符串: static String valueOf(int \double);
注意:字节数组和字符串转换过程中是可以指定字节编码表的;
代码演示:
class StringDemo
{
public static void main(String[] args)
{
char [] arr = {'a','b','c','d','e','f'};
String s = new String(arr,1,4);
sop("s="+s);
String s1="erqwerwewr";
char [] chr = s1.toCharArray();
for(int x =0;x<chr.length;x++)
{
sop(chr[x]);
}
}
public static void sop(Object o)
{
System.out.println(o);
}
}
④替换
String replace(old char,new char): 如果要替换的字符或字符串串不存在,则还打印原串;
⑤切割
String[ ] split(regex);按照某一规则切割;
⑥获取字符串中的子串:
String subString(begin,end);包含头不包含尾;
⑦转换,比较,去除两端空格
将字符串转换成大小写:
String toUpperCase():大写
String toLowerCase():小写
将字符串两端空格去除:
String trim();
对字符串进行自然顺序比较;
int compareTo(String); 返回的是正数大于,负数小于或0是相等;
代码演示:
class StringDemo
{
public static void main(String[] args)
{
String s=" HEllo,java ";
String s0= " adfdf ";
sop(s.replace("java","world"));
String[] arr = s.split(",");
for(int x =0;x<arr.length;x++)
{
sop(arr[x]);
}
sop(s.substring(2,7));
sop(s.toUpperCase());
sop(s.toLowerCase());
sop(s.trim());
sop(s.compareTo(s0));
}
public static void sop(Object o)
{
System.out.println(o);
}
}
StringBuffer:是字符串缓冲区,是一个容器,可以对字符串内容进行修改;
特点:长度可变,可以操作多个类型,可通过toString方法转成字符串;
常见操作:
①存储
StringBuffer append():将指定的数据作为参数添加到已有数据的尾处。
StringBuffer insert(index,String str):可以将数据插入到指定index位置。
②删除
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。
③获取
char charAt(int index)
int indexOf(String str)
int lastIndexOf(String str)
int length()
String substring(int start, int end)
④修改。
StringBuffer replace(int start, int end,String str)
void setCharAt(int index, char ch)
⑤反转
StringBuffer reverse();
⑥
void getChars(int srcBegin, int srcEnd, char[]dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst。
StringBuffer append():将指定的数据作为参数添加到已有数据的尾处。
StringBuffer insert(index,String str):可以将数据插入到指定index位置。
②删除
StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end。
StringBuffer deleteCharAt(index):删除指定位置的字符。
③获取
char charAt(int index)
int indexOf(String str)
int lastIndexOf(String str)
int length()
String substring(int start, int end)
④修改。
StringBuffer replace(int start, int end,String str)
void setCharAt(int index, char ch)
⑤反转
StringBuffer reverse();
⑥
void getChars(int srcBegin, int srcEnd, char[]dst, int dstBegin)
将字符从此序列复制到目标字符数组 dst。
代码演示:
class StringBufferDemo
{
public static void main(String[] args)
{
//method_update();
//method_del();
//method_add();
StringBuffer sb = new StringBuffer("abcde");
char[] chs = new char[6];
sb.getChars(1,4,chs,1);
for(int x =0;x<chs.length;x++)
{
sop("chs["+x+"]="+chs[x]+";");
}
}
public static void method_update()
{
StringBuffer sb = new StringBuffer("abcde");
sop(sb.toString());
//sb.replace(1,4,"java");
sb.setCharAt(2,'k');
sop(sb.toString());
}
public static void method_del()
{
StringBuffer sb = new StringBuffer("abcde");
sop(sb.toString());
//sb.delete(1,3);
//清空缓冲区
//sb.delete(0,sb.length());
sb.deleteCharAt(2);
sop(sb.toString());
}
public static void method_add()
{
StringBuffer sb = new StringBuffer();
//1.存储功能
sb.append("abc").append(true).append(34);//方法调用链。
sop(sb.toString());
sb.insert(1,"qq");
sop(sb.toString());
/*
StringBuffer sb1 = sb.append(14);
sop("sb==sb1"+(sb==sb1));//结果为true
sop(sb.toString());
sop(sb.toString());
*/
}
public static void sop(String str)
{
System.out.println(str);
}
}
JDK1.5出现了StringBuilder,它是StringBuffer简易代替方案;
两者不同之处:
①StringBuffer是线程同步的,用于对线程;
②StringBuilder 线程不同步,单线程使用效率高;多线程要自己加锁;
建议使用StringBuilder,效率高;
jdk升级的三个核心:提高效率,简化书写,提高安全性;
基本数据类型包装类:
int----Integer ; char --------Character; byte ----Byte; short-----Short;
常见操作:基本数据类型与字符串类型之间转换
①基本数据类型转换成字符串:
方法1:基本数据类型+"";如 23+""
方法2:String.valueOf(32);
方法3:Integer.toString(23);
②字符串转换成基本数据类型:
int a = Integer.parseInt(String);
③十进制转其他进制:
toBinaryString(); toHexString(); toOctalString();
④其他转十进制:静态方法 Integer.parseInt(String, radix) radix:2进制,8进制,16进制
非静态方法: Ingere i = new Integer("110");
int x = i.intValue();
JDK1.5出现的新特性:
① Integer a = new Integer(4) 可以写成 Integer a = 4;
这是因为自动装箱的缘故,此时,a是引用类型,4是一个对象,而不是整数,还可以进行运算,如:
a = a+4;,a+4,a进行自动拆箱,变成int类型和4运算,再将结果自动装箱赋给a;
② Integer m = 128;Integer n =128; 判断 m==n?? 结果是 false ;
而 Integer a = 127; Integer b =127; 判断 m==n 结果是 true ;
因为a和b指向同一个对象,当数值在byte范围内,对于新特性,如果该数值已存在,则不会再开辟新空间,所以a和b指向同一对象,m和n指向不同对象.