一、Object
Object是Java中的顶级父类,Java中所有的类都默认直接或者间接的继承Object。Object是Java中唯一没有父类的类,任何一个类的对象都可以用Object对象接住。
重要方法
1.Clone(); 克隆对象。
克隆完成之后会产生一个新的对象,这个新对象和原对象的地址不同但是属性值是一样的。
一个对象要想被克隆,那么这个对象对应的类必须实现Cloneable接口,Cloneable接口中没有任何的方法和属性,仅仅用于标识这个类产生的对象可以被克隆。
2.equals(Object o);!!!
判断两个对象是否一致。默认比较的是对象的地址,即使用的是==运算符,在开发中要求能够手动重写。Eclipse中右键Sourec中有自动生成。
书写步骤:
1.判断地址是否一样,即直接使用==运算符。
2.判断对象是否为空。
3.判断对象的创建类型是否一致。
4.判断属性值是否一致。判断之前要将对象强转为顶级父类。判断属性值的时候注意String类型的判断。
Public boolean equals(Object obj){
if (this == obj) //1.判断地址是否一致
return true;
if (obj == null) //2.判断参数是否为空
return false;
if (getClass() != obj.getClass()) //3.判断类型是否一致
return false;
Person other = (Person) obj; //4.强制转换类别
if (age != other.age) //5.判断属性是否一致
return false;
if (gender != other.gender)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
3.finalize(); 通知gc回收垃圾对象,但是垃圾回收器不一定执行。即使gc开始运行,也只回收当前对象而不回收其他对象。
4.GetClass();!!! 获取对象的实际类型(创建类型)。
5.hashCode();
返回对象的哈希码值的十进制。哈希码是一串32位的二进制数据,由于出现相同的数值的概率非常低,所以可以认为是唯一的。(不建议手动重写)
重写hashCode的时候,当equals值为true的时候,哈希码必须一致。但是哈希码一致equals不一定为true。
native关键字修饰的是本地方法,底层是用c语言写的。
6.toString();
对象的字符串形式,默认返回对象的地址。当打印对象的时候默认是调用了这个对象的toString方法。一般会重写。
二、String---final String Class
2.1特点:
1.String是一个最终类,代表字符串的一个类,所有的字符串都是String的对象。
2.字符串是一个常量;字符串可以被共享。
3.字符串存储在方法区。
4.注意不同的方式创建的对象的个数。有几个对象,就看内存中有几个存储的是地址。
String中“+”拼接字符创建对象的个数,和StringBuiler的append对比?
在拼接多个字符串的时候最好使用StringBuilder,如果拼接的字符串个数比较少,可以使用+进行拼接
2.2 String的构造方法。
1、String(); 创建一个字符串对象。
2、String(byte[] bs); 将字节数组按照系统默认编码转化为字符串。
3、String(byte[] bs, Charset ch); 将字符串按照指定的编码编译。
4、String(byte[] bs,int index,int size,Charset ch); 将字节数组按照指定的编码ch,从下标index开始,转化size个。
5、String(char[] ch); 将字符数组中的元素拼接成一个字符串。
6、String(char[] ch, int i, int k); 表示从字符数组的指定下标i开始将指定的个数k拼成字符串。
7、String(int[] codePoints,int offset,int count);
8、String(StringBuffer buffer); 分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。该字符串缓冲区的内容已被复制,后续对它的修改不会影响新创建的字符串。
9、String(StringBuilder builder); 分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。该字符串缓冲区的内容已被复制,后续对它的修改不会影响新创建的字符串。
2.3重要的方法
1、charAt(int index); 表示获取这个字符串指定下标index位置上的字符。
2、length(); 获取字符串的长度。
注意数组中的length是一个属性,字符串的length();是个方法。
3、compareTo(String str); 比较两个字符串的大小。根据返回值的正负来确定大小
底层过程:
按照升序规则比较两个字符串
1. 将两个字符串转化为两个字符数组。
2. 对象字符串对应的字符数组的对应位置的字符 -/减 参数字符串对应的数组对应位置的字符。
3. 如果差不为0,那么直接返回。 如果差为0,则下一位对应的字符继续相减。
4. 如果对应位置的字符全部减完,依然没有返回的话,那么就会返回对象字符串-参数字符串的长度之差。如果返回的是一 个正数,说明对象字符串要大一些,如果返回的是一个负数,说明参数字符串要大一些。
4、compareToIgnoreCase(String str); 不区分大小写比较两个字符串的大小。
5、contains(String str); 判断是否包含指定的子串
6、endsWith(String s); 判断字符串是否以指定字符结尾。经常用于筛选。
7、equals(Object o); String中已经对equals做了重写。判断两个字符串是否相等,判断的是实际值。
8、getBytes(); 将字符串转化为字节数组,如果不指定编码,会按照默认的系统平台码转化。
9、getBytes(Charset ch); 将字符串按照指定编码转化为字节数组。
编码:按照某种规则将字符映射成字节---记录这种规则的形式---编码表
ASCII--- 0-127---不完全的码表
ISO-8859-1---西欧码表--- 一个字符一个字节
gb2312--- 一个字符2个字节 --- 包含了常见的基本简体汉字以及部分的繁体汉字 --- gbk
Unicode编码体系--- utf-8---一个字符3个字节 --- 常见语言的常见字符
后续的所有码表默认兼容西欧码表---只要是英文,永远是一个字符对应一个字节
练习:截取字符串指定字节
输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取字符串
中文english国 5 -> 中文e 6 -> 中文en 2 -> 中 3 -> 中 12-> 中文english?
10、hashCode(); String中的hashCode方法做过了重写,同一个字符串在任何情况下的哈希码都是一样的。
11、indexOf(char c/String s); 获取指定字符c在字符串中的第一次出现的位置,如果找不到该字符会返回一个-1。
练习
输出字符在字符串中的出现的位置
输入一个字符串和一个字符,输出这个字符出现的所有位置。
12、isEmpty(); 判断字符串长度是否为0.
13、lastIndexOf(char ch/String s); 表示最后一次出现的位置。
14、lastIndexOf(char ch,int indexfrom); 从指定下标开始向前寻找最后一次出现的位置。
15、replace(char oldch,char newch); 返回一个新字符串,替换。
Java中的范围包前不包后,包左不包右,包小不包大。
16、startsWith(char ch); 判断是否指定参数作为开头。作为筛选使用。
17、subString(int index); 从指定下标开始截取。
18、subString(int beginIndex,int endIndex); 从指定位置开始截取,截取到指定位置的前一位。
19、toCharArray(); 将字符串转化为字符数组。
20、toLowerCase() ; 转化为小写。
底层
- 现将字符串化为字符数组。
- 便利数组,判断每一位是否是一个大写字母。
- 如果是一个大写字母,这以为加上32然后在强转回char类型,再赋值给原位置。
- 将字符数组转化为字符串。
21、toUpperCase(); 转为大写。
22、toString(); 返回本身。
23、trim(); 去掉字符串前后的空白符。
24、valueOf(int i/char c/boolean b/long l/Object o); 返回参数的对应字符串形式。