[知了堂学习笔记]_集合接口list与集合接口set的区别

  • 在Java中 除了 Map以外的集合的根接口都是Collection接口,而在Collection接口的子接口中,最重要的莫过于List和Set集合接口。

  今天我们就来谈谈List集合接口与Set集合接口的差异性。

  • 查看List集合接口的接口方法

  

  

  • 查看Set集合接口的API

  

  • 从两者的API中,以add和get为例来看,
  • List中提供索引的方式来添加元素和获取元素,而Set并不提供。由此可见List集合可是达到精确的存储和获取,而Set只能一个一个的比较,显然效率和实用性是比不上List集合的
  • List集合是有序存储,Set集合是无序存储。这里的有序和无序针对的是存储地址来说的。
  • List可以存储重复的值,Set不可以存储重复的值

  我们看下面的例子

/***向List集合里面添加一百个随机数*/@Test
    public void listTest() {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Random random = new Random();
            list.add(random.nextInt(101));
        }

        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()) {
            System.out.print(iterator.next().toString()+"  ");
        }
        System.out.println("list 的大小="+list.size());
    }
输出结果是:58  30  16  71  84  89  86  19  52  15  80  10  2  53  62  96  47  100  54  83  91  68  43  39  23  11  52  ...      其中 值为52的重复出现list的大小 = 100      遍历了一百次,每一次的值都放到了List集合里面。

  

    /**
     * 向Set集合里面添加一百个随机数
     */
    @Test
    public void setTest() {

        Set<Object> set = new HashSet<>();

        for (int i = 0; i < 100; i++) {
            Random random = new Random();
            set.add(random.nextInt(101));
        }

        Iterator<Object> iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.print("   "+iterator.next());
        }
        System.out.println();
        System.out.println("set的大小="+set.size());
    }
 输出结果:0   1   2   5   6   7   8   9   10   12   13   14   15   16   18   19   21   23   24   26   27   28   30   31   ...
     发现set集合里面并没有重复的值 
 set的大小=66;     我们本来是遍历了一百次,但是set的集合的大小只有66次。因为产生的随机数有重复的,这也证明了set集合里面不能储存重复的值。
认真观察,你会发现set集合里面遍历出来的值是有序的(从小到大),而List结合遍历出来的值是无序的。但是怎么说Set结合是无序集合而List结合是有序集合呢。 因为我们说的有序和无序针对的是集合存储地址来说的。在一百次循环中,获取什么值,就往List所获取的地址中存储,从低位到到位,比如:第一个是99,99就存储在第一位,第二位是2,就存储在第二位...以此类推而对于Set集合来说,由于我们是通过HashSet的初始化它的,所以的存储方式与HashSet存储方式有关,都是根据Hash码来存储的。例如:获取的值是88,那它就把这个值存储在Hash码为88的地址,如果是9,就把这个值存储在Hash码为9的地址,而遍历的时候,Set是根据Hash码的大小来遍历的,所以呈现出来的就是有序的效果。但是在底层存储的时候它是乱序的。

以上为今天的所有分享,如需了解更加深入的知识,

    请大家进入知了堂社区:http://www.zhiliaotang.com/portal.php;

    转载请注明出处;
    请大家多多指教!欢迎提意见,非诚勿扰!!!
                     ---By GET_CHEN

时间: 2024-10-12 20:44:13

[知了堂学习笔记]_集合接口list与集合接口set的区别的相关文章

[知了堂学习笔记]_初始化顺序

在我们每次new一个对象的时候,对象都会被初始化,但是他们初始化的顺序又是怎样呢?现在我以存在继承与不存在继承的代码给大家演示. 一.对于没有继承的初始化的顺序(静态变量,静态块.构造函数.变量) package test; //没有继承情况下的代码 public class test5 { //静态变量 private static String st="静态变量"; //静态块 static{ System.out.println(st); System.out.println(&

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第3讲(逻辑方法的实现)

