一、Object 类:
在java中。object是继承树中的顶点,换句话说,该类是所有类的直接或者间接类,一切皆对象。若我们定义的类没有显式的书写extends关键字,那么默认情况下就继承自Object类
Object中定义的方法:(意味着所有类中都有这些方法)
1.toString():该方法要求返回一个字符串,这个字符串就是当前对象的句柄
字符串格式:类名@HashCode值,组合起来叫句柄,HsahCode是个16进制值,也就是这个对象的地址。
toString()方法设计的目的是返回一个更有意义的字符串,所以很多时候我们会在子类中重写这个方法。
System.out.println()方法默认就是输出我们传入对象的toString方法的返回值。
2.equals()方法:这个方法设计的目的是定义对象的比较规则,方法是这样声明的:
public boolean equals(Object object){
return this==obj;
}
从这个方法的声明可以看出,Object类中定义的equals()方法完全和“==”符号的作用一样。“==”的作用是比较内容是否完全一样,对于两个一般的变量(8种基本数据类型)比较的是其值,但是对于引用变量比较的就是引用变量中存储的地址了。所以在很多类中重写equals()方法,用来比较两个对象是否“相像”,即对象的内容是否一样。
equals的比较逻辑中,在比较内容前一定要确定这两个类型是否为同一个类型。不是同一类型返回值一定是false.
class Point{
int x,y;
public Point(int x,int y){ this.x = x; this.y = y; }
public boolean equals(Object obj){
if(obj instanceof Point){//比较第一原则,必须属于同一对象。
Point p = (Point)obj;
return p.x==this.x&&p.y==this.y;
}
return false;
}
}
public class Person {
public static void main(String[] args){
Point point1 = new Point(1,2);
Point point2 = new Point(1,2);
System.out.println("两个点相等吗?"+ (point1 == point2));//false
System.out.println("两个点相等吗?"+ point1.equals(point2));//true,若果equals没有重写会返回false,没有重写equals,还是比较句柄
}
}
对于equals重写,我们可以根据需要在重写的方法中比较有关的属性。
3.hashCode()方法:
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable
提供的哈希表)的性能。该方法一般也要求重写,以保证通过equals()方法返回为true的两个对象的hashCode值也一样。哈希值可以是我们自己定义的一个值。
二、String类
java中用String类封装字符序列。
java采用unicode编码在内存中存储字符串。任何一个字符都占用两个字节。
java对字符串的处理有一个特点,字符串是不变对象,对象一旦创建对象本身就不会改变。
String是引用类型不属于基本类型,不过出于方便,java语法允许为该引用类型变量赋值直接量(字面量):String str = "12345678";
String的特性(常量池):
出于性能的考虑,java会将所有出现的字符串缓存在常量池中。字符串的常量池是jvm用于管理字符串而开辟的一段内存空间。这样做的目的是尽最大可能重用字符串。字符串创建后就不会再改变,对字符串的任何操作结果都会创建新的字符串。使用new方法一定会在重新创建字符串,而不管常量池中是否有该字符串。
public class TestString {
public static void main(String[] args){
String str1 = "Hello";
String str2 = "World";
String str3 = "Java";
String str4 = "World";//这个str4就指向常量池中的“World”,而这个在常量池中的“World”是str2声明的时候放在常量池中的。这就是为什么字符串对象是不变对象。
String str5 = new String("World");//这种声明的方法,会强制要求新创建一个内存空间,不管常量池中是否有该字符串。
String str6 = "Wor"+"ld";//先创建"Wor""ld"对象,然后创建新的对象连接,“Wor”“ld”也不会被回收。
//java在编译的时候,如果能确定结果(都是字面量,进行优化),编译后就变成了"World",.class文件中存在的就是“World”,这样在运行的时候就会在常量池中寻找World.
System.out.println(str2 == str4);//返回true
System.out.println(str2 == str5);//返回false
System.out.println(str2.equals(str4));//true
System.out.println(str2.equals(str5));//true
System.out.println(str2 == str6);//true
str1 +=str3;//先创建一块内存,内容放HelloJava,让后str1指向该内存。原先存储Hello的内存也不会被回收。
str2 +="a";//
System.out.println(str1);//HelloJava
System.out.println(str2);//Worlda
System.out.println(str4);//World
}
}
String也重写了equals方法,用于比较内容是否一致,区分大小写。
equalsIgnoreCase()方法是字符串提供的另一个比较方法。用于忽略大小写的比较内容。
equals比较的时候良好习惯,用字面量去equals变量。以防空指针的异常。
String toLowerCase(),返回该字符串的小写形式。
String toUpperCase(),返回该字符串的大写形式。这两个操作都会返回字符串新对象。
String trim(),去掉字符串两边的空白。
boolean startsWith(String str);判断当前字符串是否以给定的字符串开始的。
boolean endsWith(String str);判断当前字符串是否以给定的字符串结尾。
int length();返回当前字符串的长度(字符数量)。
int indexOf(String str);返回给定字符串在当前字符串中第一次出现的位置。从0开始。如果没有则返回-1,大小写匹配。
int indexOf(String str,int fromIndex),功能同上,但是从fromindex处开始查找。
int lastIndexOf(String str);查找给定字符串在当前字符串中最后一次出现的位置。
char charAt(int index),查找指定索引处的字符
String substring(int start,int end);截取字符串。含头不含尾。jdk中很多用两个数字描述的范围都是“含头不含尾”
String substring(int start),截取字符串,从开始位置一直到结尾。
getBytes(String charsetName);根据指定的编码集获取字符串的字节形式。
常见编码集: GBK:国标, GB2312: 支持繁体字的国标, ISO8859-1:欧洲标准, UTF-8:国际通用的编码集, UTF-16。
String(byte[] data,String charset),作用就是将给定的字节数组以给定的编码集进行翻译转化为对应的字符串,反序列化。
String[] split(String rex),根据给定的正则表达式拆分字符串。
String replaceAll(String rex,String str),将当前字符串中满足正则表达式的部分替换为给定的字符串
StringUtils 类, commons-lang包中提供的一个字符串工具类,用于补充jdk中的String方法
String repeat(String str,int repeat);将给定的字符串str重复repeat次并返回
String join(Object[] array,String str)将数组的元素用给定的str连接为字符串
String leftPad(String str,int size,String pad),向左边填充pad以达到size长度
String rightPad(String str,int size,String pad)
三、StringBuilder类:
StringBuilder 和String不同,其封装的是可变的字符串。StringBuilder是在有对字符串做频繁的修改的情况下使用的类,这样对性能提升很大。
StringBuilder 有几个常用的方法用于对对字符串做增删改插操作,返回的就是当前自己这个对象:
StringBuilder append(String str),向当前字符串末尾追加给定的字符串,它有很多的重载的方法。
StringBuilder delete(int start,int end),删除当前字符串中start处到end处的字符串。
StringBuilder replace(int start,int end,String str),改
StringBuilder insert(int index,String str),插入
StringBuilder reverse();反转顺序
四、StringBuffer类:
StringBuffer出现的时间早于StringBuilder,方法相同,作用相同。唯一的不同是StringBuffer是线程安全,StringBuilder不是线程安全的。
运行效率上StringBuilder快于StringBuffer. 若在单线程情况下运行,优先使用StringBuilder.