Java 学习总结
学习Java的第五周,本周主要的学习内容为三个常用类、集合。
点击查看思维导图
常用类
一、Object类:
-
概念:
I. 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
II. 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
III. Object类中所定义的方法,是所有对象都具备的方法。
IV. Object类型可以存储任何对象:
1). 作为参数,可接受任何对象。
2). 作为返回值,可返回任何对象。 -
常用方法:
-
public final Class<?> getClass(){}
返回引用中存储的实际对象类型。
应用:通常用于判断两个引用中实际存储对象类型是否一致。 -
public int hashCode(){}
一个对象的整数表现形式(整数型的名字)。
返回该对象的十进制的哈希码值。
哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值。
哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码。 -
public String toString(){}
返回该对象的字符串表示(表现形式)。
可以根据程序需求覆盖该方法,如:展示对象各个属性值。 -
public boolean equals(Object obj){}
默认实现为(this == obj),比较两个对象地址是否相同。
可进行覆盖,比较两个对象的内容是否相同。覆盖equals的顺序:
1). 比较两个引用是否指向同一个对象。
2). 判断obj是否为null。
3). 判断两个引用指向的实际对象类型是否一致。
4). 强制类型转换。
5). 依次比较各个属性值是否相同。 -
protected void finalize() throws Throwable //了解(面试题中可能有坑)
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
垃圾对象:没有有效引用指向此对象时,为垃圾对象。
垃圾回收: 由GC销毁垃圾对象,释放数据存储空间。
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
手动回收机制:使用System.gc(); 通知JVM执行垃圾回收。
二、包装类:
-
概念:
I. 基本类型所对应的引用类型
II. Object可统一所有数据,包装类的默认值为null
III. 包装类中实际上就是持有了一个基本类型的属性,作为数据的存储空间(Byte中有一个byte属性),还提供了常用的转型方法,以及常量,
既可以存储值,又具备了一系列的转型方法和常用常量,比直接使用基本类型的功能更强大。
IV. 包装类型中提供了若干转型的方法,可以让自身类型与其他包装类型、基本类型、字符串相互之间进行转换。 -
转型方法:
-
8种包装类型中,有6种是数字型(Byte、Short、Integer、Long、Float、Double),继承自java.lang.Number父类。
-
java.lang.Number父类为所有子类分别提供了6个转型的方法,将自身类型转换成其他数字型。
byteValue();
shortValue();
intValue();
longValue();
floatValue();
doubleValue(); -
parseXXX(String s) 静态转型方法,7种包装类型都有,除了Character,都可以通过String进行构建
parseByte(“123”);
parseShort(“123”);
parseInt(“123”);
parseDouble(“123.45”);
… -
valueOf(基本类型)、valueOf(字符串类型),静态转型方法,8种包装类型都有
Byte b1 = Byte.valueOf( (byte)10 );
Byte b2 = Byte.valueOf( “20” );注意:
-
在使用字符串构建包装类型对象时,要保证类型的兼容,否则产生NumberFormatException。
-
JDK5之后,提供自动装箱、拆箱,简化使用包装类的编程过程
Byte b4 = 40;//自动装箱,将基本类型直接赋值给包装类型,调用valueOf(byte b)
byte b5 = b4;//自动拆箱,将包装类型的值,直接赋值给基本类型,调用byteValue() -
自动装箱时,会调用valueOf方法,Byte、Short、Integer、Long,四种整数包装类型都提供了对应的cache缓冲区,将常用的256个数字提 前创建对象并保存在数组中,实现复用。即在区间的复用已有对象,在区间外创建新对象。
-
三、String:
-
概念:
I. 字符串是常量,创建之后不可改变。
II. 字符串字面值存储在字符串池中,可以共享。
III. String s = “Hello”; 产生一个对象,保存在池中
IV. String s2 = new String(“World”); 产生两个对象,池、堆各一个 -
常用方法:参考API文档
集合
-
Collection体系集合:
I. Collection父接口:该体系结构的根接口,代表一组对象,称为“集合”,每个对象都是该集合的“元素”。
II. List接口的特点:有序、有下标、元素可重复。
III. Set接口的特点:无序、无下标、元素不可重复。 -
List子接口:
I. 特点:有序、有下标、元素可以重复。
II. 继承可父接口提供的共性方法,同时定义了一些独有的与下标相关的操作方法。 -
List实现类:
I. JDK8的ArrayList,实际初始长度是0
II. 首次添加元素时,需要实际分配数组空间,执行数组扩容操作
III. 真正向数组中插入数据,(Lazy懒)用的时候再创建,或再加载,有效的降低无用内存的占用 -
ArrayList:
I. 数组结构存储,查询快,增删慢。//注册(1次)-> 查询(N次)
II. JDK 1.2发布,执行效率快,线程不安全。 -
Vector:
I. 数组结构存储,查询快,增删慢。
II. JDK 1.0发布,执行效率慢,线程安全。 -
LinkedList:
I. 链表(链接列表)结构存储,查询慢、增删快。
II. 了解:Queue接口:队列、双端队列
III. 了解:栈结构Last In First Out(后进先出)
IV. 了解:队列结构First In First Out(先进先出) -
泛型集合【重点-解决应用问题】:
I. 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。
II. 特点:
1). 编译时即可检查,而非运行时抛出异常。
2). 访问时,不必类型转换(拆箱)。
3). 不同泛型之间引用不能相互赋值,泛型不存在多态。 -
泛型:高级类别的知识,熟练应用,需要时间、经验的积累(常用名称:E = Element / T = Type / K = Key / V = Value)
I. 概念:约束-规范类型
II. 泛型的场景:
A). 实例泛型:
a). 类:创建对象时,为类所定义的泛型,进行参数化赋值
b). 接口:实现接口时,为接口所定义的泛型,进行参数化赋值
B). 静态泛型:
a). 定义在方法的返回值类型前面:、、<T extends Comparable>、<T extends Comparable<? super T>> 可应用在形参列表、返回值两种场景上,不单单可以规范泛型,还可以语义化返回值。
b). 定义在方法的形参列表当中:<?>、<? extends Object>、<? super Integer>,不支持使用& 只能应用在形参列表上,规范泛型。 -
Collections工具类:
概念:集合工具类,定义了除了存取以外的集合常用方法。
I. public static <T extends Comparable<? super T>> void sort(List list) //排序,要求:必须实现Comparable,必须可与自身类型比,以及父类类型比
II. public static void reverse(List<?> list) //反转、倒置元素
III. public static void shuffle(List<?> list) //随机重置顺序
经验:一级目标能看懂、能调用,二级目标能定义、能设计
-
Set子接口:
I. 特点:无序、无下标、元素不可重复(当插入新元素时,如果新元素与已有元素进行equals比较,结果为true时,则拒绝新元素的插入)
II. 方法:全部继承自Collection中的方法 -
foreach循环:
for(数据类型 变量名 : 容器名称){ //可遍历集合或数组(常用在无序集合上)
} -
Set接口实现类:
- I. HashSet【重要】:
1). HashSet的底层使用的HashMap类,即是将所有需要存入HashSet的值,直接保存在HashMap中
2). HashSet如何去掉重复?
3). 先判断hashCode是否一致,==比较地址,equals比较内容 - II. LinkedHashSet【了解】:
1). 底层使用LinkedHashMap(链表结构)存储,节点形式单独存储数据,并可以指向下一个节点,通过顺序访问节点,可保留元素插入顺序 - III. TreeSet【了解】:
1). 实现了SortedSet接口,要求必须可以对元素排序。
2). 所有插入元素,必须实现Comparable接口,覆盖compareTo方法。
3). 根据compareTo方法返回0作为去重的依据,(意味重复)
- Map体系集合:
I. 概念:存储一对数据(Key-value),无序、无下标、键不可重复、值可以重复。
II. HashMap算法:拿到任何一个对象好,通过hash(key)做运算,key>>>16(除以16),只可能得到0~15之间的一个数组,作为插入数组的下标
III. Hashtable:HashMap的线程安全版本
IV. TreeMap:自动对key做排序,根据compareTo的返回值去重
V. Properties:Hashtable 子类,主要用于存储key和value都是字符串的情况,常在读取配置文件之后,保存文件中的键值对。反射、JDBC
学习java的第五周,内容越来越深入,难度也逐渐提升。大堆的内容涌入,一时是难以消化的,解决方法,一个是放平心态,有些内容是需要经验才可以融会贯通的,目前只需要会使用就可以,不需要深究;另一个是多加练习,“代码是敲出来的”,练习永远是理解与与记忆的最佳方法,每天不间断的敲代码练习是十分重要且有效的。要对自己有信心,坚持就是胜利。
长风破浪会有时,直挂云帆济沧海