黑马程序员--String类
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
String类
一、定义
String类:用于描述字符串事物的类。二、特点
1、字符串是一个特殊的对象;2、一旦初始化就不可以被改变,相同字符串不会被重复创建;
3、String类复写了Object中equals方法,用于比较字符串内容是否相同,不比较地址;
4、String s1 = "abc";(s1是一个类类型变量,"abc"是一个对象)和String s2 = new String("abc");区别:
s1在内存中有一个对象;s2在内存中有两个对象new、"abc"。
三、常见功能
一个对象的功能一般有四部分:增、读、改、删(C create R read U update D delete)。1、获取
1.1 int length():获取字符串的长度(个数)。
1.2 char charAt(int index):根据位置获取字符。
1.3根据字符获取该字符在字符串中的位置
int indexOf(int ch):返回指定字符在字符串中第一次出现的索引(位置)。
int indexOf(int ch,int fromIndex):从指定的索引处开始,获取指定字符在字符串中出现的索引。
int indexOf(String str):返回第一次出现的指定子字符串在此字符串中的索引。
int indexOf(String str,int fromIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。
int lastIndexOf(int ch):返回最后一次出现的指定字符在此字符串中的索引。
1.4获取字符串中一部分字符串(子串)。
String substring(int beginIndex):从指定位置开始到结尾,如果角标不存在,会出现字符串角标越界异常。
String substring(int beginIndex,int endIndex):含头不含尾。
//字符串中,返回-1代表被访问字符串中没有标的字符(串)。
class StringGet
{
public static void get()
{
String str = "abcdafg";
//获取长度(个数)
sop(str.length());
//根据索引获取字符。当访问到字符串中不存在的角标时会发生:StringIndexOutOfBoundsException。
sop(str.charAt(4));
//返回字符第一个出现索引(位置)。
sop(str.indexOf('d'));
//根据字符从指定索引开始,获取目标索引。
sop(str.indexOf('t',3));
//返回自字符串索引。
sop(str.indexOf("fg"));
//从指定索引开始,返回首次出现的字符串索引。
sop(str.indexOf("da",3));
//索引一个字符最后出现的索引。
sop(str.lastIndexOf('a'));
//获取字符串中的一部分字符串(子串)。
sop(str.substring(3));
sop(str.substring(3,5));
}
public static void main(String[] args)
{
get();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
运行结果:
2、判断
boolean contains(String str):字符中是否包含某一个字符串。
indexOf()用if(str.indexOf("aa")!=-1)语句,既可以判断,又可以获取出现的位置。
boolean isEmpty():字符中是否有内容。原理就是判断长度是否为0。
boolean startsWith(str):字符串是否以指定内容开头。
boolean endsWith(str):字符串是否以指定内容结尾。
boolean equals(str):判断字符串内容是否相同。
boolean equalsIgnoreCase():判断内容是否相同,并忽略大小写。
class StringJudge
{
public static void judge()
{
String str = "ArrayDemo.java";
//判断文件名称是否包含Demo。
sop(str.contains("Demo"));
//用indexOf()判断
sop(str.indexOf("rra")!=-1);
//是否为空字符
sop(str.isEmpty());
//判断文件名称是否以Array单词开头。
sop(str.startsWith("Array"));
//判断文件名称是否是.java的文件。
sop(str.endsWith(".java"));
String str1 = "ARRAYDEMO.JAVA";
//判读是否有相同内容
sop(str1.equals(str));
//忽略大小写
sop(str1.equalsIgnoreCase(str));
}
public static void main(String[] args)
{
judge();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
运行结果:
3、转换
3.1将字符数数组转成字符串
构造函数 String(char[]){}
String(char[],offset,count) 将字符数组中的一部分转成字符串。
静态方法
static String copyValueOf(char[] date):返回指定数组中表示该字符序列的字符串。
static String copyValueOf(char[] data,int offset,int count);
static String valueOf(char[] date):返回指定数组参数的字符串表示形式。
3.2将字符串转成字符数组
char[] toCharArray();
3.3将字节数组转成字符串
String(byte[]);
String(byte[],offset,count):将字节数组中的一部分转成字符串。
3.4将字符串转成字节数组
byte[] getBytes();
3.5将基本数据类型转成字符串(此处都是String的方法,首单词要小写)
static String valueOf(int)
static String valueOf(double)
3+""==String.valueOf(3)
特殊:字符串和字节数组在转换过程中是可以指定编码表的。
3.6将字符串转成大写或小写
String toUpperCase();
String toLowerCase();
3.7将字符串两端的多个空格去除
String trim();
//因为调用了String类,所以要导入对应包。
import java.lang.String.*;
class StringTransform
{
public static void transform()
{
char[] arr = {'a','b','c','d','e','f'};
//从角标1开始,获取三个字符。
String s = new String(arr,1,3);
sop("s="+s);
//返回指定数组中表示该字符序列的字符串
String str1 = String.copyValueOf(arr);
sop("str1="+str1);
//返回指定数组参数的字符串表示形式。
String str2 = String.valueOf(arr);
sop("str2="+str2);
String s1 = "afegvfee";
//字符串转字符数组
char[] chs = s1.toCharArray();
for(int x=0; x<chs.length;x++)
{
System.out.print(("ch="+chs[x]+" "));
}
System.out.println();
byte[] bt1 = {1,2,3};
//将字节数组转成字符串
String str3 = new String(bt1);
sop("str3="+str3);
//字符串转字节数组
byte[] bt2 = s1.getBytes();
for(int x=0; x<bt2.length;x++)
{
System.out.print(("by="+bt2[x]+" "));
}
System.out.println();
//将基本数据类型转成字符串
String str4 = String.valueOf(20);
sop("str4"+str4+(3+""==String.valueOf(3)));
String str5 = " Hello Java ";
sop(str5.toLowerCase());
sop(str5.toUpperCase());
sop(str5.trim());
}
public static void main(String[] args)
{
transform();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
运行结果:
4、其他功能
4.1替换
String replace(char oldCh,char newCh):建立一个新字符串。
String replace(String s1,String s2);
若未找到替换内容,则返回原字符串。
4.2切割
String[] split(regex);涉及都正则表达式(正则表达式就是字符串的使用的快捷方式)。
4.3对两个字符串进行自然顺序的比较
int compareTo(string):按字典顺序比较两个字符串。
class StringOthers
{
//注意命名要防止和方法重名
public static void method_replace()
{
String s = "hello java";
//建立一个新字符串,旧字符串一旦建立不能被改变。
String s1 = s.replace('a','n');
//如果要替换的字符不存在,返回原串。
String s2 = s.replace('q','n');
//替换部分字符串。
String s3 = s.replace("java","world");
sop("s="+s);
sop("s1="+s1);
sop("s2="+s2);
sop("s3="+s3);
}
public static void method_split()
{
String s = "zhangsan,lisi,wangwu";
//依据","进行切割
String[] arr = s.split(",");
for(int x=0;x<arr.length;x++)
{
System.out.print((arr[x]+" "));
}
//换行
System.out.println();
}
public static void method_compare()
{
String s1 = "bcz";
String s2 = "bcd";
//按字典顺序比较两个字符串。
//若字符串相同,返回0;若s1>s2,返回正数;s1<s2,返回负数;
sop(s1.compareTo(s2));
}
public static void main(String[] args)
{
method_replace();
method_split();
method_compare();
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
运行结果:
StringBuffer
一、定义
StringBuffer:是字符串缓冲区,用于存储数据的容器。二、特点
1、长度可变化;2、可以存储不同类型数据;
3、最终要转成字符串才能使用。
三、优点
StringBuffer可对字符串修改;string类一旦建立无法修改。PS:
StringBuffer的字符串缓冲区初始容量为16个字符,其实质还是数组。
四、常见功能
1、添加:StringBuffer append(date):将指定数据作为参数添加到已有数据结尾处。
StringBuffer insert(index,date):可以将数据插入到指定index位置。
2、删除
StringBuffer delete(int start,int end):删除缓冲区中的数据,含头不含尾。
StringBuffer deleteCharAt(int index):删除指定位置的字符。
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、其他方法
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):将缓冲区中指定数据存储到指定字符数组中。
src:源 dst:目的
void setLength(int newLength):设置字符序列的长度
class StringBufferDemo
{
public static void method_add()
{
StringBuffer sb = new StringBuffer();
//sb添加后并使sb1指向的是同一个对象,故sb==sb1。
StringBuffer sb1 = sb.append(34);
sop("sb==sb1:"+(sb==sb1));
//方法调用链,返回字符串链。
sb.append("ass").append(true).append(34);
sop("sb="+sb);
//将数据插入到指定7上。
sb.insert(7,"qq");
sop(sb.toString());
}
public static void method_del()
{
StringBuffer sb = new StringBuffer("abcdf");
sb.delete(1,3);
//清空缓冲区
//sb.delete(0,sb.length());
//删除一个字符的用法。跟sb.delete(1,2);效果相同。sb.delete(1,1);无效。
//sb.deleteCharAt(2);
sop(sb.toString());
}
public static void method_update()
{
StringBuffer sb = new StringBuffer("abcdf");
//sb.replace(1,3);
sb.setCharAt(2,'K');//void
sop(sb.toString());
}
public static void main(String[] args)
{
method_add();
method_del();
method_update();
}
public static void sop(String str)
{
System.out.println(str);
}
}
运行结果:
PS:
1、使用setLength设置StringBuffer中字符序列的长度。
如果小于已有字符序列的长度,多余部分将被清除;如果大于,多余部分用空字符填充。
2、当创建的StringBuffer内容长度大于16,将会创建一个较长的新数组。
也可以通过StringBuffer(int capacity);构造函数自己设置StringBuffer缓冲区长度。
五、StringBuilder
StringBuilder是JDK1.5版本后StringBuffer的替代品。StringBuilder用法和StringBuffer完全一样。区别:
StringBuffer是线程同步的,通常用于多线程。在添加时,不能做其他操作。但单线程时效率低。
StringBuilder是线程不同步。开发中建议使用StringBuilder。因为不用同步,效率高,但是多线程时不安全。
PS:
一、升级三个要素:提高安全性、提高效率、简化书写;
二、基本数据类型对象包装类:把基本数据类型封装成对象,便于操作。
2、常见操作:基本数据类型和字符串类型之间的转换。
2.1将基本数据类型转成字符串。
a.基本数据类型+"";
b.基本数据类型.toString(基本数据类型值);
例:Integer.toString(34); //将34整数转换成"34"。
2.2将字符串转成基本数据类型
a.静态转换方法:xxx a = Xxx.parseXxx(String);
例:int a = Integer.parseInt("a123");//NumberFormatException。必须传入数字格式的字符串
b.非静态:
Integer i = new Integer("123");
int num = i.intaValue();
3、常见方法
3.1十进制转成其他进制:
toBinaryString();
toHexString();
toOctalString();
3.2其他进制转成十进制:
parseInt(string,radix);radix:要转的进制数,string:标的字符串。
例:int x = Integer.parseInt("3c",16);///~60
class IntegerDemo
{
public static void sop(String str)
{
System.out.println(str);
}
public static void main(String[] args)
{
//基本数据类型转字符串
String s = 10 + "";
sop(s);
sop(Integer.toString(34));
//将一个字符串转成整数(静态方法)。
//int num = Integer.parseInt("a23");//NumberFormatException。必须传入数字格式的字符串
double b = Double.parseDouble("12.23");
sop("double="+b);
//非静态方法
Integer i = new Integer("123");
sop("i="+i);
//常用方法:
//整数类型的最大值
sop("int max :"+Integer.MAX_VALUE);
//十进制转二进制:
sop(Integer.toBinaryString(-6));
//十进制转十六进制
sop(Integer.toHexString(60));
//其他进制转成十进制:
int x = Integer.parseInt("3c",16);//括号里是(原数据,要转变的原数据进制);
sop("x="+x);
}
}
运行结果:
三、JDK1.5版本后的2个新特性:
1、Integer x = 4;//自动装箱
2、当数值在byte范围内时,如果该数值已经存在,则不会再开辟新的空间。