#在千锋“逆战”学习第25天#周总结+Question10

周总结
finalize方法
当对象被判定为垃圾对象时,有JVM自动调用此方法,用以标记垃圾对象,进入回收队列。

垃圾对象:没有有效引用指向此对象时,为垃圾对象。

垃圾回收:由GC销毁垃圾对象,释放数据存储空间。

自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象。

手动回收机制:使用System.gc();通知JVM进行垃圾回收。

包装类

什么是包装类?
基本数据类型所对应的引用数据类型 如下图
在这里插入图片描述
注意:Object类可统一所有数据,包装类的默认值是null。

类型的转换与拆箱、装箱
8种包装类提供不同类型间的转换方式
Number父类提供6个共性方法 将自身类型转化成其他数字类型

String类
字符串是常量,创建之后不可改变
字符串字面值存储再字符串值当中,可以共享
String s = “Hello”;产生一个对象,字符串池中存储
String s = new String(“Hello”);产生两个对象,堆、池中各产生一个

常用方法
public char charAt(int index):根据下标获取字符
public boolean contains(String str):判断当前字符串中是否含有str
public char[] toCharArray():将字符串转化为数组
public int indexOf(String str):查找str首次出现的下标,存在,则返回该下标;不存在则返回-1
public int lastIndexOf(String str):查找str在当前字符串中最后一次出现的下标索引
public int length():返回字符串的长度
public String trim():去掉字符串前后的空格,注意中间的空格不会去掉
public String toUpperCase():将小写转化为大写
public String toLowerCase():将大写转化为小写
public boolean endWith(String str):判断字符串是否以str结尾
public String replace(char oldChar,char newChar):将旧字符替换为新字符串。(替换内容为字符串也可以)
public String[] split(String str):根据str来做拆分,作为拆分的str不会再出现在返回的String数组里面,所以注意不可以用有用内容来做拆分。

可变字符串
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全。

StringBuilder:可变长字符串,JDK5.0提供,运行效率快,线程不安全。
中间变量的JDK优化,自动创建一个StringBuilder缓冲区,在块空间添加。

BigDecimal
很多实际应用中需要精确计算,而double是近似值存储,不在符合要求,需要借助BigDecimal。

位置:java.math包中
作用:精确计算浮点数
创建方式:BigDecimal bd = new BigDecmal(“1.0”);

方法:
BigDecimal add(Bigdecimal bd) 加
BigDecimal subtract(Bigdecimal bd) 减
BigDecimal multiply(Bigdecimal bd) 乘
BigDecimal divide(Bigdecimal bd) 除
注意:如果不能准确的计算出结果时,除法需要再给两个参数,保留位数和取舍方法。通常采用四舍五入的方法,取值为BigDecimal.ROUND_HALF_UP
在这里插入图片描述

集合框架
什么是集合
概念:对象的容器,存储对象的对象,可代替数组
特点:容器的工具类,定义了对多个对象进行操作的常用方法
位置:java.util.*;

Collection体系集合
在这里插入图片描述

Collection父接口
特点:代表一组任意类型的对象,无序、无下标。

方法:
boolean add(Object obj)//添加一个对象
boolean addAll(Collection c)//将一个集合中所有对象添加到这个集合中
void clear()//清空此集合中所有对象
boolean contains(Object o)//检查此集合中是否包含o对象
boolean equals(Object o)//比较此集合是否与指定对象相等
boolean isEmpty()//判断此集合是否为空
boolean remove(Object o)//在此集合移除o对象
int size()//返回此集合中的元素个数
Object[] toArray()//将此集合转换为数组

List接口
特点:有序,有下标,元素可以重复

方法:
void add(int index,object o)//在指定位置插入对象o
boolean addAll(int index,Collection c)//将一个集合中的元素添加到此集合的index位置
Object get(int index)//返回集合中指定位置的元素
List subList(int fromIndex,int toIndex)//返回fromIndex和toIndex之间的集合元素。

List实现类

ArrayList
数组结构实现,查询快,增删慢
JDK1.2版本,运行效率快,线程不安全

Vector
数组结构实现,查询快,增删慢
JDK1.0版本,运行效率慢,线程安全

LinkedList
链表结构实现,增删快,查询慢

在这里插入图片描述

泛型集合
概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。

特点:
1). 编译时即可检查,而非运行时抛出异常。
2). 访问时,不必类型转换(拆箱)。
3). 不同泛型之间引用不能相互赋值,泛型不存在多态。

泛型
(常用名称:E = Element / T = Type / K = Key / V = Value)
I. 概念:约束-规范类型
II. 泛型的场景:
1). 定义泛型:
实例泛型:
a). 类:创建对象时,为类所定义的泛型,进行参数化赋值
b). 接口:实现接口时,为接口所定义的泛型,进行参数化赋值

静态泛型:
a).定义在方法的返回值类型前面 :< T extends Object>、<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) //随机重置顺序

foreach循环:
for(数据类型 变量名 : 容器名称){ //可遍历集合或数组(常用在无序集合上)
}

Set子接口:
I. 特点:无序、无下标、元素不可重复(当插入新元素时,如果新元素与已有元素进行equals比较,结果为true时,则拒绝新元素的插入)
II. 方法:全部继承自Collection中的方法

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. 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

------------------------------------------------------------作业分割线

  1. (Set,List)
