Object
是Java中的顶级父类---Java中所有的类都是这个类的子类。---任何一个类的对象都可以用Object对象接住。
Object是Java中唯一没有父类的类。
重要方法
clone()---克隆并产生一个新对象,新对象的地址和原来的对象不一样但是属性值一样。这个对象要想被克隆,所对应的类必须实现一个接口----Cloneable
Cloneable---Cloneable接口中没有任何的方法和属性,仅仅用于标识这个类产生的对象可以被克隆
equals(Object o)---判断两个对象(地址)是否相等---要求能够手写
==判断的是所对应的直接值
hashCode()---获取对象的哈希码---哈希码是一串32位的二进制数据---可以认为是唯一的。
问题:为什么要重写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”);
产生的对象数量
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)");
}
}