整体展示: 上一讲实现了诸多对象,这次我们就需要实现许多逻辑方法,如控制飞机移动,判断子弹击中敌机,敌机与英雄飞机相撞等等.并且我们在实现这些功能的时候需要计时器去调用这些方法.setInterval(fun,ms) 在调用setInterval()会返回一个类似id的字段,该字段在clearInterval(id)可以指定相应的计时器并清除 一.开始游戏 /** * 面板441*632 * 飞机 66*80 */ /** * 开始游戏 */ function startGame() { var

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)

整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能进行基本操作了. 敌机对象的实现,并且初步完成了boos出现(30s自动出现).然后又引出了许多方法的处理,如英雄子弹击中敌机和boos,英雄与敌机相撞等等.并一一解决. 随后又设置了一些游戏的参数,如血量,关卡数,等级,积分,必杀,道具对象等等. 最后又完成了一些辅助功能,暂停游戏,继续游戏,退出

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)

一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面的宽度和高度要一致): HTML代码: <!--main div是游戏界面的大DIV --> <div id="main" style="height: 643px;"> <!--玩家头像DIV--> <div id="

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)

一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3.点击暂停,弹出具有透明度的暂停界面 4.点击暂停界面的开始按钮,隐藏暂停界面,调用开始方法(点击登录跳转的方法): 5.点击暂停界面的退出游戏,只显示登录界面,隐藏其他界面: 6.游戏结束界面,该界面的跳转目前还不能通过游戏实现,可以先建设(根据上一讲的游戏界面图片制作). 7.点击游戏结束界面的开

[知了堂学习笔记]_牵线Eclipse和Tomcat第二篇 —— 安装Tomcat&amp;&amp;添加Tomcat到Eclipse

来了来了~~~~~我们的"织女"--Tomcat来了,牛郎们等急了吧!哈哈! 一.安装Tomcat 下载地址:http://tomcat.apache.org/download-70.cgi 左侧:选择的是Tomcat的版本,这里以Tomcat 7为例. 右边可以选择不同的安装版本,红框部分是windows的zip安装版本, 选择和自己jdk位数一样的位数,进行下载就行了. 安装Tomcat 那就很简单了解压就行了,解压后如下图: 解压后选择 bin目录下面的->startup.

【知了堂学习笔记】java 接口与抽象类

本次主角:抽象类 .接口. 对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题不能理解清楚,然后就去查阅资料对抽象类与接口做了一些总结. 1.抽象类: 抽象类的建立,实在抽象方法之后的,所以想要了解抽象类得先了解抽象方法,抽象方法由名字可以知道它是一种特殊的方法,是抽象的,只有方法的声明,没有具体的实现.所以不能看到它的功能,表现得就很抽象. 抽象方法必须要用abstract

【知了堂学习笔记】java中常用集合的理解

最近学习了java中常用集合类的一些知识,在这里作为一只小白,我来谈谈我的理解,顺带总结知识点. 引入:在没有接触之前,听到集合,给我感觉是想到了数学中的集合一样,里面存放着一个一个的元素.其实不然,这个集合也就差不多,是用来存放元素的容器. Java中的集合类包含的内容很多而且很重要,很多数据的存储和处理(排序,去重,筛选等)都需要通过集合类来完成. 今天我要谈的主要是,如下图所示: 1.Collection Collection是最基本的集合类型,若要检查Collection中的元素,可以使

【知了堂学习笔记】Eclipse,Myeclipse连接MySQL数据库和Oracle数据库

一.连接MySQL数据库 1.由于Eclipse,Myeclipse都没有连接MySQL数据的架包,我们需要自行下载MySQL连接架包 mysql-connector(官方链接:http://dev.mysql.com/downloads/connector/j/5.0.html),下载版本最好是最新版. 2.下载好后,复制到你的项目里任何位置,然后右键架包选择 Build path -> add to Build path,然后点击项目的Libraries里的Referenced Librar