1,object类
java.lang.Object类:所有的类父类(包括自定义的类)
重点功能:
public final Class getClass():获取正在运行的类; (返回字节码文件对象) (跟后面反射有关系)
面试题:
在Java中获取一个类的字节码文件对象的方式有几种?
有三种:
1)public final Class getClass():获取正在运行的类; (返回字节码文件对象)
2)在Java中任意类型的class属性 举例: Class c = 类名.class
3)Class类提供的一个静态方法
public static Class forName(String classPathName) :参数为当前类的全限定名称
object类中的toString()
public String toString():返回对象的字符串表示形式。
结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法(否则,打印出来的是地址值!)
public int hashCode():返回对象的哈希码值,不同的对象,它的哈希码值不同
(理解为 "地址值",它不是实际意义的地址值----通过哈希算法算出来的)
//任何类都继承Object类---toString方法源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
//return this.getClass().getName() +"@" +Integer.Integer.toHexString(this.hashCode())
面试题:
==和equals的区别?
==连接的是两个基本数据类型:比较的数据值是否相同
而如果引用类型,比较的是引用类型的地址值是否相等!
equals:Object的equaels方法默认比较的是两个对象的地址值相同,
如果你要比较成员信息的内容是否相同,必须重写Object的equals方法以及hashCode,重写之后比较的是内容是否相同(成员信息)
equals重写之后,是比较里面的每一个成员信息是否一样,如果都一样;
还有比较两个成员对应的hashCode是否一样,如果一样,是同一个人!
object的克隆方法
创建并返回此对象的"副本"----前提是自定义的类型必须实现Cloneable接口,否则无法克隆!
protected Object clone() throws CloneNotSupportedException
object的垃圾回收方法
protected void finalize()throws Throwable--跟gc垃圾回收器有关系
当jvm开启垃圾回收器的时候,就会回收堆内存中没有更多引用的对象(new 出来的东西)
当前垃圾回收器开始运行,会调用Object类的finalize()方法,来回收对象,子类重写了,会调用子类的finalize方法
java.util.Scanner:文本扫描器(键盘录入数据的)
构造方法:
public Scanner(InputStream source):
创建一个文本扫描器对象,里面参数是字节输入流,读取键盘录入的一些数据
成员方法:
获取功能:除过不能录入char类型之外.都可以录入!
int nextInt():录入int类型
String next():录入字符串
String nextLine():录入一行字符串
....
判断功能
boolean hasNextXXX()方法:判断下一个录入的是为XXX类型
细节:
如果先录入int,在录入String,在录入String(使用String nextLine())---String的值会被漏掉;
解决方案:
1)使用String next():录入单个字符串(推荐)
2)在使用nextLine()之前,重新创建一个新的Scanner对象;
String类
代表字符串,是一个常量,创建之后,其值不能更改!
举例:
String s = "abc" ; 格式 开发中定义字符串就这个格式!
字符串的底层就是一个字符数组组成!char[]--->String
构造方法:
public String():创建字符串对象
public String(String original):将指定的字符串传进去,构造一个字符串对象
public String(char[] value):将字符串数组---构造成String
public String(char[] value,int offset,int count):将一部分字符数组转换成String
public String(byte[] bytes)将字节数组---构造成String
public String(byte[] bytes, int offset,int length):将一部分字节数组---构造成String
如果存在类型转换问题:
已知char[]--->String public String(char[] value)
已知byte[]--->String public String(byte[] bytes)
如果仅仅表示定义一个String对象---推荐的格式
String 变量名 = "字符串常量" ;
面试题:
s1和s2有什么区别?
String s1 = "hello" ;
String s2 = new String("hello") ;
第一个格式:
创建一个对象,直接在常量池中创建;
第二个格式:
需要在堆内存开辟空间,而且指向常量池地址:内存创建了两个对象!
两个都是创建字符串实例,但是推荐第一种,从内存角度考虑,消耗内存资源不严重!
String类中常用的获取功能:
1)public char charAt(int index) 获取指定索引值对应的字符
2)public int length() :字符串特有功能:获取字符串长度
3)public String concat(String str):拼接功能 将指定的字符串拼接到该字符串末尾,获取新的字符串
4)public int indexOf(String str)返回指定字符串第一次出现索引值
public int lastIndexOf(String str):返回指定子字符串最后一次出现的索引值
5)public String[] split(String regex):字符串拆分功能
6)截取功能
public String substring(int beginIndex,int endIndex)
从指定位置开始,截取到endIndex-1处结束,包前不包后
public String substring(int beginIndex)
从指定位置开始默认截取到末尾!
String类的常用的转换功能
public byte[] getBytes(): //将字符串转换成字节数组 (编码过程:将能看懂的东西--->变成看不懂的!)
//(使用平台默认字符集)
public char[] toCharArray() ://将字符串转换成字符数组 (使用居多)
public static String valueOf(常见的基本类型int/long/double/float/boolean/Object):
String的万能方法:将上面的常用类型--转换成String
public String toUpperCase()://将指定字符串转换成大写
public String toLowerCase()://将指定字符串转换成小写
StringBuffer
字符串缓冲区,线程安全的,支持可变的字符序列!
什么叫线程安全----->后面讲的多线程
线程安全----> 意味"同步"---->执行效率低!---"银行类的网站!"
线程不安全---->意味"不同步"---->执行效率高!----"论坛的网站!"---不安全--->"锁机制"来解决线程安全问题(多线程)
面试题:
StringBuffer和StringBuilder的区别?
这两个类都是字符串缓冲区,都支持可变的字符序列,(都有相同的功能)
前者:使用在多线程环境里面,能够保证线程安全----意味着同步----->执行效率低
后者:是StringBuffer的简易替换,用于在单线程环境中,线程不安全---不同步---执行效率高!
单线程使用StringBuilder:效率高(速度快)
构造方法
public StringBuffer():无参构造方法,里面空的字符序列,初始容量16个字符(默认容量足够大) -
public StringBuffer(String str):将字符串构造为StringBuffer类型,容量是大小:当前的里面的字符串长度+16
前两个构造方法使用居多!
public StringBuffer(int capacity):创建一个字符串缓冲区,指定容量大小
获取字符串缓冲区的长度 ---int length()
获取字符串缓冲区的容量---int capacity()
StringBuffer的添加/删除的功能
添加:
public StringBuffer append(任意java类型) //可以将任意类型的元素添加(在末尾追加)到字符串缓冲区中,返回值是字符串缓冲区本身
public StringBuffer insert(int offset,任意java类型)://在指定位置处的序列前面插入新的序列
删除:
public StringBuffer deleteCharAt(int index)://在指定位置处删除指定的字符,返回字符串缓冲区本身
public StringBuffer delete(int start,int end)://从指定位置start处开始到end-1处的字符序列删除,
返回值字符串缓冲区本身
开发中使用居多:追加功能以及删除 deletCharAt(int index)使用居多
StringBuffer其他功能:
替换功能
public StringBuffer replace(int start,int end,String str)
使用指定的字符串str从指定位置开始到end-1处进行替换,返回该字符串缓冲区本身
public String substring(int start):从指定位置开始截取,默认截取到末尾,返回被截取后的字符串
public String substring(int start,int end):从指定位置开始截取到指定位置end-1处,返回被截取后的字符串
面试题:
String和StringBuffer的区别?
String特点:字符串是一个常量,一旦被创建,其值不能被更改
String作为形式参数,形参的改变不会影响实际参数;
而除过String这个引用类型之外,形式参数的改变直接影响实际参数!
StringBuffer特点:
字符串缓冲区支持可变的字符串,线程安全,执行效率低!
Integer类:
jdk提供了一个类Integer类,提供了一些功能:十进制转换成对应的进制的方法(静态方法)
*
拆箱:
这些包装类类型--->降为 基本类型
装箱:
就是基本类型--->提升 对应的引用类型
基本类型 引用类型的默认值null
byte Byte
short Short
int Integer(特殊)
long Long
float Float
double Double
char Character(特殊)
boolean Boolean
这些四类八种中的基本数据类型可以String进行相互转换的---->中间桥梁 ---->对应的基本类型的包装类类型!
String-->Integer--->int
"100" --->100
Integer和Character涉及相关功能
* 四类八种的基本数据类型都会自动提升 对应的引用类型 jdk5以后新特性:自动拆装箱
Integer类表示包含int类型的值
Integer类的构造方法:
public Integer(int value):创建一个Integer实例,里面包含的int类型的值
public Integer(String s) throws NumberFormatException: 将数字字符串转换成Integer的实例
可能会出现数字格式化异常(字符串如果不是数字字符串,就会出现这个异常)
Date类(重点)
java.util.Date:表单特定的日期时间,还允许格式化和解析日期字符串
构造方法:
public Date():创建当前日期对象:获取当前系统日期时间
public Date(long date):里面传入long类型的时间毫秒值,获取的表示从标准基准时间(称为“时代”)即1970年1月1日00:00:00 GMT起的指定毫秒数
成员方法:
public long getTime():将Date对象转换成long类型时间毫秒值
public void setTime(long time):设置日期时间,参数时间毫秒值
如何将date和string日期文本进行相互交换
他们之间要进行转换需要使用类DateFormat
DateFormat是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间
它具体的子类:SimpleDateFormat是一个具体的类,允许格式化(日期文本),解析(文本日期)
构造方法:
public SimpleDateFormat(String pattern):参数是日期模式 "yyyy-MM-dd"
pattern的组成:
y:表示年份中某个值----->yyyy 表示年 "1996/2023/..."
M:表示年中的月份------>MM 表示月:七月-->"07" 十月 -->"10"
d:表示月中的日期值----->dd 表示 "01","11","31"..
成员方法
将Date---->String:格式化 public final String format(Date date)
将String日期---->Date:解析
public Date parse(String source)throws ParseException
集合
List集合
List集合特点:
元素有序(存储和取出一致),而且元素可以重复!
List集合是Collection集合的子接口,它集合遍历方式:
1)Collection的Object[] toArray()
2)Collection的Iterator iterator() ;
3)使用size()+ 存储的数据类型 get(int index)通过角标获取元素内容 :普通for循环格式
4)ListIterator<E> listIterator()List集合的专有遍历方式 :列表迭代器
5)增强for循环
List集合常用三个子实现类特点:
实际需求:单线程中,使用List完成一些事情,没有明确规定具体使用哪个实现类;默认使用ArrayList集合!
默认:ArrayList
底层数据结构是数组-->查询快,增删慢! (数组,通过整数索引查询)
元素查找: 顺序查找,二分搜索(折半查找),哈希查找
43,50,66,70,---->哈希查询,哈希表的长度10
43 % 10 = 3
线程角度:
线程不安全的类,是一个不同步,执行效率高!
底层扩容机制1.5倍
Vector
底层数据结构是数组-->查询快,增删慢!
线程角度:
线程安全的类,是同步的,执行效率低! 多线程环境下使用居多,单线程使用ArrayList代替Vector
LinkedList
底层数据是链表, 查询慢,增删快
线程角度:
线程不安全的类,不同步的,执行效率高!
迭代器
interface Iterator<E>{
boolean hasNext() ;判断是否有下一个可以迭代的元素
E next() ;获取下一个元素
}
interface Iterable<T>{
Iterator<E> iterator();
}
interface Collection<E> extends Iterable {
Iterator<E> iterator();
}
interface List<E> extends Collection<E>{
Iterator<E> iterator();
}
//具体的子实现类
public class ArrayList<E> implements List<E>{
public Iterator<E> iterator() {
return new Itr();
}
//私有的成员内部类Itr
private class Itr implements Iterator<E> {
boolean hasNext(){
}
Object next(){
...
}
}
}
原理:就是ArrayList集合的内部类实现Itr间接实现了两个功能!
增强for
Jdk5新特性:<泛型>,增强for,可变参数,静态导入(导入到方法级别:方法必须静态)...
增强for:是在集合/数组中存储的引用类型中使用居多,代替集合迭代器的,简化书写代码
格式:
for(集合中存储的数据类型 变量名 : 集合对象){
使用这个变量名即可;
}
注意:
要使用增强for遍历集合,集合对象不能null;
防止空指针异常,在使用增强for之前,对集合进行非空判断!
set接口
Set接口特点:
无序(存储和取出不一致),不能保证迭代次序,但是可以唯一!
HashSet<E> : 存储和取出,保证元素唯一!
---底层是HashMap实例(哈希表)
TreeSet<E> : 存储和取出,同时需要进行排序的取出!
---底层是依赖TreeMap实例(红黑树结构)
TreeSet<E>有两种排序方式
* 自然排序:
* public TreeSet():使用自然排序,当前里面存储的类型必须实现Comparable
* 比较器排序