Java集合之Collection接口
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代码
- public static void main(String[] args){
- String okString=null;
- List<String>lists=new ArrayList<String>();
- lists.add("aa");
- lists.add("aa");
- lists.add(1,"bb");//指定位置插入
- lists.add("cc");
- lists.add(okString);
- //检查ArrayList是否为空
- System.out.println(lists.isEmpty());
- //查找指定元素的首次出现位置
- System.out.println(lists.indexOf("aa"));
- //查看是否含有该元素
- System.out.println(lists.contains("cc"));
- //输出list的长度
- System.out.println(lists.size());
- //输出
- for(int i=0;i<lists.size();i++)
- System.out.println(lists.get(i));
- //清除list
- lists.clear();
- }
总结: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代码
- public static void main(String[] args){
- String okString=null;
- List<String>vectors=new Vector<String>();
- vectors.add("aa");
- vectors.add("aa");
- vectors.add(1,"bb");//指定位置插入
- vectors.add("cc");
- vectors.add(okString);
- //检查ArrayList是否为空
- System.out.println(vectors.isEmpty());
- //查找指定元素的首次出现位置
- System.out.println(vectors.indexOf("aa"));
- //查看是否含有该元素
- System.out.println(vectors.contains("cc"));
- //输出list的长度
- System.out.println(vectors.size());
- //删除元素;
- vectors.remove(0);
- //输出
- for(int i=0;i<vectors.size();i++)
- System.out.println(vectors.get(i));
- //清除list
- vectors.clear();
- }
3)LinkedList
LInkedList是List接口的链表实现。实现所有可选的列表操作,并允许所有元素包括null。其基本用法与ArrayList差不多,如:
Java代码
- public static void main(String[] args){
- String okString=null;
- List<String>link=new LinkedList<String>();
- link.add("aa");
- link.add("aa");
- link.add(1,"bb");//指定位置插入
- link.add("cc");
- link.add(okString);
- //检查ArrayList是否为空
- System.out.println(link.isEmpty());
- //查找指定元素的首次出现位置
- System.out.println(link.indexOf("aa"));
- //查看是否含有该元素
- System.out.println(link.contains("cc"));
- //输出list的长度
- System.out.println(link.size());
- //删除元素;
- link.remove(0);
- //输出
- for(int i=0;i<link.size();i++)
- System.out.println(link.get(i));
- //清除list
- link.clear();
- }
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代码
- public class Person {
- public String name;
- public int age;
- public Person(String name,int age){
- this.name=name;
- this.age=age;
- }
- @Override
- public String toString() {
- return "person [name=" + name + ", age=" + age + "]";
- }
- }
set添加Person元素
Java代码
- public static void main(String[] args){
- Set<Person>sets=new HashSet<Person>();
- Person ok=new Person("小明", 18);
- Person ok1=new Person("小红", 16);
- Person ok2=new Person("小白", 15);
- sets.add(ok);
- sets.add(ok1);
- sets.add(ok2);
- //添加不进去
- sets.add(ok1);
- //能添加进去
- sets.add(new Person("小明", 18));//与ok数据一样
- System.out.println("size: "+sets.size());
- }
发现同一个对象的ok1只能添加一次,然而与ok相同数据的被多次添加。Set使用e1.equals(e2)来判断的。
在java集合中,判断两个对象是否是同一个对象是:
1.先判断两个对象的hashCode值是否相等,如果不相等,就认为两个对象不相等;若相等;判断条件2
2.判断两个对象的equals运算是否相等,相等则认为两个对象相等。
所以我们需要重写Person的hashCode和equals方法
把Person类加上方法:
Java代码
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + age;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
- }
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Person other = (Person) obj;
- if (age != other.age)
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
此时后面与ok数据相同的对象也不能添加进集合里了。
2)TreeSet
TreeSet元素自然排序,底层是使用TreeMap实现的,自定义要显示Comparable接口
定义Person类
Java代码
- public class Person implements Comparable<Person>{
- public String name;
- public int age;
- public Person(String name,int age)
- {
- this.name=name;
- this.age=age;
- }
- public int compareTo(Person o) {
- if(o==null)
- throw new NullPointerException();
- if(this.age>o.age)
- return 1;
- if(this.age<o.age)
- return -1;
- return 0;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + "]";
- }
- }
TreeSet使用:
Java代码
- public static void main(String[] args){
- Set<Person>sets=new TreeSet<Person>();
- Person ok=new Person("小明", 18);
- Person ok1=new Person("小红", 16);
- Person ok2=new Person("小白", 15);
- sets.add(ok);
- sets.add(ok1);
- sets.add(ok2);
- //添加不进去
- sets.add(ok1);
- //输出
- Iterator<Person> iterator=sets.iterator();
- while(iterator.hasNext())
- {
- System.out.println(iterator.next());
- }
- }
运行结果:

技术分享:www.kaige123.com
Java集合之Collection接口的更多相关文章
- Java 集合之Collection 接口和遍历方法
这几篇是我按网上的教程来实习的. URL: http://www.cnblogs.com/jbelial/archive/2013/03/27/2981395.html 打代码的感觉挻好的.. 注意在 ...
- java集合 之 Collection和Iterator接口
Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...
- Java集合框架Collection
转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...
- Java:集合,Collection接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)
集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...
- Java集合框架之接口Collection源码分析
本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...
- Java学习之集合(Collection接口)
集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储 集合特点: 1.用于存储对象的容器 2.集合长度可变 3.不可以存储基本数据类型 集合体系的顶层C ...
- java集合(2)-Collection与Iterator接口
1 package com.j1803.collectionOfIterator; 2 import java.util.ArrayList; 3 import java.util.Collectio ...
- Java集合之Collection
Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集 ...
随机推荐
- JSTL分类查询
index.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- ThreadGroup分析
本文为转载:http://sunboyyyl.blog.163.com/blog/static/2247381201211531712330/ 在Java中每一个线程都归属于某个线程组管理的一员,例如 ...
- C语言实现大数据除法
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...
- php 获取当前时间
<?php echo $showtime=date("Y-m-d H:i:s");?>
- Java查询网址
Java在线帮助文档: http://docs.oracle.com/javase/8/docs/technotes/guides/desc_jdk_structure.html Java小知识讲解: ...
- javascript二叉树基本功能实现
都是常用的功能. 删除是最复杂的.. <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Java Hour 9
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为7 Hour,请各位不吝赐教. Hour 9 方法 ...
- 1、揭秘通用平台的 HttpClient (译)
原文链接:Demystifying HttpClient APIs in the Universal Windows Platform 正打算翻译这篇文章时,发现园子里已经有朋友翻译过了,既然已经开始 ...
- DOS常用的简单命令
在windows下的cmd里使用 dir 列出当前目录下的文件及文件夹 md 创建目录 rd 删除目录(只能删除空目录) cd 进入指定目录 cd .. 返回上一级目录 cd / 返回到根目录 del ...
- Servlet常见错误及解决方法
常见错误及解决方法 1. 404产生的原因为Web服务器(容器)根据请求地址找不到对应资源,以下情况都会出现404的错误提示: 输入的地址有误(应用名大小写不正确,名称拼写不正确) 在web.xml文 ...