文档章节

Java集合之Collection接口

凯哥学堂
 凯哥学堂
发布于 2016/11/03 15:49
字数 1595
阅读 31
收藏 0

java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口。

  一些Collection允许有重复元素,而另一些则不允许,一些Collection是有序的,另一些则是无序的。Collection不提供接口的任何直接实现,它提供更加具体的子接口List和Set。

  1.List接口

  List是有序的集合,此接口的用户队列表的每一个元素的插入位置进行精确的控制,可以根据元素的整数索引访问元素,并搜索列表中的元素。

  List接口实现类主要有:ArrayList,Vector,LinkedList

  1)ArrayList

  1.默认的ArrayList的大小为10

  

  2.ArrayList内部实现是使用动态数组

  3.ArrayList是线程不安全的

  4.如果数组满了,需要动态扩充,扩充长度为原来数组长度的一半左右,扩充时需要新建一个数组,再把原先数据复制过来。

  

  ArrayList使用示例:

  Java代码

  1. public static void main(String[] args){
  2. String okString=null;
  3. List<String>lists=new ArrayList<String>();
  4. lists.add("aa");
  5. lists.add("aa");
  6. lists.add(1,"bb");//指定位置插入
  7. lists.add("cc");
  8. lists.add(okString);
  9. //检查ArrayList是否为空
  10. System.out.println(lists.isEmpty());
  11. //查找指定元素的首次出现位置
  12. System.out.println(lists.indexOf("aa"));
  13. //查看是否含有该元素
  14. System.out.println(lists.contains("cc"));
  15. //输出list的长度
  16. System.out.println(lists.size());
  17. //输出
  18. for(int i=0;i<lists.size();i++)
  19. System.out.println(lists.get(i));
  20. //清除list
  21. lists.clear();
  22. }

  总结:Arra能直接通过下标获取数据,数据读取非常方便;然而ArrayList的插入和删除,会导致内部数据大量移位,会影响性能。如果我们已经知道需要的元素个数,我们可以初始化时指定ArrayList的容量,这样可以有效的避免数组多次扩充,从而提高效率;但也不能初始化太大,浪费内存。

  2)Vector

  Vector类可以实现增长的对象数组,与数组一样,可以使用下标直接进行数据访问。Vector的大小可以根据需要扩充或缩小。

  1.Vector内部使用动态数组实现

  2.默认构造大小为10,增量为0.可在构造方法指定大小和增量Vector(int size,int Increment)

  

  3.扩充方式:如果有指定增量,则是当前容量+增量;如果增量等于0,则是当前容量*2;

  

  4.Vector是线程安全的

  Vector用法和ArrayList基本差不多,示例代码

  Java代码

  1. public static void main(String[] args){
  2. String okString=null;
  3. List<String>vectors=new Vector<String>();
  4. vectors.add("aa");
  5. vectors.add("aa");
  6. vectors.add(1,"bb");//指定位置插入
  7. vectors.add("cc");
  8. vectors.add(okString);
  9. //检查ArrayList是否为空
  10. System.out.println(vectors.isEmpty());
  11. //查找指定元素的首次出现位置
  12. System.out.println(vectors.indexOf("aa"));
  13. //查看是否含有该元素
  14. System.out.println(vectors.contains("cc"));
  15. //输出list的长度
  16. System.out.println(vectors.size());
  17. //删除元素;
  18. vectors.remove(0);
  19. //输出
  20. for(int i=0;i<vectors.size();i++)
  21. System.out.println(vectors.get(i));
  22. //清除list
  23. vectors.clear();
  24. }

  3)LinkedList

  LInkedList是List接口的链表实现。实现所有可选的列表操作,并允许所有元素包括null。其基本用法与ArrayList差不多,如:

  Java代码

  1. public static void main(String[] args){
  2. String okString=null;
  3. List<String>link=new LinkedList<String>();
  4. link.add("aa");
  5. link.add("aa");
  6. link.add(1,"bb");//指定位置插入
  7. link.add("cc");
  8. link.add(okString);
  9. //检查ArrayList是否为空
  10. System.out.println(link.isEmpty());
  11. //查找指定元素的首次出现位置
  12. System.out.println(link.indexOf("aa"));
  13. //查看是否含有该元素
  14. System.out.println(link.contains("cc"));
  15. //输出list的长度
  16. System.out.println(link.size());
  17. //删除元素;
  18. link.remove(0);
  19. //输出
  20. for(int i=0;i<link.size();i++)
  21. System.out.println(link.get(i));
  22. //清除list
  23. link.clear();
  24. }

  ArrayList和Vector是使用动态数组实现的,Vector相比ArrayList可以指定增量,而LinkedList是用链表实现的。他们的区别主要体现在数组和链表的区别

  2.Set接口

  一个不包含重复元素的colletion。即Set不包含满足e1.equals(e2)的元素,Set最多包含一个null元素

  Set的实现类主要有:HashSet,TreeSet,LinkedHashSet

  1)HashSet

  实现了Set接口,它不保证set的迭代顺序,特别是它不保证该顺序永恒不变,此类允许使用null元素。底层是使用HashMap实现的。

  下面我们主要讲解不能包含重复元素。

  如:

  定义Person类:

  Java代码

  1. public class Person {
  2. public String name;
  3. public int age;
  4. public Person(String name,int age){
  5. this.name=name;
  6. this.age=age;
  7. }
  8. @Override
  9. public String toString() {
  10. return "person [name=" + name + ", age=" + age + "]";
  11. }
  12. }

  set添加Person元素

  Java代码

  1. public static void main(String[] args){
  2. Set<Person>sets=new HashSet<Person>();
  3. Person ok=new Person("小明", 18);
  4. Person ok1=new Person("小红", 16);
  5. Person ok2=new Person("小白", 15);
  6. sets.add(ok);
  7. sets.add(ok1);
  8. sets.add(ok2);
  9. //添加不进去
  10. sets.add(ok1);
  11. //能添加进去
  12. sets.add(new Person("小明", 18));//与ok数据一样
  13. System.out.println("size: "+sets.size());
  14. }

  发现同一个对象的ok1只能添加一次,然而与ok相同数据的被多次添加。Set使用e1.equals(e2)来判断的。

  在java集合中,判断两个对象是否是同一个对象是:

  1.先判断两个对象的hashCode值是否相等,如果不相等,就认为两个对象不相等;若相等;判断条件2

  2.判断两个对象的equals运算是否相等,相等则认为两个对象相等。

  所以我们需要重写Person的hashCode和equals方法

  把Person类加上方法:

  Java代码

  1. @Override
  2. public int hashCode() {
  3. final int prime = 31;
  4. int result = 1;
  5. result = prime * result + age;
  6. result = prime * result + ((name == null) ? 0 : name.hashCode());
  7. return result;
  8. }
  9. @Override
  10. public boolean equals(Object obj) {
  11. if (this == obj)
  12. return true;
  13. if (obj == null)
  14. return false;
  15. if (getClass() != obj.getClass())
  16. return false;
  17. Person other = (Person) obj;
  18. if (age != other.age)
  19. return false;
  20. if (name == null) {
  21. if (other.name != null)
  22. return false;
  23. } else if (!name.equals(other.name))
  24. return false;
  25. return true;
  26. }

  此时后面与ok数据相同的对象也不能添加进集合里了。

  2)TreeSet

  TreeSet元素自然排序,底层是使用TreeMap实现的,自定义要显示Comparable接口

  定义Person类

  Java代码

  1. public class Person implements Comparable<Person>{
  2. public String name;
  3. public int age;
  4. public Person(String name,int age)
  5. {
  6. this.name=name;
  7. this.age=age;
  8. }
  9. public int compareTo(Person o) {
  10. if(o==null)
  11. throw new NullPointerException();
  12. if(this.age>o.age)
  13. return 1;
  14. if(this.age<o.age)
  15. return -1;
  16. return 0;
  17. }
  18. @Override
  19. public String toString() {
  20. return "Person [name=" + name + ", age=" + age + "]";
  21. }
  22. }

  TreeSet使用:

  Java代码

  1. public static void main(String[] args){
  2. Set<Person>sets=new TreeSet<Person>();
  3. Person ok=new Person("小明", 18);
  4. Person ok1=new Person("小红", 16);
  5. Person ok2=new Person("小白", 15);
  6. sets.add(ok);
  7. sets.add(ok1);
  8. sets.add(ok2);
  9. //添加不进去
  10. sets.add(ok1);
  11. //输出
  12. Iterator<Person> iterator=sets.iterator();
  13. while(iterator.hasNext())
  14. {
  15. System.out.println(iterator.next());
  16. }
  17. }

  运行结果:

  

                                                                                                         技术分享:www.kaige123.com

