------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a
href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
一、可变参数
1:从
java5开始出现了可变参数,这是对
java方法及数组的拓展!
方法中可以接受的参数不再是固定个数的,而是随着具体需求传递的多少来决定。
2:定义格式:返回值类型 方法名(参数类型 ...形式参数){ }
可变参数的特点:
A、只能出现在参数列表的最后;
B、位于变量类型和变量名之间,前后有无空格都可以;
C、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
3、可变参数使用前提
方法的参数类型已知,参数的个数未知
就可以使用可变参数
4、可变参数方法的调用
和普通形式参数,没有什么区别
传递参数:
如果什么都不传递,可变参数的这个数组的长度是0
如果传递参数了,传递的个数,就是数组的长度
5、可变参数定义注意事项
方法中,可变参数只能写1个,不能出现多个可变参数
方法中,可变参数必须写在参数列表的最后位置上
程序Demo:
二、数组集合互转
1. 集合转成数组
Collection接口定义方法toArray()
Object[]toArray():把集合转成一个数组,所有集合元素编程数组元素。
A、调用者:谁可以调用这个方法:对象,类名。对象调用,接口实现类对象调用。
B、传递参数,传递数组
C、返回值,返回数组
2.数组转成集合
public static List asList(Object... a)返回一个受指定数组支持的固定大小的列表(返回的是不可变的List(长度固定))。
A、静态,直接类名调用,传递数组,返回List集合
B、数组转成集合后,不能修改集合的长度
C、如果定义的数组是基本类型,写成包装类的类型
程序DEMO:
三、List练习
1.获取10个,1-20之间不重复随机数
获取随机数的功能
Random类 ,nextInt(20)+1
获取随机数,存储到集合中,
存储之前,判断集合中有没有这个数,有了就不存,
如果没有就存储
循环是死的,什么时候集合长度=10就结束
程序Demo:
2.键盘输入数据,0结束,控制输出最大值
键盘输入,nextInt
输入的数据,存储到集合中
如果输入的是0,将数据最大值输出
集合转成数组,数组排序,输出最后一个索引
程序Demo:
4. Set接口
1.Set集合派系特点:
A: 不包含重复元素
B: Set集合没有索引
2.Set接口抽象方法,和父接口Collection方法全一样
3. 当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。Set判断两个对象是否相等用equals,而不是使用==。也就是说两个对象equals比较返回true,Set集合是不会接受这个两个对象的。
4. 常用子类:
HashSet:散列存放
TreeSet:有序存放
5. HashSet集合
1.HashSet集合自身特性
A:底层数据结构哈希表
B:无序集合,存储和取出的顺序不同
C:是线程不安全集合,运行速度快
D:存储取速度都快
2.对象哈希值
A:顶层Object类,定义方法
public native int hashCode();
本地方法,是C++编写,计算结果,就是一个int类型整数
整数:哈希值
B:任何一个类,都是Object类的子类,任何一个类都具有哈希值
输出的时候,不是地址,对象的哈希值(普通的十进制数)
C:结论:
哈希值,就是一个普通的十进制数,是JVM提供
不喜欢,可以自己定义一个十进制数,作为哈希值
重写hashCode方法
D:练习题
如果两个对象:
两个对象哈希值相同,euqals方法一定返回true吗不一定
程序Demo:
两个对象的equals方法返回true,两个对象的哈希值一样吗
x.equals(y)==true
x.hashCode() y.hashCode();必须一样
原因: Sun公司的官方协定,hashCode协定
但是重写equals和hashcode方法后可以不一样
程序Demo:
3.哈希表结构
A:是一个数组和链表的组合形式
B:具有数组和链表(单向链表)的共同特性
C:哈希表存储对象,依赖对象自己的hashCode方法和equals方法
D:哈希表如何保证对象唯一性,依赖对象自己的hashCode方法和equals方法
凡是自己定义的对象(Student,Person)有肯能被存储到哈希表中,
应该重写hashCode equals方法
E:Java中的8种基本数据类型包装类,以及String类都重写了hashCode equals 包装集合中的唯一性。
5. LinkedHashSet集合
1. LinkedHashSet集合自身特性
A:继承HashSet
B:线程不安全集合,运行速度快
C:底层数据结构哈希表,双向链表
D:有序集合,存储和取出的顺序是一样的
2. 开始版本JDK1.4
3. 程序Demo
6. TreeSet集合
1.TreeSet集合自身特性
底层数据结构红黑树(red-black-tree)
存储到红黑树中的对象,会进行排序
线程不安全集合,运行速度快
2. 存储自定义对象Person
A:发生异常
Exception in thread "main" java.lang.ClassCastException:cn.itcast.beans.Person cannot be cast to java.lang.Comparable
Person类,不能被转换成java.lang.Comparable类型
B:Comparable接口,对象的自然顺序, Person对象没有顺序,集合不能排序
C:public class String extends Object implements Comparable接口
重写接口抽象方法 compareTo(String s)
需要字符串对象调用compareTo方法,传递字符串
D:调用者,小于参数,结果负数
调用者,大于参数,结果正数
调用者,等于参数,结果是0
"abc".compareTo("bbc")=负数
"abc".compareTo("aba")=正数
"abc".compareTo("abc")= 0
TreeSet存储对象并排序,依靠对象的自然顺序compareTo体现
3. 利用比较器进行排序
java.util.Comparator接口,比较器
抽象方法 int compare()
TreeSet集合构造方法中,可以传递Comparator接口的实现类对象
集合,就可以根据传递的比较器进行排序
如何定义比较器
定义类实现Comparator接口
重写抽象方法compare()
创建集合TreeSet的时候,比较器对象,传递到TreeSet构造方法
7. Set集合练习
A. Set集合获取10个1-20随机数
分析:和List练习是一样的,区别,Set集合本质就不存储重复元素
不需要进行contains的判断
程序Demo:
B. 键盘输入5个学生信息,排序
学生信息,姓名,数学成绩,语文成绩,英语成绩
4个信息,使用空格分开
按照总成绩排序,如果总成绩相同,按照姓名排序
自定义比较器,总成绩的比较
程序Demo: