Java集合之Collection接口

原创 2016年08月29日 21:47:29

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());
}
}
  运行结果:
  

技术分享:kaige123.com

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java集合类:Collection接口常用方法

Java.util包 Collection接口常见的方法如下: (1)单元素添加、删除操作。 boolean add(Object o),将对象添加给集合。 boolean remove(Ob...
  • u013063153
  • u013063153
  • 2015年08月04日 14:36
  • 2301

【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

两个月之前准备软考时,简单的从理论上总结了最常用的数据结构和算法,比如:线性表,链表,图。在进行java开发时,jdk为我们提供了一系列相应的类来实现基本的数据结构。jdk所提供的容器API位于jav...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年06月30日 09:59
  • 29633

java、Collection接口集合和泛型<T>

1 什么叫集合   通常情况下,把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合。 2 集合与数组的区别   从存储的数据类型来看: 可以定义基本类型的数组,用来存储基本类型数据。...
  • u012560902
  • u012560902
  • 2016年07月30日 08:51
  • 3643

【java集合一】根接口Collection、Map

Java集合类是一种非常实用的工具类,主要用于保存、盛装其它数据(集合里只能保存对象),因此集合类也被成为容器类。所有的集合类都位于java.util包下,在java.util.concurrent下...
  • chenyanmoting
  • chenyanmoting
  • 2016年05月31日 21:50
  • 988

Java1.8源码集合类学习UML图——Collection接口&AbstractCollection抽象类

Collection接口&AbstractCollection类 可以明显地看到Collection接口继承自Iterable接口,而AbstractCollection抽象类又是Collectio...
  • embedclub_LYF
  • embedclub_LYF
  • 2016年05月24日 14:43
  • 802

Collection与Collections工具类

Collection与Collections的区别 Collection是集合操作的接口 Collections是集合操作的工具类,可以进行List、Set、Map集合的操作...
  • u012369153
  • u012369153
  • 2016年11月01日 10:53
  • 379

[学习笔记]Java集合框架以及Collection顶层接口

集合框架 概述 数组容器由于无法扩展容量,也没有更多的功能可以使用,而Java中的另一种容器:集合,就能满足这些要求。 特点 集合中的每一个元素都是对象,存储的实际上是对象的引用。集合...
  • jacobvv
  • jacobvv
  • 2014年12月14日 22:39
  • 3250

Java集合框架(下)之Collection.sort()与Comparable,Comparator

在集合框架的应用中,往往都要进行排序,排序规则多种多样,或者只是简单的字符串大小排序,简单的数字大小排序,但有时根据需求排序规则会比较复杂。这时就需要Collection.sort()的使用技巧了。对...
  • qq_33290787
  • qq_33290787
  • 2016年07月03日 11:58
  • 2728

集合三大接口之一:Collection

collection:List、Set 1)List:(有序可变的数组 ,数组一般存放的是对象的引用,允许添加重复元素)                   ArrayList      ...
  • LOOYUOO
  • LOOYUOO
  • 2016年08月22日 08:52
  • 597

Java集合类——Collection接口(传智播客毕老师视频讲解)

为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组和集合类同是容器,有何不同? 数组虽然也可以...
  • lx20012002
  • lx20012002
  • 2014年09月15日 14:51
  • 1130
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java集合之Collection接口
举报原因:
原因补充:

(最多只允许输入30个字)