Java API
API概述
API (Application Programming Interface) 应用程序编程接口,就是 JDK 提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。可以通过查找帮助文档来具体了解。
编程原则:任何对象在使用前先判断是否为null。
Scanner的使用(了解)
1、在JDK5以后出现的用于键盘录入数据的类。(由于J2EE大多在页面录入数据所以很少用到) 2、构造方法: A:讲解了System.in这个东西。 它其实是标准的输入流,对应于键盘录入 B:构造方法 InputStream is = System.in; Scanner(InputStream is) C:常用的格式 Scanner sc = new Scanner(System.in); 3、基本方法格式: A:hasNextXxx() 判断是否是某种类型的 B:nextXxx() 返回某种类型的元素 4、要掌握的两个方法 A:public int nextInt() B:public String nextLine() 5、需要注意的小问题 A:同一个Scanner对象,先获取数值,再获取字符串会出现一个小问题。 B:解决方案: a:重新定义一个Scanner对象 b:把所有的数据都用字符串获取,然后再进行相应的转换
String类的概述和使用(掌握)
1、多个字符组成的一串数据。 其实它可以和字符数组进行相互转换。 2、构造方法: A:public String() B:public String(byte[] bytes) C:public String(byte[] bytes,int offset,int length) D:public String(char[] value) E:public String(char[] value,int offset,int count) F:public String(String original) 下面的这一个虽然不是构造方法,但是结果也是一个字符串对象 G:String s = "hello"; 3、字符串的特点 A:字符串一旦被赋值,就不能改变。 注意:这里指的是字符串的内容不能改变,而不是引用不能改变。 B:字面值作为字符串对象和通过构造方法创建对象的不同 String s = new String("hello");和String s = "hello"的区别?
4、字符串创建与存储机制
5、字符串的面试题(看程序写结果) A:==和equals() String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2);// false System.out.println(s1.equals(s2));// true String s3 = new String("hello"); String s4 = "hello"; System.out.println(s3 == s4);// false System.out.println(s3.equals(s4));// true String s5 = "hello"; String s6 = "hello"; System.out.println(s5 == s6);// true System.out.println(s5.equals(s6));// true B:字符串的拼接 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");// false 这个我们错了,应该是true System.out.println(s3.equals("hello" + "world"));// true 6、字符串的功能(自己补齐方法中文意思) A:判断功能 boolean equals(Object obj) boolean equalsIgnoreCase(String str) boolean contains(String str) boolean startsWith(String str) boolean endsWith(String str) boolean isEmpty() B:获取功能 int length() char charAt(int index) int indexOf(int ch) 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) C:转换功能 byte[] getBytes() char[] toCharArray() static String valueOf(char[] chs) static String valueOf(int i) String toLowerCase() String toUpperCase() String concat(String str) D:其他功能 a:替换功能 String replace(char old,char new) String replace(String old,String new) b:去空格功能 String trim() c:按字典比较功能 int compareTo(String str) int compareToIgnoreCase(String str) 7、字符串的案例 A:模拟用户登录 B:字符串遍历 C:统计字符串中大写,小写及数字字符的个数 D:把字符串的首字母转成大写,其他小写 E:把int数组拼接成一个指定格式的字符串 F:字符串反转 G:统计大串中小串出现的次数 8、String,StringBuffer,StringBuilder的区别? String 是内容不可变的,而 StringBuffer, StringBuilder 都是内容可变的。 StringBuffer 是同步的,数据安全,效率低; StringBuilder 是不同步的,数据不安全,效率高。
9、String类的常见操作补充
- 返回指定字符串在此字符串中最后一次出现处的索引
int lastIndexOf(int ch)
- 将此字符串与指定的字符串比较
/* *String中的equals比较的是字符串的值非地址(重写了toString方法) */ boolean equals(Object anObject)
- 根据参数 regex 将原来的字符串分割为若干个子字符串
String[] substring(int beginIndex)
StringBuffer类(掌握)
由于字符串是常量,因此一旦创建,其内容和长度是不可改变的(与 String 类最大的区别)。如果需要对一个字符串进行修改,则只能创建新的字符串。
用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了一个字符串缓冲区类。StringBuffer供我们使用。
StringBuffer类的常见操作
StringBuffer具有String的大部分方法
- StringBuffer 的构造函数
public StringBuffer() //无参构造方法 public StringBuffer(int capacity) //指定容量的字符串缓冲区对象 public StringBuffer(String str) //指定字符串内容的字符串缓冲区对象
- StringBuffer 的方法
public int capacity() //返回当前容量。 理论值 public int length() //返回长度(字符数)。 实际值
- StringBuffer 的添加功能
public StringBuffer append(String str) //可以把"任意类型数据"添加到字符串缓冲区里面,并返回字符串缓冲区本身 public StringBuffer insert(int offset,String str) //在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身(注意不要越界)
- StringBuffer 的删除功能
public StringBuffer deleteCharAt(int index) //删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end) //删除从指定位置开始指定位置结束的内容,并返回本身 - StringBuffer 的替换功能
public StringBuffer replace(int start,int end,String str) //从start开始到end用str替换
StringBuffer setCharAt(int index, char ch) //修改指定位置 index 处的字符序列
- StringBuffer 的截取功能
StringBuffer setCharAt(int index, char ch)
- 返回 StringBuffer 缓冲区的字符串
String toString()
- StringBuffer 的反转功能
public StringBuffer reverse()
StringBuffer 和 String 相互转换
String -- StringBuffer 构造方法 append()方法 StringBuffer -- String 构造方法 toString()方法
StringBuffer 特性
A:String,StringBuffer,StringBuilder的区别? String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的。 StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高 B:StringBuffer和数组的区别? 二者都可以看出是一个容器,装其他的数据。 但是呢,StringBuffer的数据最终是一个字符串数据。 而数组可以放置多种数据,但必须是同一种数据类型的。 C:形式参数问题 String作为参数传递 StringBuffer作为参数传递 注意: String作为参数传递,效果和基本类型作为参数传递是一样的。
Object类
Object 类是层次结构的根类,每个类都使用 Object 作为超类。每个类都直接或者间接的继承自 Object 类。
Object类的构造方法有一个,并且是无参构造
这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
Object类的常见操作
- 返回该对象的哈希码值(将地址转化为十六进制字符串形式)
/*hashCode与equals的区别与联系 *1、equals方法用于比较对象的内容是否相等(前提覆盖以后,默认比较地址值,String对象默认比较值) *2、hashcode方法只有在集合中用到 *3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法 进行比较(判断对象的内容是否相等)。 *4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的 任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合 中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合 中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入 到集合中,否则不放入。 */ public int hashCode()
- 返回此 Object 的运行时类(编译的字节码文件对象:.class对象)
public final Class getClass()
- 以 String 的形式返回此 Class 对象所表示的实体
/*通常使用 getClass().getName(); *返回类的全路径 */ public String getName()
- 返回对象的字符串表示(类的全路径@
hashCode
)
/* * Integer类下的一个静态方法: * public static String toHexString(int i):把一个整数转成一个十六进制表示的字符串 * 但是这个信息是没有任何意义的。所以,建议所有子类都重写该方法。 * * 怎么重写呢? * 通常自动生成toString()方法。把该类的所有成员变量值组成返回即可。 * * 注意: * 直接输出一个对象的名称,其实就是调用该对象的toString()方法。 */ public String toString()
- 判断对象是否相等(默认比较地址)
/*
* ==:
* 基本类型:比较的就是值是否相同
* 引用类型:比较的就是地址值是否相同
* equals:
* 重写该方法(自动生成),比较对象的成员变量值是否相同* 判断对象是否是某个类的对象:对象名 instanceof 类名
*/public boolean equals(Object obj)
- 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定
protected void finalize()
- 创建并返回此对象的一个副本
protected Object equals(Object obj)
- 例子
/* * Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 * 这个接口中没有方法是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。 * public class Student implements Cloneable */ public class StudentDemo { public static void main(String[] args) throws CloneNotSupportedException { //创建学生对象 Student s = new Student(); s.setName("林青霞"); s.setAge(27); //克隆学生对象 Object obj = s.clone(); Student s2 = (Student)obj; System.out.println("---------"); System.out.println(s.getName()+"---"+s.getAge()); System.out.println(s2.getName()+"---"+s2.getAge()); //以前的做法 Student s3 = s; System.out.println(s3.getName()+"---"+s3.getAge()); System.out.println("---------"); //其实是有区别的:改变克隆对象的成员变量值不会改变原对象的成员变量值
//改变引用相同地址值的对象会改变原对象的成员变量值
s3.setName("刘意"); s3.setAge(30); System.out.println(s.getName()+"---"+s.getAge()); System.out.println(s2.getName()+"---"+s2.getAge()); System.out.println(s3.getName()+"---"+s3.getAge()); } }