Object

是Java中的顶级父类---Java中所有的类都是这个类的子类。---任何一个类的对象都可以用Object对象接住。

Object是Java中唯一没有父类的类。

重要方法


clone()---克隆并产生一个新对象,新对象的地址和原来的对象不一样但是属性值一样。这个对象要想被克隆,所对应的类必须实现一个接口----Cloneable

Cloneable---Cloneable接口中没有任何的方法和属性,仅仅用于标识这个类产生的对象可以被克隆

equals(Object o)---判断两个对象(地址)是否相等---要求能够手写

==判断的是所对应的直接值


hashCode()---获取对象的哈希码---哈希码是一串32位的二进制数据---可以认为是唯一的。

java将地址值指向对象 java对象地址是唯一的吗_java将地址值指向对象

java将地址值指向对象 java对象地址是唯一的吗_pattern_02

问题:为什么要重写equals方法?


默认equals在比较两个对象时,是看他们是否指向同一个地址的。
但有时,我们希望两个对象只要是某些属性相同就认为他们的quals为true。比如:
Student s1 = new Student(1,"name1");
Student s2 = new Student(1,"name1");
如果不重写equals的话,他们是不相同的,所以我们要重些equals,判断只要他们的id和名字相同equals就为true,在一些集合里有时也这样用,集合里的contain也是用equals来比较

问题:

为什么重写equals方法要重写hashcode方法?

hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样。如果equals方法返回false,hashcode可以不一样,但是这样不利于哈希表的性能,一般我们也不要这样做。重写equals()方法就必须重写hashCode()方法的原因也就显而易见了。


fanilize()---通知垃圾回收器回收垃圾对象,但是垃圾回收器不一定执行。---System.gc();


getClass()---获取当前对象的实际类型

toString()---对象的字符串形式,往往会去重写

String


是一个额最终类---代表字符串的一个类,所有的字符串都是String的对象。

字符串是一个常量,定义好之后不可改变;字符串可以被共享。

String s = “a”; s += “b”; -> String s = “a”; -> s = new StringBuilder(“a”).append(“b”).toString(); -> s = new String(“ab”);

java将地址值指向对象 java对象地址是唯一的吗_字符串_03

产生的对象数量


String s = “abc”; --- 1

String s = new String(“abc”); --- 2

String s = “a”; s += “b”;  --- 5

String s = “a”; --- 1

s = new StringBuilder(“a”).append(“b”).toString(); --- 4

如果拼接多个字符串,建议使用StringBuilder;如果拼接少量字符串,可以使用+.

StringBuilder和StringBuffer 中的方法在使用上完全一致的。---StringBuilder本身是一个线程不安全的类,而StringBuffer是一个线程安全的类。

编码

编码:按照某种规则将字符映射成字节---记录这种规则的形式---编码表

ASCII--- 0-127---不完全的码表

ISO-8859-1---西欧码表--- 一个字符一个字节

gb2312--- 一个字符2个字节 --- 包含了常见的基本简体汉字以及部分的繁体汉字 --- gbk

Unicode编码体系--- utf-8---一个字符3个字节 --- 常见语言的常见字符

后续的所有码表默认兼容西欧码表---只要是英文,永远是一个字符对应一个字节

练习题:输入一个字符串和一个数字,这个输入的数字表示字节个数,然后根据指定的字节个数来截取字符串(不能出现半个字符)例如:学习study->9个字节

学习study->3个字节->学

学习study->1个字节->学

学习study->6个字节->学习st

import java.util.Scanner;
public class StringExer6 {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		String str = s.nextLine();
		int number = s.nextInt();
		s.close();
		// 将字符串转化为字节数组
		byte[] bs = str.getBytes();
		// 按照指定的字节个数截取
		String substring = new String(bs, 0, number);
		// 需要判断对应位置上的字符是否一致
		if (substring.charAt(substring.length() - 1) != str.charAt(substring.length() - 1)) {
			substring = new String(bs, 0, number - 1);
		}
		System.out.println(substring);
	}
}

重要方法

charAt(int index)---表示获取这个字符串指定下标位置上的字符

length()---获取字符串的长度

toCharArray()---将字符串转化为字符数组

compareTo(String another)---判断两个字符串的大小---根据返回值的正负来确定大小

concat(String str)---将参数字符串拼接到对象字符串的末尾---不改变原串

注意:在String中提供了一系列操作而不改变原串的方法

contains(String str)---判断是否包含指定的子串

equals(Object o)---判断两个字符串是否一致---判断的是实际值

getBytes()---将字符串转化为字节数组---如果不指定编码,会按照默认的系统平台码转化


String---代表字符串的类,最终类

StringBuilder---reverse---反转字符串

Pattern

本质上使用与指定匹配或者筛选规则的一系列表达式

 匹配邮箱 @ qq.com 163.com sina.cn sohu.com.cn

public class PatternExer {
	public static void main(String[] args) {
		String email = "langang@tarena.com.cn";
		System.out.println(checkEmail(email));
	}
	private static boolean checkEmail(String email) {
		return email == null ? false: email.matches(
"[a-zA-Z0-9]\\w{5,}@[0-9a-zA-Z]+(\\.com)|[a-zA-Z0-9]\\w{5,}@[0-9a-zA-Z]+(\\.com)?(\\.cn)");
	}
}