黑马程序员——第八篇-可变参数、set集合、HashSet、TreeSet

  ------- <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()方法返回falseSet判断两个对象是否相等用equals,而不是使用==。也就是说两个对象equals比较返回trueSet集合是不会接受这个两个对象的。

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协定

 

但是重写equalshashcode方法后可以不一样

程序Demo

 

   3.哈希表结构

     A:是一个数组和链表的组合形式

     B:具有数组和链表(单向链表)的共同特性

 

     C:哈希表存储对象,依赖对象自己的hashCode方法和equals方法

 

     D:哈希表如何保证对象唯一性,依赖对象自己的hashCode方法和equals方法

        凡是自己定义的对象(Student,Person)有肯能被存储到哈希表中,

        应该重写hashCode equals方法

 

     EJava中的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类型

 

  BComparable接口,对象的自然顺序, Person对象没有顺序,集合不能排序

 

  Cpublic 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集合获取101-20随机数

    分析:和List练习是一样的,区别,Set集合本质就不存储重复元素

不需要进行contains的判断

  程序Demo

 

  B. 键盘输入5个学生信息,排序

    学生信息,姓名,数学成绩,语文成绩,英语成绩

    4个信息,使用空格分开

 

    按照总成绩排序,如果总成绩相同,按照姓名排序

 

自定义比较器,总成绩的比较

程序Demo

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值