Object类
(1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。
(2)Object类的构造方法有一个,并且是无参构造
这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
(3)要掌握的方法:
A:toString()
返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示。
这个表示其实是没有意义的,一般子类都会重写该方法。
B:equals()
比较两个对象是否相同。默认情况下,比较的是地址值是否相同。
而比较地址值是没有意义的,所以,一般子类也会重写该方法。
(4)要了解的方法:
A:hashCode() 返回对象的哈希值。不是实际地址值,可以理解为地址值。
B:getClass() 返回对象的字节码文件对象,反射中我们会详细讲解
C:finalize() 用于垃圾回收,在不确定的时间
D:clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。
(5)两个注意问题;
A:直接输出一个对象名称,其实默认调用了该对象的toString()方法。
B:面试题
==和equals()的区别?
A:==
基本类型:比较的是值是否相同
引用类型:比较的是地址值是否相同
B:equals()
只能比较引用类型。默认情况下,比较的是地址值是否相同。
但是,我们可以根据自己的需要重写该方法。
Scanner类
(1)在JDK5以后出现的用于键盘录入数据的类。
(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 world");和String s = "hello world"的区别?
String s="Hello world";
先在栈中创建一个对String类的对象引用变量s,然后查找栈中有没有存放"Hello world",如果没有,则将"Hello world"存放进栈,并令s指向“Hello world”,如果已经有”Hello world” 则直接令s指向“Hello world”。
String s=new String("Hello World");
用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
(4)字符串的面试题(看程序写结果)
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
(5)字符串的功能(自己补齐方法中文意思)
A:判断功能
boolean equals(Object obj) 将此字符串与指定的对象比较
boolean equalsIgnoreCase(String str) 将此String与另一个String比较,不比较大小写
boolean contains(String str) 当且仅当此字符串包含指定的char值序列时,返回true
boolean startsWith(String str) 测试此字符串是否以指定的前缀比较
boolean endsWith(String str) 测试此字符串是否以指定的后缀比较
boolean isEmpty() 当且仅当length()为0时返回true
B:获取功能
int length() 返回此字符串的长度
char charAt(int index) 返回指定索引处的char值
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()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
char[] toCharArray()
将此字符串转换为一个新的字符数组。 |
static String valueOf(char[] chs)
返回 char 数组参数的字符串表示形式。 |
static String valueOf(int i)
返回 int 参数的字符串表示形式。 |
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 |
String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 |
String concat(String str)
将指定字符串连接到此字符串的结尾。 |
D:其他功能
a:替换功能
String replace(char old,char new)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 |
String replace(String old,String new)
返回一个新的字符串,它是通过用 newString 替换此字符串中出现的所有 oldString 得到的。 |
b:去空格功能
String trim()
返回字符串的副本,忽略前导空白和尾部空白。 |
c:按字典比较功能
int compareTo(String str)
按字典顺序比较两个字符串。 |
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写。 |
StringBuffer类
(1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类。StringBuffer供我们使用。
(2)StringBuffer的构造方法
A:StringBuffer()
B:StringBuffer(int size)
C:StringBuffer(String str)
(3)StringBuffer的常见功能(自己补齐方法的声明和方法的解释)
A:添加功能
StringBuffer append()
B:删除功能
delete(int start, int end) |
deleteCharAt(int index) |
C:替换功能
replace(int start, int end, String str) |
D:反转功能
reverse() |
E:截取功能(注意这个返回值)
String substring(int start) |
String substring(int start, int end) |
(4)StringBuffer的练习
A:String和StringBuffer相互转换
String -- StringBuffer
构造方法
StringBuffer -- String
toString()方法
B:字符串的拼接
C:把字符串反转
D:判断一个字符串是否对称
(5)面试题
小细节:
StringBuffer:同步的,数据安全,效率低。
StringBuilder:不同步的,数据不安全,效率高。
A:String,StringBuffer,StringBuilder的区别
1.可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value;
2.是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
1 public synchronized StringBuffer reverse() { 2 super.reverse(); 3 return this; 4 } 5 6 public int indexOf(String str) { 7 return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 8 }
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3.StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
B:StringBuffer和数组的区别?
数组是一种数据类型,一旦数组初始化完成,数组在内存中所占的空间就被固定下来,因此数组的长度不可改变,即使把某个数组元素的数据清空,它所占的空间依然被保留,依然属于该数组,数组的长度依然不变。 StringBuffer的对象代表一个字符序列可变的字符串,可以调用StringBuffer提供的方法来改变这个字符串。而且只能存放字符串,但是数组可以存放的类型就不限于字符串了。 |
(6)注意的问题:
String作为形式参数,StringBuffer作为形式参数
Integer类
(1)为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
(2)Integer的构造方法
A:Integer i = new Integer(100);
B:Integer i = new Integer("100");
注意:这里的字符串必须是由数字字符组成
(3)String和int的相互转换
A:String -- int
Integer.parseInt("100");
B:int -- String
String.valueOf(100);
(4)其他的功能(了解)
进制转换
static String | toBinaryString(int i) 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。 |
static String | toHexString(int i) 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。 |
static String | toOctalString(int i) 以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。 |
(5)JDK5的新特性
自动装箱 基本类型--引用类型
自动拆箱 引用类型--基本类型
把下面的这个代码理解即可:
Integer i = 100;
i += 200;
(6)面试题
-128到127之间的数据缓冲池问题
在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
4:Character(了解)
(1)Character构造方法
Character ch = new Character('a');
(2)要掌握的方法:(自己补齐)
A:判断给定的字符是否是大写
B:判断给定的字符是否是小写
C:判断给定的字符是否是数字字符
D:把给定的字符转成大写
E:把给定的字符转成小写
(3)案例:
统计字符串中大写,小写及数字字符出现的次数
。