import java.util.*;
public class TestListSet{
public static void main(String args[]){
List<String> list = new ArrayList<String>();
list.add(“Hello”);
list.add(“Learn”);
list.add(“Hello”);
list.add(“Welcome”);
Set<String> set = new HashSet<String>();
set.addAll(list);
System.out.println(set.size());
}
}

选择正确答案
A. 编译不通过
B. 编译通过,运行时异常
C. 编译运行都正常,输出 3
D. 编译运行都正常,输出 4

答案:C
List元素可重复,Set元素不可重复

  1. (Set,Hash 算法)为上一题的 Worker 类,在添加完 equals 方法的基础上,添加一个 hashCode 方法。
    public int hashCode(){
    //1
    }
    有几种写法:
    I. return 0;
    II. int result = 0;
    if (name != null) result = name.hashCode();
    return result + age;
    III. return super.hashCode();
    现在要把 Worker 类放入 HashSet 中,并希望在 HashSet 中没有重复元素,则下 面说法正确的是:
    A. 三种写法都正确b
    B. I、II 写法正确,II 的效率更高
    C. II 写法正确,I、III 写法都不正确

答案:B

  1. (Set,Hash 算法,方法覆盖)代码改错
import java.util.*;
class Worker{
String name;
int age;
double salary;
public Worker(){}
public Worker(String name, int age, double salary){
this.name = name;
this.age = age;
this.salary = salary;
}
int hashCode(){
return name.hashCode() + age + salary;
}
public boolean equals(Worker w){
if (w.name == name && w.salary == salary && w.age == age){
return true;
}else{
return false;
} } }
public class TestWorker{
public static void main(String args[]){
Set<Worker> set = new HashSet<Worker>();
set.add(new Worker(“tom”, 18, 2000));
set.add(new Worker(“tom”, 18, 2000));
set.add(0, new Worker(“jerry”, 18, 2000));
System.out.println(set.size());
} }

答案:
在这里插入图片描述
salary是double类型数据,返回值类型需要做强转。覆盖hashCode方法修饰符应与父类一样或更宽泛,所以前面加public

set是无序类型,没有下标,所以不能指定下标插入对象,jerry对象把0去掉。

  1. (Set,Hash 算法)在前面的 Worker 类基础上,为 Worker 类增加相应的方法,使得 Worker 放入
    HashSet 中时,Set 中没有重复元素。并编写相应的测试代码。
    在这里插入图片描述

  2. (Map)关于下列 Map 接口中常见的方法:
    I. put 方法表示放入一个键值对,如果键已存在则___覆盖原值__,如果键不存在则___储存新值__。
    II. remove 方法接受___1__个参数,表示__移除该键的映射___。
    III. get 方法表示___返回指定键映射的值__,get 方法的参数表示__指定的键的值___,返回值表示___该键映射的值__。
    IV. 要想获得 Map 中所有的键,应该使用方法__Set___,该方法返回值类型为__Object___。
    V. 要想获得 Map 中所有的值,应该使用方法__valus();___,该方法返回值类型为__Object___。

  3. (Map)利用 Map,完成下面的功能:
    从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。
    如果该年没有举办世界杯,则输出:没有举办世界杯。
    附录:截止 2009 年,历届世界杯冠军、世界杯冠军以及对应的夺冠年份:
    在这里插入图片描述
    在这里插入图片描述

  4. (Map)已知某学校的教学课程内容安排如下:
    老师 课程
    Tom CoreJava
    John Oracle
    Susan Oracle
    Jerry JDBC
    Jim Unix
    Kevin JSP
    Lucy JSP
    完成下列要求:
    I. 使用 Map,以老师的名字作为键,教授的课程名作为值,表示上述课程安排。
    II. 增加了一位新老师 Allen 教 JDBC
    III. Lucy 改为教 CoreJava
    IV. 遍历 Map,输出所有的老师及老师教授的课程
    V. 利用 Map,输出所有教 JSP 的老师。
    在这里插入图片描述

  5. (Set,HashSet,空指针)有下面代码

import java.util.*;
class Student {
int age;
String name;
public Student(){}
public Student(String name, int age){
this.name = name;
this.age = age;
}
public int hashCode(){
return name.hashCode() + age;
}
public boolean equals(Object o){
if (o == null) return false;
if (o == this) return true;
if (o.getClass() != this.getClass()) return false;
Student stu = (Student) o;
if (stu.name.equals(name) && stu.age == age) return true;
else return false;
} }
public class TestHashSet{
public static void main(String args[]){
Set<Student> set = new HashSet<Student>();
Student stu1 = new Student();
Student stu2 = new Student(“Tom”, 18);
Student stu3 = new Student(“Tom”, 18);
set.add(stu1);
set.add(stu2);
set.add(stu3);
System.out.println(set.size());
} }

下列说法正确的是:
A. 编译错误
B. 编译正确,运行时异常
C. 编译运行都正确,输出结果为 3
D. 编译运行都正确,输出结果为 2

答案:B
stu1会空指针异常

  1. (Map)在原有世界杯 Map 的基础上,增加如下功能:
    读入一支球队的名字,输出该球队夺冠的年份列表。
    例如:
    I. 读入“巴西”,应当输出 1958、1962、1970、1994、2002
    II. 读入“荷兰”,应当输出”没有获得过世界杯”。
    在这里插入图片描述
    在这里插入图片描述

  2. (Map) 给定一个字符串,请输出该字符串由哪些字符组成,每个字符出现几次?
    在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章