当前位置: 首页 > news >正文

Java开发集合定义及案例详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

集合类的由来:


     JAVA是面向对象的,对象用来封装特有数据,对象多了就需要储存起来,当对象的个数不确定的时候,那么就用集合容器进行存储。

集合的特点:

  1.集合的长度是可变的
  2.用于存储对象的容器
  3.不可以存储基本数据类型


体系:

  集合容器因为内部的数据结构不同,有多种具体容器,不断的向上提取,形成了集合框架。

Collection接口:


  常见的方法
  1.增加

1  boolean add(Object obj)//添加一个对象
2  boolean addAll(Collection coll)//添加一个集合

  2.删除

1  boolean remove(Object Obj)//删除一个对象
2  boolean removeAll(Collection coll)删除集合中所有与coll相同的对象
3  void clear()清空

  3.判断

1  boolean contains(Object Obj)//判断一个对象是否存在
2  boolean containsAll(Collection coll)//判断集合中是否拥有coll总的所有对象
3  boolean isEmpty()//奇怪的很,没有元素返回true

  4.获取

int size()//获取对象的个数
Iterator iterator()//获取对象,下面的代码是这个方法的实现

 

 

Iterator接口


  对集合进行迭代迭代器
  这个接口是对所有的Collection容器进行元素获取的公共接口
  hasNext()如果next仍然有元素可以迭代,就返回true
  next()返回迭代的下一个元素

方法一:

1  Iterator it = coll.iterator();
2  while(it.hasNext()){
3  System.out.println(it.next());
4  }
   

方法二:节约空间,常用

1  for(Iterator it = coll.iterator();it.hasNext();){
2  System.out.println(it.next());
3  }

 

      这种迭代的获取与直接打印( print(coll) )的区别在于,打印的是一串字符串,而迭代取得是单独的对象,可以对他们单独处理


  5.其他

1  boolean retainAll(Collection coll)//取交集,删除与coll集合中不同的元素
2  Object  toArray()//将集合转成数组

 

List:


  1.有序(存入和取出顺序一致)
  2.元素都有索引(脚标)
  3.元素可以重复
常用子类:
  1.Vector:内部是数组数据结构,同步的,增删查询都很慢。(基本淘汰)
  2.ArrayList:内部是数组数据结构,不同步的,代替了Vector。查询很快
  3.LinkedList:内部是链表数据结构的,不同步的。增删很快

常见的方法:

  1.添加

1  void add(index,element)//在指定的位置插入对象
2  void add(index,collection)//在指定的位置插入集合

  2.删除

1  Object remove(index)//删除指定位置的对象,返回值为被删除的对象

  3.修改(只有List才具有增删改查,collection都不具备)

1  Object set(index,element)//返回值为被修改的对象,即修改前的对象

  4.获取

1  Object get(index)//返回值为获取的对象
2  List subList(from,to)//返回指定范围的对象<br>int indexOf(Object)//返回对象的位置,从头开始找<br>int lastIndexOf(Object)//返回对象的位置,

从尾开始找

list特有的取出元素的方法(只有list有set不具备):

1  for(int x=0;x<list.size();x++){
2  System.out.println(list.get(x));
3  }

 

ListIterator:


  1.Iterator的子接口
  2.可以实现在迭代过程中完成对元素的操作(增删改查)注意:只有List集合具备该迭代功能
如果有下面的代码(在迭代的过程中,增加元素)

 

1  Iterator it =list.iterator();
2  while(it.hasNext()){
3      Object obj=it.next();
4    if(obj=="b"){
5        list.add("e");
6      }else{
7          System.out.println(obj);
8      }
9  }

 

  这里会发生异常,原因是在迭代的过程中,操作集合,产生了并发。
解决问题:
  1.在迭代的时候不能操作集合,容易产生异常
  2.使用ListIterator接口来完成在迭代过程中对元素的更多的操作

 

1  ListIterator it = list.listIterator();//获取列表迭代器对象
2  while(it.hasNext()){
3        Object obj=it.next();
4      if(obj=="b"){
5          it.add("e");
6          System.out.println(obj);
7      }else{
8          System.out.println(obj);
9      }
10  }
11  while(it.hasPrevious()){//如果前一个任然有元素可以迭代,那么就返回true
12      System.out.println(it.previous());//返回前一个元素
13  }

 

Vector:
  Enumeration:
     1.这个接口淘汰了,基本不用
     2.这个接口的功能与Iterator接口的功能是重复来的
     3.Iterator接口添加了一个可选的移除操作,并且使用了较短的方法名。
     4.新的实现应该考虑优先使用Iterator接口而不是Eumeration接口
    elements:这个方法与List中的iterator方法有异曲同工之妙

 

1        Vector ve=new Vector();
2        ve.addElement("a");
3        ve.addElement("b");
4        ve.addElement("c");
5        Enumeration em=ve.elements();
6        while(em.hasMoreElements()){
7            System.out.println(em.nextElement());
8        }
9        Iterator it=ve.iterator();
10        while(it.hasNext()){
11            System.out.println(it.next());
12        }
13  //这两个方法的作用基本一样,但是前一种基本上是淘汰了

 

LinkedList:


  1.内部是链表数据结构,是不同步的,增删很快
   2.堆栈:先进后出
    队列:先进先出
  3.常用方法
    增加:
       boolean add( Collection<? extends E> c)//在结尾添加一个元素
      boolean addAll(int index, Collection<? extends E> c)//在指定位置插入一个集合
      void addFirst(E o)//在开头加入一个元素
       void addLast(E o)//在结尾加入一个元素
    删除:
       void clear()
       E remove()
    获取:
       E getFirst()
      E peek();
    修改:
      Object set(index,Objcet)


