1. String类
1.1 String的两种实例化方式
a.直接赋值(推荐)
String str = "hello";//str是一个对象,hello保存在堆内存里
b. 通过构造方式实例化String对象
1.2 字符串相等比较
str.equals(str1);
public Boolean equals(String str1)
1.3 字符串常量是String类的匿名对象
小tips:在进行指定内容比较时,将指定内容(字符串常量)写前面,避免NullPointerException
在JVM底层自动维护一个字符串对象池(对象数组)。如果采用直接赋值的模式进行String类的对象实例化操作,此对象将自动保存到对象池中,如果下次继续采用直接赋值的模式声明String对象,先去对象池中找是否有指定内容,如果有,直接引用;如果没有,开辟新的空间而后将其保存到对象池中,以供下次使用。
采用共享设计模式
字符串手工入池操作:
public native String intern();
eg:
String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2); // true
1.4 字符串常量不可变更
字符串一旦定义不可改变
String str = "hello" ;
str = str + " world" ;
str += "!!!" ;
System.out.println(str); // hello world!!!
以上字符串的变更是字符串对象的变更而非字符串常量。
**1.5字符与字符串**
String <-> char
I.字符数组char[ ] ->String : String类构造方法
public String(char[ ] value1);
public String(char[ ] value,int offset,int count);
II.将字符串按照索引转为单个字符
String -> char
public char charAt(int index):取得指定索引的字符返回
III.将字符串转为字符数组
String -> char[ ]
public char[ ] toCharArray( );
eg:
String str = "helloworld" ; // 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {
data[i] -= 32 ; System.out.print(data[i]+"、");
} // 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换
6.字节与字符串
6.1 byte[ ] ->String
String类构造方法
public String(byte[ ] bytes)
String -> byte[ ]
*************************public byte[ ] getBytes( )***************************
public byte[ ] getBytes(String charset) : 按照指定编码转为字节数组
乱码产生:1.编解不同2.未写全
7.字符串比较
7.1 不区分大小写的相等比较
public boolean equalsIgnoreCase(String anotherString)
7.2比较两个字符串的关系
public int compareTo(String anotherString)
>0:表示本字符串大于目标字符串
=0:表示两者相等
<0:表示本字符串小于目标字符串
public class Test3{
public static void main(String[] args){
String str1 = "abc";
String str2 = "Abc";
System.out.println(str1.compareTo(str2));
}
}
8.字符串查找
从一个完整的字符串之中判断指定内容是否存在
8.1判断指定字符串是否存在
public boolean contains(String str);
public class Test3{
public static void main(String[] args){
String str = "hello world";
String str1 = "hello";
System.out.println(str.contains(str1));
}
}
8.2 判断是否以指定字符串开头
public boolean startswith(String prefix)
public boolean startswith(String prefix,int offset)
8.3 判断是否以字符串结尾
public boolean endswith(String suffix)
9.字符串替换
public String replaceAll(String regex,String reloacement):
将目标字符串全部替换
str.replaceAll("1"."_") : 将str中的所有1换成_
10.字符串拆分(***********)
public String[ ] split(String regex) : 将字符串全部拆分
public String[ ] split(String regex,int limit) :
将字符串拆分成数组长度为limit的子字符串数组
当特殊字符需要转义后拆分
eg:\\.
11.字符串的截取(************)
public String substring(int begainIndex):从指定索引截取到结尾
public String substring(int begainIndex,int endIndex):从指定的索引截取部分的内容
12. 字符串的其他操作方法
a.去除字符串的左右空格,保留中间空格
public String trim();
b.字符串转大小写(全部大小写)
public String toUpperCase( );
public String toLowerCase( );
- 判断字符串是否为空字符串(“”,不判断null)
public boolean isEmpty( );
13. 两只sb(StringBuffer、StringBuilder)-面试
1. 字符串拼接方法
public synchronized StringBuffer append(各种数据类型);
- StringBuffer与String的相互转换
String->StringBuffer:
- append( )
- 调用StringBuffer构造方法new StringBuffer("");
StringBuffer -> String
调用StringBuffer.toString();
- StringBuffer常用操作方法
3.1字符串的反转
reverse( ) : StringBuffer
3.2删除(修改)指定范围的数据
delete(int start,int end) : StringBuffer
insert(int offset,各种数据类型) :StringBuffer
请解释String、StringBuffer与StringBuilder的区别
- String内容不可改变、两只sb内容可改变
- StringBuffer (JDK1.0),采用同步处理,线程安全。效率较低;
StringBuilder(JDK1.5),采用异步处理。线程不安全,效率较高,当在String对象进行“+”,编译时会将String类变为StringBuilder进行append()处理
- Object类(RealFather)-最高参数统一化
Object类是JDK默认提供的一个类。Java中除了Object类,所有类都存在继承关系,默认会继承Object父亲
4.1 toString( )-取得对象信息
系统输出默认调用对象的toString()方法
Object类toString()只是简单输出当前所引用的类名称以及对象地址
如果想在类中取得本类属性信息。需要覆写toString( );
4.2 equlas( )-对象比较
class person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age ;
}
public boolean equals(Object obj){
//1.首先判断obj是否是Person类对象
if(!(obj instanceof Person)){
return false;
}
//2.判断当前对象是否和传入对象地址相同
if(this == obj){
return true;
}
//3.obj确实是person对象,比较两者属性内容
//向下转型取得person属性值
Person per = (Person) obj;
return (this.name.equals(per.name)) && (this.age == per.age);
}
4.3 接收引用数据类型
Object可以接收所有引用数据类型:数组、类、接口
- 包装类-使用Object接收一切东西
包装类就是将基本数据类型封装到类中
-
- 包装类的分类
a.数值型包装类(Number的直接子类):Byte、Double、Short、Long、Float、Integer(int)
会发生类型转换异常,NumberFormatException
b.对象型包装类(Object的直接子类):Boolean、Character(char)
5.2装箱与拆箱
装箱:将基本数据类型变为包装类对象。利用每个包装类提供的构造方法实现
拆箱:将包装类中包装的基本数据类型取出,利用xxValue( );
Integer i = new Integer(19);
int result = i.intValue();
对于Integer var = ? 在[-128至127]的赋值,Integer对象是在常量池产生,会复用已有对象,这个区间外的所有数据,都在堆上产生,不会复用已有对象。
Integer i1 = 10;
Integer i2 = 10;
i1 == i2; //true
Integer i3 = 200;
Integer i4 = 200;
i3 == i4; //false
阿里编码规范:use int or Integer?
I.[强制]所有POJO类(简单Java类,类中只有成员变量、构造方法、getter/setter)属性必须使用包装类
II.[强制]RPC方法返回值和参数必须使用包装类
III.[推荐]所有的局部变量使用基本类型
5.3包装类与字符串的转换
5.3.1 String->基本数据类型
包装类.parseXX(str);
String -> int : Interger.parseInt(str);
String str = "23";
int result = Integer.parents(str);
……
System.out.print(str+10);
结果为33
5.3.2 基本数据类型 -> String
a. ""+基本数据类型
b. String类提供的静态方法valueOf(基本类型)---推荐,不产生垃圾空间。