三大特殊类
- String类
- Object类
- 包装类
String类:
final class String
被final修饰的类不能被继承(为保证所有用户用到的String类都一样,只能使用,不能修改)
1.实例化方式
- 直接赋值
String str = "hello world";
- 通过构造方法赋值
String str = new String("hello world");
例子:
public class Test{
public static void main(String[] args) {
//直接赋值
Test test = new Test();
String str = "hello world";
//通过构造方法赋值
String str1 = new String("hello world");
System.out.println(str);
System.out.println(str1);
}
}
2.字符串的相等比较
“==”操作符用于比较两个变量的值是否相等,对于基本类型而言,比较的就是数值的大小;
对于引用类型而言,比较的实际上是保存的地址是否相等而不会比较内容。
所以在字符串内容比较时,需要使用String类提供的equals()方法。(equals对象,区分大小写)
str1.equals(str2);
equalsIngoreCase() //不区分大小写比较
举例:
public class Test{
public static void main(String[] args) {
//直接赋值
Test test = new Test();
String str = "hello world";
//通过构造方法产生对象
String str1 = new String("hello world");
System.out.println(str);
System.out.println(str1);
System.out.println(str.equals(str1));//比较的是内容,不是地址
System.out.println(str.equalsIgnoreCase(str1));
}
}
运行结果:
3.String类的匿名对象
——没有任何栈内存指向的对象(没有名字的对象),所有字符串常量(“ ”)都是String类的匿名对象。
在比较字符串是否等于特定字符串时,将字符串常量写在equals前,通过字符串常量来比较。
"hello world".equals(str);
举例:
public class Test{
public static void main(String[] args) {
String str = new String("hello world");
System.out.println(str.equals("hello world"));
System.out.println("hello world".equals(str));
}
}
运行结果:
4.两种实例化区别?
直接赋值与构造方法赋值
- 直接赋值:(推荐使用)
——在JVM内部会维护一个字符串常量池(对象数组)
若采用直接赋值的方法进行String类的实例化操作,那么该对象会自动保存到对象池之中。
若下一次继续使用直接赋值的方式实例化String类对象,先在对象池中寻找是否有指定内容对象,若有,直接引用.否则创建新空间,将新对象入池以供下次使用.
举例:
public class Test{
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = "hello";
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str1 == str3);
}
}
- 构造方法赋值:
当使用构造方法实例化字符串时,实际上会开辟两次空间,实例化后的对象并不会保存到对象池中,可以使用intern( )方法来手工入池。
举例:
public class Test{
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello").intern();
System.out.println(str1 == str2);
}
}
5.字符串常量不可变更:
——堆中常量的值无法修改,但是栈中的指向可以更改
(字符串不要改变太多次,慎用拼接操作"+")
可以用SB
String类操作方法:
一.转换
1.char < ---->String(字符和字符串之间的相互转换)
char[ ] —>String
1.public String (char[ ] value ):将字符数组全部转为字符串
2.public String(char[ ] value,int offset,int len):
将字符数组的部分内容转为字符串
2.String -->char
取得字符串指定索引的字符,从0开始
public char charAt(int index);
3.String -->char[ ]
public char[ ] toCharArray() : 将字符串转为字符数组
举例:
public static void main(String[] args) {
//判断一个字符串是否全部由数字组成
String str1 = "1234";
String str2 = "123a4";
}
public static boolean isNumber(String str){
//String -->char[]
char[] data = str.toCharArray();//将字符串转为字符数组
for(int i = 0;i < data.length;i++){
char c = data[i];
if(c < '0 '|| c > '9') {
return false;
}
}
return true;
}
二.字节与字符串
字节用在二进制流与网络传输中
1.byte <–>String
byte[ ] -->String
1.public String(byte[ ] value):将字节数组全部转为字符串
2.public String(byte[ ] value,int offset,int len):
将字节数组的部分内容转为字符串
2.String -->byte[ ]
1.public byte[] getBytes():将字符串转为字节数组
2.public byte[] getBytes(String charSet):
将字符串按照指定编码格式转为字节数组
举例:
public static void main(String[] args) {
String str1 = "helloworld";
byte[] date = str1.getBytes();
for (int i = 0;i < data.length;i++){
data[i] -= 32;
}
System.out.println(new String(data,0,4));
}
三.字符串比较方法
- 比较相等
1.equals
2.equalsIngoreCase - 比较大小
public int compareTo(String anotherString):比较两个字符串的大小关系
返回值:
负数:小于
0:相等
正数:大于
按照ASSCII码比较,只要发现不相等的内容算出差值直接返回,不会继续向下查找。
举例:
public static void main(String[] args) {
String str1 = "abc";
String str2 = "Abc";//"ABc"
String str3 = "abc";
System.out.println(str1.compareTo(str2));
System.out.println(str2.compareTo(str1));
System.out.println(str1.compareTo(str3));
}
四.字符串查找算法
contains
判断一个子字符串是否存在
public boolean contains(CharSequence s);
index0f : int
判断是否以指定字符串开头
public boolean startsWith(String prefix);
startsWith
从指定位置开始判断是否以指定字符串开头
public boolean startsWith(String prefix,int toffset);
endsWith
判断是否以指定字符串结尾
public boolean endsWith(String suffix);
五.字符串替换
- public String replaceAll(String regex,String replacement) :
将字符串中所有指定内容替换为新内容 - public String replaceFirst(String regex(表达式),String replacement) :替换首个内容
六.字符串拆分
- public String[] split(String regex):按照指定格式将字符串全部拆分
- public String[] split(String regex,int limit):
将字符串部分拆分,数组长度为限定limit长度
七.字符串截取
1.public String substring(int beginIndex):从指定索引开始截取到字符串结尾
- public String substring(int beginIndex,int endIndex):
从指定索引开始到指定结束位置
举例:
public static void main(String[] args) {
String str = "helloworld";
System.out.println(str.substring(5));
//[ )
System.out.println(str.substring(0,5));
}
运行结果:
八.其他方法
trim():去掉字符串的左右两边空格,中间保留
toUpperCase():将字符串转大写处理
toLowerCase():将字符串转小写处理
length():返回字符串长度
isEmpty():判断是否是空字符串,不包含null
举例:
public static void main(String[] args) {
String str = " hello world ";
System.out.println(str.trim());
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
System.out.println(firstUpperCase("hello"));
//如何将一个单词首字母大写?
}
public static String firstUpperCase(String str){
return str.substring(0,1).toUpperCase()+
str.substring(1);
}
其他操作方法:
1.去掉字符串中的左右空格,保留中间空格
public String trim()
2.字符串转大写
public String toUpperCase()
3.字符串转小写
public String toLowerCase()
4.取得字符串长度
public int Length()
5.判断是否为空字符串,但不是null,而是长度为0.
public boolean isEmpty()
StringBuffer
1.字符串拼接使用append()方法
public static void main(String[] args) {
//方便进行字符串修改(在一块堆内存中)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb);
}
2.String 和Stringbuffer类不能直接转换
I.如何将String和Stringbuffer互换:(String<–>Stringbuffer)
String–>Stringbuffer
-
a.通过StringBuffer的构造方法
public StringBuffer(String str) -
b.通过append(String str):StringBuffer
II.Stringbuffer–>String
调用StringBuffer的toString
public synchronized String toString();
III.独有方法:
字符串反转:reverse()
举例:
public static void main(String[] args) {
//方便进行字符串修改(在一块堆内存中)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb.reverse());
}
运行结果:
IV.删除指定位置字符串:delete(int start,int end)
public synchronized(同步) StringBuffer delete(int start,int end);
举例:
public static void main(String[] args) {
//方便进行字符串修改(在一块堆内存中)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb.delete(0,5));//左闭右开
}
运行结果:
IVV.在指定位置插入任意元素:insert(int offset,各种数据类型 )
public static void main(String[] args) {
//方便进行字符串修改(在一块堆内存中)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb.delete(0,5).insert(0,123));
}
运行结果:
- StringBuilder
详细请看String,StringBuffer与StringBulider 的区别。