java 集合 接口_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

866b01b21459b47f85fe75817508c619.png

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

3.ArrayList是线程不安全的

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

738e0d0d95d622df22856c04c97d4486.png

ArrayList使用示例:

public static void main(String[] args){

String okString=null;

Listlists=new ArrayList();

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

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)

ad300876b7be7215d0622aacdb367de7.png

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

1e3bce2d7de90e454fba1a45e02e3c32.png

4.Vector是线程安全的

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

public static void main(String[] args){

String okString=null;

Listvectors=new Vector();

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

System.out.println(vectors.get(i));

//清除list

vectors.clear();

}

3)LinkedList

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

public static void main(String[] args){

String okString=null;

Listlink=new LinkedList();

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

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类:

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元素

public static void main(String[] args){

Setsets=new HashSet();

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类加上方法:

@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类

public class Person implements Comparable{

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

return -1;

return 0;

}

@Override

public String toString() {

return "Person [name=" + name + ", age=" + age + "]";

}

}

TreeSet使用:

public static void main(String[] args){

Setsets=new TreeSet();

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 iterator=sets.iterator();

while(iterator.hasNext())

{

System.out.println(iterator.next());

}

}

运行结果:

aa079f0ffec35c949451aa545c96ad2f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值