【JavaSE】三个特殊类:String、Object、包装类

概念部分

1 String类
	两种实例化方式:(区别)
		直接赋值法:只开辟一块堆内存,且该字符串对象可以自动保存在常量池中以供下次使用。
		传统方法:开辟两块堆内存,一块成垃圾空间,不会自动保存在常量池,可intern()手工入池。
	字符串比较:
		“==”比的是对象所保存的内存地址数值
		内容比较用str1.equals("str2")
		注意:开发中将特定字符串写在前面,用户输入的写在括号里,否则可能产生空指针异常
	String类设计使用了共享设计:(减小开销)
		在JVM底层自动维护一个常量池,直接赋值的String被保存其中,
		若下次继续使用直接赋值法,则去常量池中找,
		若有指定内容直接引用;若没有则开辟新的字符串对象保存在常量池中。
	采用构造方法(传统):
		String str = new String("hello");
		若使用如上构造方法就会开辟两块堆内存空间,new一块,hello自己一块,
		后者将成为垃圾空间,使字符串共享也产生问题。
	手动入池操作:
		String str = new String("hello").intern();
		intern()方法将new的空间入池。
	字符串:
		所有语言对于字符串的底层实现都是字符数组。
		字符串常量不可变,但字符串对象引用可以一直变,这样会产生大量垃圾空间。
	字符串常用方法:
		str.charAt(int index);	取得指定索引位置字符,从0开始。
		str.toCharArray();	将字符串变为字符数组返回。
		str.getBytes();	 将字符串以字节数组形式返回。
		str.equals();	区分大小写比较
		str.equalsIgnoreCase();	不区分大小写比较
		str.compareTo();  比较两个字符串大小,=0<-1>1。常用来区分大小写。
		str.contains();	判断子串是否存在
		str.indexOf();	指定位置查找子串或查到子串返回其
		str.startsWith();	判断是否以指定字符串开头
		str.endswith();		判断是否以指定字符串结尾
		str.replaceAll();	替换所有内容
		str.replaceFirst();	替换首个内容
		str.spilit();	字符串拆分,注意拆分符的转义
		str.substring();	字符串截取
		str.trim();		字符串去掉左右空格
		str.toUpperCase();	全部转大写
		str.toLowerCase();	全部转小写
		str.isEmpth();		字符串判空
	StringBuffer类:
		和String类都是“CharSequence”接口的子类,此接口描述一系列字符集。
		互相转换:
			String->SB:利用StringBuffer的构造方法或append()
			SB->String:调用toString()方法
		方法:
			sb.reverse();	字符串反转
			sb.delete();	字符串删除
			sb.insert();	字符串插入
	*面试题:String与StringBuffer、StringBuilder区别
		1.String内容不可改,两只SB可改;
		2.SBuffer采用同步处理,线程安全;SBuilder采用异步处理,不安全。
2 Object类
	Java中其他所有类默认继承Object类;所有类对象可用Object接收。
	若使用对象直接输出时,默认是一个地址编码,比如数组;
	若现在使用String类,该类对象直接输出就调用toString()方法。
	Object类的toString()核心在于取得对象信息。
	Object达到参数统一,一个类希望接收所有的数据类型可以实现。
3 包装类
	就是将基本数据类型封装到类中。
	使用:
		对象型(Object的直接子类):Boolean、Character(cahr)
		数值型(Number的直接子类):Byte Double Short Long Integer Float
		说明:
			Number类的定义:public abstract class Number implements java.io.Serializable
			在Number类中实际定义有六种重要方法
	装箱与拆箱:
		包装类与基本数据类型之间:
		装箱:将基本型变为包装类对象,利用每一个包装类提供的构造方法实现装箱处理。
		拆箱:将包装类中包装的基本数据类型取出,利用Number类中提供的六种方法。
		JDK1.5之后提供自动拆装箱处理,则可直接利用包装类对象操作。
		阿里规范:相同类型的包装类对象之间值比较全部用equals方法。
	类型互换:
		字符串->基本数据类型:
		int num = Integer.parseInt(str);
		基本数据类型->字符串:
			1.任何类型使用“+”连接空白字符
			2.使用String类的valueOf(),此方法不产生垃圾

实现对象比较:

class Person{
	private String name ;
	private int age ;
	public Person(String name, int age) {
		this.age = age ;
		this.name = name ;
	}
	@Override
	public String toString() {
		return "姓名:"+this.name+",年龄:"+this.age ;
	}
	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false ;
		}
		if(this == obj) {
			return true ;
		}
		// 不是Person类对象
		if (!(obj instanceof Person)) {
			return false ;
		}
		Person person = (Person) obj ; // 向下转型,比较属性值
		return this.name.equals(person.name) && this.age==person.age ;
	}
}
class Student{}
public class Test {
	public static void main(String[] args) {
		Person per1 = new Person("Hannah", 20) ;
		Person per2 = new Person("Sarah", 18) ;
		System.out.println(per1.equals(per2));
	}
}

你可能感兴趣的:(Java)