集合_3

来源:互联网 发布:linux系统如何重启 编辑:程序博客网 时间:2024/05/20 08:01

集合的toString()方法源码解析:

代码:

Collection c = new ArrayList();

c.add("hello");

c.add("world");

c.add("java");

System.out.println(c);

为什么c输出的不是地址值呢?

A:Collection c = new ArrayList();

这是多态,所以输出c的toString()方法,其实是输出ArrayList的toString()

B:看ArrayList的toString()

而我们在ArrayList里面却没有发现toString()。

以后遇到这种情况,也不要担心,你认为有,它却没有,就应该去它父亲里面看看。

C:toString()的方法源码

public String toString() {

       Iterator<E> it = iterator(); //集合本身调用迭代器方法,得到集合迭代器

       if (! it.hasNext())

           return "[]";

       StringBuilder sb = new StringBuilder();

       sb.append('[');

       for (;;) {

           E e = it.next(); //e=hello,world,java

           sb.append(e == this ? "(this Collection)" : e);

           if (! it.hasNext())

           //[hello, world, java]

               return sb.append(']').toString();

           sb.append(',').append(' ');

       }

   }


1:登录注册案例(理解)


分析:

需求:用户登录注册案例。


按照如下的操作,可以让我们更符号面向对象思想

A:有哪些类呢?

B:每个类有哪些东西呢?

C:类与类之间的关系是什么呢?

分析:

A:有哪些类呢?

用户类

测试类

B:每个类有哪些东西呢?

用户类:

成员变量:用户名,密码

构造方法:无参构造

成员方法:getXxx()/setXxx()

      登录,注册

      

假如用户类的内容比较对,将来维护起来就比较麻烦,为了更清晰的分类,我们就把用户又划分成了两类

用户基本描述类

成员变量:用户名,密码

构造方法:无参构造

成员方法:getXxx()/setXxx()

用户操作类

登录,注册

测试类:

main方法。

C:类与类之间的关系是什么呢?

在测试类中创建用户操作类和用户基本描述类的对象,并使用其功能。

分包:

A:功能划分

B:模块划分

C:先按模块划分,再按功能划分

今天我们选择按照功能划分:

用户基本描述类包 cn.itcast.pojo

用户操作接口 cn.itcast.dao

用户操作类包 cn.itcast.dao.impl

今天是集合实现,过几天是IO实现,再过几天是GUI实现,就业班我们就是数据库实现

用户测试类 cn.itcast.test



2:Set集合(理解)

(1)Set集合的特点

无序,唯一

(2)HashSet集合(掌握)

A:底层数据结构是哈希表(是一个元素为链表的数组)


B:哈希表底层依赖两个方法:hashCode()和equals()

 执行顺序:

首先比较哈希值是否相同

    相同:继续执行equals()方法

        返回true:元素重复了,不添加

        返回false:直接把元素添加到集合

    不同:就直接把元素添加到集合


C:如何保证元素唯一性的呢?

由hashCode()和equals()保证的


D:开发的时候,代码非常的简单,自动生成即可。


E:HashSet存储字符串并遍历


F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)


(3)TreeSet集合

A:底层数据结构是红黑树(是一个自平衡的二叉树)


B:保证元素的排序方式

a:自然排序(元素具备比较性)

让元素所属的类实现Comparable接口

b:比较器排序(集合具备比较性)

让集合构造方法接收Comparator的实现类对象


C:把我们讲过的代码看一遍即可


(4)案例:

A:获取无重复的随机数

import java.util.HashSet;import java.util.Random;public class Test10 {public static void main(String[] args) {//自动去除重复项HashSet<Integer> hs = new HashSet<>();Random r=new Random();while (hs.size() < 10) {int n = r.nextInt(20)+1;hs.add(n);}for (Integer m : hs) {System.out.println(m);}}}


B:键盘录入学生按照总分从高到底输出



3:Collection集合总结(掌握)

Collection

|--List有序,可重复

|--ArrayList

底层数据结构是数组,查询快,增删慢。

线程不安全,效率高

|--Vector

底层数据结构是数组,查询快,增删慢。

线程安全,效率低

|--LinkedList

底层数据结构是链表,查询慢,增删快。

线程不安全,效率高

|--Set无序,唯一

|--HashSet

底层数据结构是哈希表。

如何保证元素唯一性的呢?

依赖两个方法:hashCode()和equals()

开发中自动生成这两个方法即可

|--LinkedHashSet

底层数据结构是链表和哈希表

由链表保证元素有序

由哈希表保证元素唯一

|--TreeSet

底层数据结构是红黑树。

如何保证元素排序的呢?

自然排序

比较器排序

如何保证元素唯一性的呢?

根据比较的返回值是否是0来决定

4:针对Collection集合我们到底使用谁呢?(掌握)

唯一吗?

是:Set

排序吗?

是:TreeSet

否:HashSet

如果你知道是Set,但是不知道是哪个Set,就用HashSet。

否:List

要安全吗?

是:Vector

否:ArrayList或者LinkedList

查询多:ArrayList

增删多:LinkedList

如果你知道是List,但是不知道是哪个List,就用ArrayList。

如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。

如果你知道用集合,就用ArrayList。

5:在集合中常见的数据结构(掌握)

ArrayXxx:底层数据结构是数组,查询快,增删慢

LinkedXxx:底层数据结构是链表,查询慢,增删快

HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()

TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

0 0
原创粉丝点击