常见API--String 类
字符串是一个特殊的对象,字符串一旦初始化就不可以被改变。
String 不能有子类 该类中的操作字符串的功能是不能被覆写的。
Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String 类的构造函数
空参数的构造函数:
String str = new String (); 等价于 String str = "";
String str = "abc";//str是一个类类型的变量 所以“abc”是一个对象
字符串最大的特点是:一旦被初始化就不可以被改变
编译结果:第一条语句:false 第二条语句:true
原因:String类覆写了object类中的equals方法
【面试题】
S1和s2的区别是什么?
S1在内存中有一个对象;s2在内存中有两个对象
字符串其实在内存中有个常量池,池子中是数组来存放一个个字符。
【试题1】
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
【试题2】
下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");//只创建了一个对象
String类是用于描述字符串事物的。该类提供了一系列方法对字符串进行操作。
常见操作字符串的方法
(一)获取
►字符串中包含的字符数,也就是字符串的长度。
int length() //获取字符串的长度
注意:数组的长度用的是属性length,字符串的长度用的是方法length();
►根据位置获取位置上的某个字符
char charAt(int index)
►根据字符获取该字符在字符串中的位置
int indexOf(int ch)//
返回的是ch在字符串中第一次出现的位置,接受的是ASCII码
int indexOf(int ch,int fromindex)//
从fromindex位置开始,获取ch在字符串中出现的位置
获取字符串的位置
int indexOf(String str)//
返回的是str在字符串中第一次出现的位置
int indexOf(String str,int fromindex)//
从fromindex位置开始,获取str在字符串中出现的位置
反向索引
int lastIndexOf(int ch);
(二)判断
►字符串中是否包含某一个子串 boolean contains(str)
特殊之处:indexOf(str)可以索引str第一次出现的位置,如果返回-1表示该str不在字符串中存在,所以也可以用于对指定字符串的判断是否包含。
而且该方法既可以判断又可以获取出现的位置。
►字符串中是否有内容 boolean isEmpty(str)//原理就是判断长度是否为零
►字符串是否是以指定内容开头 boolean startsWith(str)
►字符串是否是以指定内容结尾 boolean endsWith(str)
►判断字符串的内容是否相同 boolean equals(str)//覆写了object类中的equals方法
►判断内容是否相同并忽略大小写 boolean equalsIgnoreCase()
方法的应用:
(三)转换
►将字符数组转成字符串
构造函数:String(char[] buf)在字符串初始化的时候就能完成字符数组转成字符串
String(char[] buf ,offset,count):将数组中的一部分转成字符串
静态方法:
Static copyValueOf(char[] buf)
Static valueOf(char[] buf);
►将字符串转成字符数组
Char[] toCharArray(str):
►将字节数组转成字符串
String(byte[] buf)
String(byte[] buf ,offset,count):将数组中的一部分转成字符串
►将字符串转成字节数组
Byte[] getBytes()
字符串和字节数组转换过程中是可以指定编码表的
►将基本数据类型转成字符串
Static valueOf()
(四)替换
►替换字符串中某个字符String replace(oldchar,newchar);
►替换字符串 String replace(str,str1)
(五)切割
►切割字符String[] split(regx);
►获取子串:String subString(begin)
String subString(begin,end)
(六)转换 去掉空格 比较
►将字符串转成大写或者小写
String toUpperCase();
String toLowerCase();
►将字符串两端的空格去掉
String trim();
►字符串比较
int compareTo(str);
返回:
如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
compareTo
public int compareTo(String anotherString)
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0。
返回:
如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
总结:
练习一:模拟一个trim方法,去除字符串两端的空格
思路:判断字符串第一个位置是否为空,依次判断直到不为空为止。结尾处判断也是一样。
【代码体现】
练习二:
将一个字符串进行反转
练习三:
获取一个字符串在另一个字符串中出现的次数
StringBuffer 是字符串缓冲区
特点:
1,是一个容器,长度可变。
2,可以直接操作多个数据类型。
3,最终通过toString方法变成字符串
//与数组的区别
一、存储
► 添加 StringBuffer append() :将指定的数据作为参数添加到已有数据结尾处。
► 插入 StringBuffer insert(offset,数据) 可以将数据插入到指定index位置
二、删除
► 删除 StringBuffer delete(start,end) :删除缓冲区中的数据 包含头不包含尾
► 删除 StringBuffer deleteCharAt(index):删除指定位置的字符
三、获取
► String subString(start,end);
四、修改
► void setCharAt(int index,char ch)
► StringBuffer replace(start,end,string)
五、反转
►StringBuffer reverse()
六、将缓冲区中的指定数据存储到指定数组中
Void getChars(int srcstart,int srcend,char[] dest,destBegin)
StringBuilder升级的三个因素:
1,提高效率
2,简化书写
3,提高安全性
StringBuilder 与StringBuffer
StringBuffer是线程同步的,StringBuilder 是线程不同步的。
【面试题】
String和StringBuffer的区别
String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。
基本数据类型包装类
int | Integer |
char | Character |
long | Long |
float | Float |
byte | Byte |
short | Short |
boolean | Boolean |
基本数据类型包装类的作用:
► 基本数据类型和字符串之间的转换:
1,基本数据类型+" "
2,基本数据类型. toString( 基本数据类型值)
Integer.toString(34);
► 字符串转成基本数据类型
parseInt(str);
Integer i = new Integer("123");
int x = i.intValue();
十进制转其他进制
toBinaryString();
toOctalString();
toHexString();
parseInt(" ", radix); 将指定字符串按指定进制转化
JDK5.0以后新特性
Integer x = 4;//Integer x = new Integer(4);自动装箱
X = x+2; //自动拆箱 自动转化成int类型进行运算
拆箱原理:x.intValue();
字符串总结:
new String()和new String("")都是申明一个新的空字符串,是空串不
是null;
String s0="kvill"; String s1="kvill"; String s2="kv" + "ill";
System.out.println( s0==s1 ); //true
System.out.println( s0==s2 ); //true
例子中的s0 和s1 中的"kvill"都是字符串常量,它们在编译期就被确
定了,放在常量池中,所以s0==s1 为true;而"kv"和"ill"也都是字符串常
量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串
常量,所以s2 也同样在编译期就被解析为一个字符串常量,所以s2 也是
常量池中"kvill"的一个引用。此时我们应该知道,常量池中只有一个字符串
"kvill"所以我们得出s0==s1==s2;用new String() 创建的字符串不是常量,
不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它
们有自己的地址空间。