String概述
字符串是一个特殊的对象
字符串一旦被初始化就不可以被改变
String s1 = “abc”;//s1是一个类类型变量
String s2 = new String(“abc”);
s1和s2有什么区别:
第一句执行在内存中产生一个对象。
第二句执行在内存中产生两个对象。new产生了一个对象,字符串"abc"是一个对象。
System.out.println(s1==s2); //输出 false
System.out.println(s1.equals(s2)); //输出true
String类复写了Object类中的equals方法,该方法用于判断字符串中的内容是否相同。
String常见功能
String类用于描述字符串事物。
那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
1,获取
String str = "eabcdeabkpf"
1.1 获取字符串中包含的字符数,也就是字符串的长度。
int length():
示例:sop(str.length()); //打印结果:11 注意:String中的获取长度是方法,而数组中的获取长度是属性:arr.length
1.2 根据位置获取位置上某个字符。
char charAt(int index):
示例:sop(str.charAt(4)); //打印结果:d
当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException(字符串角标越界异常)。
示例:sop(str.charAt(20)); //显示结果是StringIndexOutOfBoundsException
1.3.1 根据字符获取该字符在字符串中位置。
如果没有找到返回-1
int indexOf(int ch):返回的是ch(该字符)在字符串中第一次出现的位置。
示例:sop(str.indexOf('a'));//打印结果:1
int indexOf(int ch, int fromIndex):
从fromIndex指定位置开始索引,获取ch(该字符)在字符串中出现的位置。
示例:sop(str.indexOf('a',3));//打印结果:6
示例:sop(str.indexOf('m',3));//打印结果:-1
1.3.2
根据字符串获取该字符串在字符串中位置。
如果没有找到返回-1
int indexOf(String str):返回的是str(该字符串)在字符串中第一次出现的位置。
示例:sop(str.indexOf("ea"));//打印结果:0
int indexOf(String str, int fromIndex):从fromIndex指定位置开始索引,获取str(该字符串)在字符串中出现的位置。
示例:sop(str.indexOf("ab",0)); 1
sop(str.indexOf("ab",1)); 1
sop(str.indexOf("ab",3)); 6
lastIndexOf反向搜索
int lastIndexOf(int ch) :返回指定字符在此字符串中最后一次出现处的索引。
int lastIndexOf(int ch, int fromIndex):返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
2,判断
2.1 字符串中是否包含某一个子串。
boolean contains(str):当且仅当此字符串包含指定的子串时,返回 true。
特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在。
所以,也可以用于对指定字符串判断是否包含。
比如: if(str.indexOf("aa")!=-1)
而且该方法即可以判断,又可以获取该子串出现的位置。
2.2 字符中是否有内容。
boolean isEmpty(): 当且仅当 length() 为 0 时返回 true。
原理就是判断长度是否为0.
2.3 字符串是否是以指定内容开头。
boolean startsWith(str);
2.4 字符串是否是以指定内容结尾。
boolean endsWith(str);
2.5 判断字符串内容是否相同。复写了Object类中的equals方法。不忽略大小写。
boolean equals(str);
2.6 判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();将此 String 与另一个 String 比较,不考虑大小写
示例:
String str = "ArrayDemo.java";
//判断文件名称是否是Array单词开头。
sop(str.startsWith("Array"));
//判断文件名称是否是.java的文件。
sop(str.endsWith(".java"));
//判断文件中是否包含Demo
sop(str.contains("Demo"));
3,转换。
3.1 将字符串转成字符数组。**
char[] toCharArray():
将字符串转成字节数组。
byte[] getBytes():
3.2 将字符数组转成字符串。
构造方法:new String(char[]):将字符数组中的全部转成字符串。
示例:char[] arr = {'a','b','c','d','e','f'};
String s= new String(arr);
sop("s="+s);//打印结果:s=abcdef
new
String(char[],offset(起始位置),count(代表个数)):
将字符数组中的一部分转成字符串。
示例:char[] arr = {'a','b','c','d','e','f'};
String s= new String(arr,1,4);
sop("s="+s);//打印结果:s=bcde
静态方法:
static String copyValueOf(char[] date);返回指定数组中表示该字符序列的 String。
static String copyValueOf(char[] data, int offset, int count);返回指定数组中表示该字符序列String。
static String valueOf(char[] date):返回 char 数组参数的字符串表示形式。
将字节数组转成字符串。
new String(byte[]):将字节数组中的全部转成字符串。
new String(byte[],offset,count):将字节数组中的一部分转成字符串。
将基本数据类型转成字符串。
static String valueOf(int)
static String valueOf(double)
//3+"";和String.valueOf(3); 的运算结果一样,
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4,替换
String replace(oldchar,newchar);
示例:
替换字符
String s = "hello java";
String s1 = s.replace('a','n');
sop("s="+s); //打印结果:hello java,字符串初始化后不会被改变
sop("s1="+s1);//打印结果:hello jnvn
String s1 = s.replace('q','n'); //打印结果:hello java,如果要替换的字符不存在,返回的还是原串。
替换字符串
String s1 = s.replace("java","world");
sop("s="+s); //打印结果:hello java
sop("s1="+s1);//打印结果:hello world
5,切割
String[] split(regex);
示例:
String s = "zhangsan,lisi,wangwu";
String[] arr = s.split(",");
for(int x = 0; x<arr.length; x++)
{
sop(arr[x]); /*
打印结果:
zhangsan
lisi
wangwu
*/
}
6,获取子串(获取字符串中的一部分)
String substring(begin index);从指定位置开始到结尾。如果角标不存在,会发生字符串角标越界异常。
也可以这样表示:s.sbustring(0,s.length())
String substring(begin index,end index);//包含头不包含尾。
示例:
String s ="abcdef"
sop(s.substring(2));//打印结果:cdef
sop(s.substring(2,4));//打印结果:cd
7,转换,去除空格,比较
7.1 将字符串转成大写或者小写。
String toUpperCase();
String toLowerCase();
7.2 将字符串两端的多个空格去除。
String trim();
7.3 对两个字符串进行自然顺序的比较。
int compareTo(string);
示例:
String s = " Hello Java ";
sop(s.toLowerCase());//打印结果:" hello java "
sop(s.toUpperCase());//打印结果:" HELLO JAVA "
sop(s.trim());//打印结果:"Hello Java"
String s1 = "a1c";
String s2 = "aaa";
sop(s1.compareTo(s2));//打印结果:-48
StringBuffer
StringBuffer是一个
长度
可变的容器,StringBuffer中的很多方法与String相同,
字符串的组成原理就是通过该类实现的。
StringBuffer中封装了很多方法可以对字符串进行增删改查。
StringBuffer的特点:
1 长度可变
2 可以直接操作多种数据类型
3 对数据操作后会通过toString方法变成字符串。
1 存储
StringBuffer append(): 将指定数据作为参数添加到已有数据的结尾处。
示例:
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = sb.append(33);
sop(sb==sb1);
//输出true:append()方法返回的还是StringBuffer容器
,sb和sb1都指向了同一个对象,这就是缓冲区的特点。
sb.append("abc").append(true).append(34);
//输出 "abctrue34" 方法调用链:当一个方法被调用之后返回的还是本类对象,再调用本类方法,叫做方法调用链。
StringBuffer insert(index,数据):将数据插入到指定index位置。
2 删除
StringBuffer delete(start,end): 删除缓冲区中的数据,包含start,不包含end.
StringBuffer deleteCharAt(index):删除指定位置的字符。
示例:
StringBuffer sb = new StringBuffer("abcde");
sb.delete(1,3); //输出ade
sb.deleteCharAt(2); //输出abde 其实原理就是sb.delete(2,3);
sb.delete(0,sb.length()); //清空缓冲区
sop(sb.toString());
3 获取
char charAt(int index): 根据角标获取字符
int indexOf(String str): 根据字符串获取位置
int lastIndexOf(String str): 根据字符串获取最后一次出现的位置
String subString(int start, int end): 获取子串
4 修改
StringBuffer replace(start ,end, String): 将指定位置的字符串按照指定的String进行修改,包含start,不包含end.
void setCharAt(int index ,char ch ): 将指定位置的字符替换成ch
示例:
StringBuffer sb = new StringBuffer("abcde");
sb.replace(1,4,"java"); //输出ajavae
sb.setCharAt(2,'k'); //输出abkde
5 反转
StringBuffer reverse():
6 将缓冲区中指定数据存储到指定字符数组中
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):
示例:
StringBuffer sb = new StringBuffer("abcdef");
char[] chs = new char[6];
sb.getChars(1,4,chs,1);
for(int x = 0;x<chs.length;x++)
{
sop("chs["+x+"]="+chs[x]+";");
}
StringBuilder
JDK1.5版本之后出现了StringBuilder,StringBuilder是StringBuffer的简易替换。
StringBuffer 是线程同步的
StringBuilder 是线程不同步的
基本数据类型对象包装类
基本数据类型 对象包装类
byte Byte
short Short
long Long
boolean Boolean
float Float
double Double
char Character
int Integer
基本数据类型对象包装类应用
基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换。
基本数据类型转成字符串:
基本数据类型 + " "
基本数据类型.toString(34); //将34整数转成“34”
字符串转成基本数据类型:
xxx a = Xxx.parseXxx(String);
示例:
int a = Integer.parseInt("123");
//必须传入对应格式的字符串,如果传入"a123"会发生NumberFormatException(
数字格式异常)
double d = Double.parseDouble("12.34");
boolean b = Boolean.parseBoolean("true");
非静态方法:intValue();
Integer i = new Integer("123"); //先将字符串封装成对象,再通过intValue()方法转换成int类型
int num = i.intValue();
十进制转成其他进制
toBinaryString();
toHexString();
toOctalString();
其他进制转成十进制
parseInt(String s, int redix);
示例:
int x =
Integer.parseInt("3c",16);//将字符串"3c"转成10进制是60
System.out.println(x); //输出60
基本数据类型对象包装类新特性
Integer x = new Integer("123");
Integer y = new Integer(123);
sop(x==y); // ==符号对于引用数据类型比较的是地址值,x和y指向了不同的对象,输出false.
sop(x.equals(y)); //Integer类复写了Object类的equals方法,形成了自己特有的方法,Integer类的equals方法比较的是数值是否相同,输出true.
JDK1.5版本以后出现的新特性
自动装箱与自动拆箱
Integer x = new Integer(4);
Integer x = 4; //自动装箱操作,new Integer(4);
x = x
/* x.intValue() */
+ 2 ; //x进行了自动拆箱,变成int类型,和2进行加法运算,再将和进行装箱赋给x.
Integer m = 128;
Integer n = 128;
sop(n==m); //输出false
Integer a = 127;
Integer b = 127;
sop(a==b); //输出true 这里a和b指向了同一个Integer对象 ,当数值在byte范围内时,对于新特性,如果该数值已经存在,则不会开辟新的空间。