java基础
一. Object类
java.lang.Object 类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。
如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:
public class MyClass /*extends Object*/ {
// ...
}
1.2 toString方法
public String toString()
:返回该对象的字符串表示。(对象的类型+@+内存地址值。)
由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
// 省略构造器与Getter Setter
}
小贴士: 在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法。
1.3 equals方法
public boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”。
调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
默认地址比较:
如果没有覆盖重写equals方法,那么Object类中默认进行 == 运算符的对象地址比较,只要不是同一个对象,结果必然为false。
对象内容比较
如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。
例如:
import java.util.Objects;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
// 如果对象地址一样,则认为相同
if (this == o)
return true;
// 如果参数为空,或者类型信息不一样,则认为不同
if (o == null || getClass() != o.getClass())
return false;
// 转换为当前类型
Person person = (Person) o;
// 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果
return age == person.age && Objects.equals(name, person.name);
}
}
1.4 Objects类
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。
方法如下:
public static boolean equals(Object a, Object b)
:判断两个对象是否相等。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
二. String类
2.1. 特点
- 字符串不变:字符串的值在创建后不能被更改。
String s1 = "abc";
s1 += "d";
System.out.println(s1); // "abcd"
// 内存中有"abc","abcd"两个对象,s1从指向"abc",改变指向,指向了"abcd"。
- 因为String对象是不可变的,所以它们可以被共享。
String s1 = "abc";
String s2 = "abc";
// 内存中只有一个"abc"对象被创建,同时被s1和s2共享。
- “abc” 等效于 char[] data={ ‘a’ , ‘b’ , ‘c’ } 。
例如:
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
// String底层是靠字符数组实现的。
2.2 常用方法
1.public boolean equals (Object anObject)
:将此字符串与指定对象进行比较。
2.public boolean equalsIgnoreCase (String anotherString)
:将此字符串与指定对象进行比较,忽略大小写。
3.public String concat (String str)
:将指定的字符串连接到该字符串的末尾。
String s = "helloworld";
String s2 = s.concat("**hello jxl"); // 将字符串连接到该字符串的末尾.
System.out.println(s2);// helloworld**hello jxl
4.public char charAt (int index)
:返回指定索引处的 char值。
String s = "helloworld";
System.out.println(s.charAt(0));
System.out.println(s.charAt(1));
5.public int indexOf (String str)
:返回指定子字符串第一次出现在该字符串内的索引。
String s = "helloworld";
// 获取str在字符串对象中第一次出现的索引,没有返回‐1
System.out.println(s.indexOf("l"));
System.out.println(s.indexOf("owo"));
System.out.println(s.indexOf("ak"));
6.public String substring (int beginIndex)
:返回一个子字符串,从beginIndex开始截取字符串到字符 串结尾。
String s = "helloworld";
System.out.println(s.substring(0));
System.out.println(s.substring(5));
7.public String substring (int beginIndex, int endIndex)
:返回一个子字符串,从beginIndex到 endIndex截取字符串。含beginIndex,不含endIndex。
String s = "helloworld";
// String substring(int start,int end):从start到end截取字符串。含start,不含end。
System.out.println(s.substring(0, s.length()));
System.out.println(s.substring(3,8));
8.public char[] toCharArray ()
:将此字符串转换为新的字符数组。
String s = "abcde";
char[] chs = s.toCharArray();
for(int x = 0; x < chs.length; x++) {
System.out.println(chs[x]);
}
9.public byte[] getBytes ()
:使用平台的默认字符集将该 String编码转换为新的字节数组。
String s = "abcde";
byte[] bytes = s.getBytes();
for(int x = 0; x < bytes.length; x++) {
System.out.println(bytes[x]);
}
10.public String replace (CharSequence target, CharSequence replacement)
:将与target匹配的字符串使 用replacement字符串替换。
String str = " jxl";
String replace = str.replace("j", "J");
System.out.println(replace); // Jxl
11.public String[] split(String regex)
:将此字符串按照给定的regex(规则)拆分为字符串数组。
String s = "aa,bb,cc";
String[] strArray = s.split(","); // ["aa","bb","cc"]
for(int x = 0; x < strArray.length; x++) {
System.out.println(strArray[x]); // aa bb cc
}
3.3 String和StringBuffer、StringBuilder
1.可变性
String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。
2.线程安全性
String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3.性能
每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结
如果要操作少量的数据用 = String
单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
三.抽象类
抽象方法 : 没有方法体的方法。
修饰符 abstract 返回值类型 方法名 (参数列表);
抽象类:包含抽象方法的类。
abstract class 类名字 { }
3.1抽象的使用
1.继承抽象类的子类必须重写父类所有的抽象方法
。否则,该子类也必须声明为抽象类。抽象类不能创建对象
2.抽象类中,子类的构造方法中,有默认的super(),要访问父类构造方法
3.抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类
四. 接口
接口,是Java语言中一种引用类型,是方法的集合,接口的内部主要就是封装方法
,
接口的使用,它不能创建对象,但是可以被实现( implements)
4.1 接口中的方法
@Override 重写
public interface 接口名称 {
// 抽象方法 使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。
// 默认方法 使用 default 修饰,不可省略,供子类调用或者子类重写,有方法体。
// 静态方法 使用 static 修饰,供接口直接调用。
// 私有方法
}
4.1 接口的多实现
在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接
口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}
在接口的实现类中,如果抽象方法有重名的,只需要重写一次。
在接口的实现类中,如果默认方法有重名的,必须重写一次