API概述
- 应用程序编程接口
- JDK提供的提高编程效率的Object类
Object类
Object类概述
- 类层次结构的根类,有类的结构都直接或间接继承自该类
- Object类的构造方法只有一个无参的: public Object(),理解之前说的在面向对象中,子类的构造方法默认访问的是父类的无参构造方法
要掌握的方法
- toString()
- 返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示
- 这个表示其实是没有意义的,一般子类会重写该方法
- 如何重写??
- 最终还是建议自动生成
- equals()
- 比较两个对象是否相同,默认情况下,比较的是地址值是否相同。
- 比较地址值没啥意义,所以一般子类会重写该方法
- 如何重写??(初始版本,优化版本,自动生成)
- 最终还是建议自动生成
要了解的方法
- hashCode():返回对象的哈希值,不是实际的地址值,可以理解为地址值。
- getClass():返回对象的字节码文件对象,反射中会详细看
- finalize():用于垃圾回收,在不确定地方时间
- clone():创建并返回此对象的一个副本,包括成员变量的数据复制,但是他和两个引用指向同一个对象是有区别的
两个注意问题
- 直接输出一个对象名称,其实默认调用了该对象的toString()方法
- 面试题:==和equals()的区别:
- ==
- 基本类型,比较两个值是否相同
- 引用类型:比较的是地址值是否相同
- equals()
- 只能比较引用类型,默认情况下,比较的是地址值是否相同
- 但是,可以根据需求重写该方法。
- ==
Scanner类
构造方法
- System类下有一个静态的字段
- public static final InputStream in;//标准的输入流,对应着键盘录入
- InputStream is = System.in;
- 键盘录入都是字符格式,然后用Scanner包装一下:Scanner(System.in),调用Scanner的转换函数
- 转换函数例如: nextInt(),nextLine()
InputStream is = Sysytem.in
Scanner(InputStream is)
- 常用格式
Scanner(InputStream is)
基本方法格式
- hasNextXxx():判断是否是某种类型的
- nextXxx():返回某种类型的元素
- 配套使用
//创建对象
Scanner sc = new Scanner(System.in);
//获取数据
if (sc.hasNextInt()){
int x = sc.nextInt();
}
常用的两种方法
public int nextInt() public String nextLine()
需要注意的问题
- 同一个Scanner对象,先获取数值,再获取字符值,会出现问题,把回车当成字符接收
- 解决方案:
- 重新定义一个Scanner对象
- 把所有的对象都用字符串获取,然后再根据需求进行相应的转换
String类
概述
- 字符串:就是由多个字符组成的一串数据,也可以看成是一个字符数组。
- 通过查看API,我们可以知道:
- 字符串字面值“abc”也可以看成是一个字符串对象
- 字符串是常量,一旦被赋值,就不能被改变。
构造方法
- public String():空构造
- public String(byte[] bytes):把字节数组转成字符串
- public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
- public String(char[] value):把字符数组转成字符串
- public String(char[] value,int index,int length):把字符数组的一部分转成字符串
- public String(String original):把字符串常量值转成字符串
- 字符串方法:
- public int length():返回此字符串的长度
字符串的特点
- 字符串一旦被赋值,就不能被改变
- 注意:这里指的是字符串的内容不能改变,不是引用不能改变
- 字面值作为字符串对象和通过构造方法创建对象的不同
// output??
String s = "hello";
s += "world";
Sysytem.out.println("s:"+ s);
//helloworld以下图解
String s = new String("hello")和String s = "hello"的区别?- 前者创建2个对象,后者创建一个对象,如下图:
面试题—— 看程序写结果
/*
* 字符串如果是变量相加, 先开空间,再拼接
* 字符串如果是常量相加,先加,然后在方法区的常量池找,如果有,就直接返回,否则,就创建
*/
public class StringDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1+s2); //false
System.out.println(s3.equals(s1+s2)); //true
System.out.println(s3 == "hello" + "world"); //true
System.out.println(s3.equals("hello" + "world")); //true
}
}
- 七种方法得到字符串数组
public static void main(String[] args) {
//空构造
String s1 = new String();
System.out.println("s1:"+s1);
System.out.println("s1.length():" + s1.length());
System.out.println("--------------------------");
// public String(byte[] bytes):把字节数组转成字符串
byte[] bys = {97,98,99,100,101};
String s2 = new String(bys);
System.out.println("s2:"+s2);
System.out.println("s2.length():" + s2.length());
System.out.println("--------------------------");
// public String(byte[] bytes,<u>int</u> index,<u>int</u> length):把字节数组的一部分转成字符串
String s3 = new String(bys,1,3);
System.out.println("s3:"+s3);
System.out.println("s3.length():" + s3.length());
System.out.println("--------------------------");
// public String(char[] value):把字符数组转成字符串
char[] chs = {'a','b','c','d','e'};
String s4 = new String(chs);
System.out.println("s4:"+s4);
System.out.println("s4.length():" + s4.length());
System.out.println("--------------------------");
// public String(char[] value,<u>int</u> index,<u>int</u> length):把字符数组的一部分转成字符串
String s5 = new String(chs,1,3);
System.out.println("s5:"+s5);
System.out.println("s5.length():" + s5.length());
System.out.println("--------------------------");
// public String(String original):把字符串常量值转成字符串
String s6 = new String("abcde");
System.out.println("s6:"+s6);
System.out.println("s6.length():" + s6.length());
System.out.println("--------------------------");
//上面的一种方法意义不大,字符串常量值也可以看成是对象
String s7 = "abcde";
System.out.println("s7:"+s7);
System.out.println("s7.length():" + s7.length());
}
Sring类的判断功能
- boolean equals(Object obj)
- boolean equalsIgnoreCase(String str)
- boolean contains(String str)
- boolean startsWith(String str)
- boolean endWith(String str)
- boolean isEmpty()
Sring类的获取功能
- int length()
- char charAt(int index):获取指定索引位置的字符
- int indexOf(int ch):返回指定字符在此字符串中第一次出现的索引
- 为什么是int类型?用的ASCII码
- int indexOf(String str):
- int indexOf(int ch,int fromIndex):
- int indexOf(String str,int fromIndex):
- String substring(int start):截取字符串
- String substring(int start,int end):左闭右开
String类的转换功能
- byte[] getBytes():把字符串转换为字节数组
- char[] toCharArry()
- static String valueOf(char[] chs):把字符数组转换为字符串
- static String valueOf(int i):
- String类的valueOf方法可以把任意类型的数据转换成字符串
- String toLowerCase()
- String toUpperCase()
- String concat(String str):字符串拼接
String类的其他功能
- 替换功能
- String replace(char old,char new)
- String replace(String old,String new)
- 去除字符串两端空格
- String trim()
- 按字典顺序比较两个字符串
- int compareTo(String str)
- 比较到不同的地方,两个字符的ASCII码做减法返回
- 如果是'hello'和‘hel'这种,返回长度差
- int compareToIgnoreCase(String str)
- int compareTo(String str)
StringBuffer
概述
- 线程安全
- 安全--同步--效率低
- 不安全--不同步--效率高一些
- StringBuffer是线程安全的可变字符串
构造方法
- StringBuffer():无参构造
- StringBuffer(int size):指定容量的字符串缓冲区对象
- StringBuffer(String str):指定字符串内容的字符串缓冲区对象
常用方法
public int capacity();//返回当前容量,理论值public int length();//返回长度(字符数),实际值
常见功能
- 添加:
public StringBuffer append(String str);public StringBuffer insert(int offset,String str)
- 删除:
public StringBuffer deleteCharAt(int index)public StringBuffer delete(int strart,int end)
- 替换:
public StringBuffer replace(int start,int end,String str)
- 反转:
public StringBuffer reverse()
- 截取:
public String subString(int start)public String subString(int start,int end)- 注意:返回值是String类型,本身未发生改变
练习
- String 和StringBuffer的相互转换
//String ---- StringBuffer
String s = "hello";
//注意 StirngBuffer不能直接赋值
//StringBuffer <u>sb</u> = "hello";
//StringBuffer <u>sb</u> = s;
//方式1:通过构造方法
StringBuffer <u>sb</u> = new StringBuffer(s);
//方式2:通过append方法
StringBuffer sb2 = new StringBuffer();
sb2.append(s);
// StringBuffer ---- String
StringBuffer sb3 = new StringBuffer("java");
//方式1:通过构造方法
String <u>s1</u> = new String(sb3);
//方式2:通过toString()方法
String <u>s2</u> = sb3.toString();
- 字符串的拼接
- String:遍历数组,一个一个+ s+=arr[x]
- StringBuffer:遍历数组,用append方法,sb.append(arr[x]);
- 把字符串反转
- String:先转成字符串数组,倒着遍历
char[] chs = s.toCharArray();
- StringBuffer:先转成StringBuffer,reverse().toString()
return new StringBuffer(s).reverse().toString();
- String:先转成字符串数组,倒着遍历
- 判断一个字符串是否对称
// 判断一个字符串是否对称
public static void main(String[] args) {
String s = "hello";
System.out.println(isEqual(s));
System.out.println(isEqual2(s));
}
// 方法1
public static boolean isEqual(String s) {
return new StringBuffer(s).reverse().toString().equals(s);
}
//方法2
public static boolean isEqual2(String s) {
char[] chs = s.toCharArray();
for(int start = 0, end = s.length()-1;start<=end;start++,end--) {
if(chs[start] != chs[end]) {
return false;
}
}
return true;
}
面试题
- String 和 StringBuffer 和StringBuilder的区别
- String是内容不可变的,而StringBuffer,StingBuilder都是内容可变的
- StringBuffer是同步的,数据安全但是效率低;StingBuilder不同步,数据不安全但效率高。
- StringBuffer 和数组的区别
- 两者都可以看作是一个容器,里面放数据。
- 前者只能放字符数据,后者可以放多种类型数据,但每个数组内数据类型必须相同。
注意的问题
- String作为形式参数,StringBuffer作为形式参数
- String作为参数传递,效果和基本类型作为参数传递是一样的。
- 字符串是个常量值,属于特殊的引用类型,当作基本类型来看。
- StringBuffer 形参直接赋值(=),不改变;调用方法时,改变实参的值。(P363)