ArrayList:


下面的代码中的强转问题,可能会涉及到自动装箱问题,在这里也是可以使用的

 

1  ArrayList ar=new ArrayList();
2  Person a=new Person(19,"lao1");
3  Person b=new Person(16,"lao2");
4  Person c=new Person(11,"lao3");
5  ar.add(a);
6  ar.add(b);
7  ar.add(c);
8  for(Iterator it=ar.iterator();it.hasNext();){
9      //System.out.println(((Person)it.next()).getAge()+((Person)it.next()).getName());
10      //输出肯定是有问题的一直在next
11      //所以解决方法如下
12      Person d=(Person) it.next();//强转的原因是,在Aar.add()添加的时候,是使用Object接收的,所以person已经变成了上帝
13      System.out.println(d.getAge()+d.getName());
14  }

 

Set:


  1.Set接口中的方法和Collection一致
   2.Set获取元素的方法只有迭代器
   3.常用实现子类HashSet,TreeSet
  4.元素不可重复,无序(但是可以做到有限的有序)


HashSet:


   1.内部数据结构是哈希表,不同步
   2.如何保证该集合的元素唯一性呢?
    a.通过对象的hashCode和equals方法来完成对象的唯一性
     b.如果对象的hashCode值不同,那么不用判断equals方法,直接存储到嘻哈表中(int hashCode();boolean equals(Object obj))
     c.如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true,true则视为相同元素,不存。
     d.重点:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法;一般情况下如果定义的类会产生很多对象,比如人,学

                  生,书,通常都需要覆盖这两个方法,建立对象判断是否相同的依据。

     e.扩展:Arraylist(如果要确保元素唯一的话)判断的依据是equals,而HashSet判断hashcode和equals

LinkedHashSet:

  1.HashSet的直接已知实现子类
    2.可以在唯一的情况下排序,怎么进就怎么出

1        HashSet/LinkedHashSet ha=new LinkedHashSet();
2        ha.add("a");
3        ha.add("d");
4        ha.add("s");
5        for(Iterator it=ha.iterator();it.hasNext();){
6            System.out.println(it.next());
7        }
8    //所以需要有序唯一的话可以直接使用LinkedHashSet类

TreeSet

   1.可以对set集合中的元素排序。是不同步的
   2.判断元素唯一性的方式:就是根据比较方法返回结果是否为0,如果为0,就是相同元素,则不存储(所以要实现Comparable接口,覆盖compareTo方法元素和集合实现都可以;一般在做这一步的时候,也一起把排序给做了)
   3.排序的两种方法
    a.让元素自身具备比较功能
    b.让集合自身具备比较功能(1.如果不按照对象具备的自然顺序排序2.对象不具备自然顺序;这两种情况时使用该功能)
  4.比较器(即b)
     定义一个类实现Comparator接口,覆盖compare方法,将该类对象最为参数传递给TreeSet集合的构造函数

 

1  //比较器,按照名字
2  class ComparatorByName implements Comparator {
3          public int compare(Object o1, Object o2) {
4              Person p1 = (Person)o1;
5              Person p2 = (Person)o2;
6              int temp = p1.getName().compareTo(p2.getName());   
7           return temp==0?p1.getAge()-p2.getAge(): temp;
8          }
9  }
10  //比较器,按照年龄
11  class ComparatorByLength implements Comparator {
12      public int compare(Object o1, Object o2) {
13          Person s1 = (Person)o1;
14          Person s2 = (Person)o2;
15          int temp = s1.getAge()-s2.getAge();
16          return temp==0? s1.compareTo(s2): temp;
17      }
18  }
19          TreeSet tr=new TreeSet(new ComparatorByLength());//比较器的使用方法
20
21          Person a=new Person("lao3",11);

转载于:https://my.oschina.net/u/3980693/blog/2994490

相关文章:

  • nginx请求转发
  • csv文件的格式
  • tomcat环境变量的配置
  • 人工智能技术会逐渐淘汰掉哪些职业?
  • 多线程编程(四)--线程同步
  • P4389 付公主的背包
  • 通过反射将数据库数据输入到指定类
  • java 中类似于goto语句的语法
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • iOS网络-NSURLSession/AFNetworking发送HTTPS网络请求
  • 打印机连接常见故障
  • -----二叉树的遍历-------
  • Highcharts tooltip显示数量和百分比
  • Listen第二个参数的意义
  • 发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
  • 【Linux系统编程】快速查找errno错误码信息
  • gulp 教程
  • Joomla 2.x, 3.x useful code cheatsheet
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • markdown编辑器简评
  • React组件设计模式(一)
  • Vue2 SSR 的优化之旅
  • windows下mongoDB的环境配置
  • yii2中session跨域名的问题
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于遗传算法的优化问题求解
  • 如何合理的规划jvm性能调优
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 责任链模式的两种实现
  • #define用法
  • #if #elif #endif
  • ${ }的特别功能
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • .net Application的目录
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net 反编译_.net反编译的相关问题
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net(C#)自定义WinForm控件之小结篇
  • .Net8 Blazor 尝鲜
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net项目IIS、VS 附加进程调试
  • .sdf和.msp文件读取
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [.net] 如何在mail的加入正文显示图片
  • [20171106]配置客户端连接注意.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BZOJ 3282] Tree 【LCT】