© 著作权归作者所有

凯哥学堂
粉丝 18
博文 316
码字总数 284948
作品 0
东城
程序员
私信 提问
​比较Collection 和Collections的区别

1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最...

itfanr
2014/11/24
0
0
Java集合框架(一)——集合概述

本文概述 本篇文章将分三块内容对Java中的集合框架进行介绍: 一. 集合框架相关概念 二. 集合体系通用方法 三. 集合遍历—Iteractor 一. 集合框架相关概念 集合:用于存储多个对象的容器 1....

Mr_Yanger
2017/11/11
0
0
[Java 并发编程] 集合框架之 同步容器类 & 并发容器类

吾生也有涯,而知也无涯。———《庄子》 通过上一篇文章,我们已经知道设计一个线程安全类的原则和步骤,以及在设计过程中我们应当注意的细节。实际上,Java 的集合库包含了线程安全集合和非...

seaicelin
2018/05/25
0
0
Java 中的 Collection 学习笔记(2)

1、java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是...

hellation_
03/29
0
0
JavaSE|Java Collections API

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/darlingwood2013/article/details/89350908 笔记内容来自《数据结构与算法分析 Java语言描述》第三版 JavaSE...

叶晚林
04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Node.js 多进程处理CPU密集任务

Node.js 单线程与多进程 大家都知道 Node.js 性能很高,是以异步事件驱动、非阻塞 I/O 而被广泛使用。但缺点也很明显,由于 Node.js 是单线程程序,如果长时间运算,会导致 CPU 不能及时释放...

Svend
42分钟前
4
0
Django笔记-3-模型-20190526

简介 django为各种数据库提供了很好的支持,django对这些数据库提供了统一的调用API;可以根据不同的也无需求选择不同的数据库; 配置数据库 在setting.py文件中配置数据库 DATABASES = { ...

Frank1126lin
58分钟前
3
0
OSChina 周日乱弹 —— 程序员做噩梦

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 手嶌葵《Kiss The Girl》 《Kiss The Girl》- 手嶌葵 手机党少年们想听歌,请使劲儿戳(这里) @Sharon啊 :今天...

小小编辑
今天
199
11
Another app is currently holding the yum lock; waiting for it to exit...

Another app is currently holding the yum lock; waiting for it to exit... The other application is: PackageKit Memory : 153 M RSS (266 MB VSZ) Started: Thu Jul 12 00:03......

圣洁之子
今天
2
0
FastDateFormat 研究

FastDateFormat 对缓存的利用,其实就是用ConcurrentHashMap 做了一个map类型的缓存 public F getInstance(final String pattern, TimeZone timeZone, Locale locale) { Validate......

暗中观察
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部