Java:集合

常见集合:List Set

List

特点:元素是有序的,而且元素可以重复,因为该集合体系有索引。

常见的三个子类:ArrayList、LinkedList、Verctor

List集合判断元素是否相同,判断的依据是equals方法。

ArrayList

底层数据结构为数组结构。特点:查询速度很快、修改元素方便,但插入元素、删除元素稍慢。

package Day14;

import java.util.*;

/*

* 去除ArrayList中的重复元素

* */

public class ArrayListTest {

public static void main(String[] args) {

ArrayList al = new ArrayList();

al.add("java01");

al.add("java02");

al.add("java01");

al.add("java03");

al.add("java01");

al.add("java02");

System.out.println(singleElement(al));

}

public static ArrayList singleElement(ArrayList al){

ArrayList newAl = new ArrayList();

for (Iterator it = al.iterator();it.hasNext();){

Object obj = it.next();

if (!newAl.contains(obj))

newAl.add(obj);

}

return newAl;

}

}

LinkedList

底层用的是链表结构。特点:增删的速度很快、查询稍慢。

特有方法:addFirst() addLast() getFirst() getLast() removeFirst() removeLast(),get只取元素不删除,而remove取出元素并删除元素,改变了集合的长度。removedFirst、removeLast方法,如果在遇到链表中没有元素时会出现NOSuchElementException。1.6版本以后出现了pollFirst方法,获取并移除列表的第一个元素,如果列表为空则返回Null。同样还有offerFirst、offerLast方法、peekFirst、peekLast方法。

package Day14;

import java.util.*;

/*

* 使用LinkedList模拟一个堆栈或者队列数据结构。

* 堆栈:先进后出 First In Last Out FILO

* 队列:先进先出 First In First Out FIFO

* */

public class LinkedListTest {

public static void main(String[] args) {

QueueDemo qd = new QueueDemo();

qd.myAdd("java01");

qd.myAdd("java02");

qd.myAdd("java03");

qd.myAdd("java04");

while(!qd.isNull())

System.out.println(qd.myGet());

}

}

class QueueDemo{

private LinkedList link;

QueueDemo()

{

link = new LinkedList();

}

public void myAdd(Object obj)

{

link.addFirst(obj);

}

public Object myGet(){

return link.removeLast();//如果模拟堆栈,这里removeFirst即可

}

public boolean isNull(){

return link.isEmpty();

}

}

Verctor

底层数据结构为数组结构。和ArrayList不同的是,Vector是JDK 1.0出现的,而ArrayLIst是JDK 1.2出现的;Vector是同步的,而ArrayList是不同步的。

Colletion的常见方法

  • 增:
    • add( )
    • addAll(Colletion c),将集合c添加到新集合
  • 删:
    • remove( )
    • removeAll(Collection b),把和b集合的交集元素删除
    • clear( ),清空集合中的所有元素
  • 获取:
    • size( ),获取集合中元素的个数(集合长度)
    • retainAll(Colletion b),取和b集合中的交集,保留交集中的元素,删除其他元素(即把交集赋给原集合)
    • Iterator(),迭代器(去除集合中元素的方式),返回的是Iterator接口的子类对象

      Iterator it = al.iterator();

      • hasNext(),下一个节点是否有元素,it.hasNext();
      • next(),下一个节点中的元素,it.next();
  • 判断:
    • contains(),是否包含某个元素
    • containsAll(Collettion c),是否包含集合c中的所有元素
    • isEmpty(),集合是否为空

List中的(特有)方法

凡是可以操作索引的方法都是该体系中的特有方法。

  • 增:
    • add(index,element)
    • allAll(index,Colletion)
  • 删:
    • remove(index,element)
  • 改:
    • set(index,element)
  • 查:
    • get(index)
    • subList(from,to)
    • listIterator(),列表迭代器

      ListIterator是Iterator的子接口。在迭代时不可以通过集合对象的方法操作集合的元素。因为会发生ConcurrentModificationException。所以在迭代时,只能通过迭代器的方法对元素进行判断、取出、删除的操作。如果想要其他的操作,例如增加元素,修改元素等,就需要起子接口,ListIterator。该接口是通过集合的listIterator方法获取。因为ListIterator有hasPervious和pervious方法,可以逆序获取集合元素。

    • indexOf(),获取元素的位置

Set

特点:元素是无序的(存入和取出的顺序),元素不可以重复,该集合体系没有索引。

Set集合的功能和Collection的功能是一致的,没有特有方法。

常见的子类:HashSet、TreeSet

HashSet:底层数据结构是哈希表,线程非同步

package Day14;

import java.util.HashSet;

import java.util.Iterator;

public class HashSetDemo {

public static void main(String[] args) {

// TODO Auto-generated method stub

HashSet sh = new HashSet();

//按序存入

sh.add("java01");

sh.add("java02");

sh.add("java03");

sh.add("java04");

sh.add("java05");

for (Iterator it = sh.iterator(); it.hasNext(); )

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

}

}

运行结果是:

java05

java04

java03

java02

java01

hashSet判断元素是否存在是调用hashCode方法,如果两个元素的hashCode值一样,再使用equals方法判断是否"相等",如果hashCode值一样,quals返回true说明是同一个元素或者相等的元素。

也就是说,如果对自定义的对象储存在hashSet中,需要重写equals方法,如果不想用Object类中的hashCode方法,则还需要重写hashCode方法。

TreeSet:底层数据结构是二叉树,可以对元素进行排序。

TreeSet排序的第一种方式:让元素自身具有比较性——元素实现Comparable接口,重写compareTo方法。这种排序方式叫做自然排序,也叫做默认排序。

package Day14;

import java.util.*;

/*

* 将学生类对象存储在TreeSet中

* */

public class TreeSetTest {

public static void main(String[] args) {

Student s1 = new Student("Jerry",26);

Student s2 = new Student("Merry",25);

Student s3 = new Student("Owen",27);

Student s4 = new Student("Owen",25);

TreeSet ts = new TreeSet();

ts.add(s1);

ts.add(s2);

ts.add(s3);

ts.add(s4);

for (Iterator it = ts.iterator(); it.hasNext(); )

{

Student stu = (Student)it.next();

System.out.println(stu.getName()+"..."+stu.getAge());

}

}

}

class Student implements Comparable//实现Comparable接口

{

private String name;

private int age;

Student(String name, int age)

{

this.name = name;

this.age = age;

}

public int compareTo(Object obj)//重写compareTo方法

{

if (!(obj instanceof Student))

throw new RuntimeException("对象不是学生类");

Student s = (Student)obj;

if (this.age==s.age)

return this.name.compareTo(s.name);

else return this.age-s.age;

}

public String getName()

{

return this.name;

}

public int getAge()

{

return this.age;

}

}

运行结果:

Merry...25

Owen...25

Jerry...26

Owen...27

TreeSet的第二种排序方式:当元素自身比具备比较性,或者元素的比较性是不需要的。这时就需要让集合具有比较性。

TreeSet(Comparator<? super E> comparator),构造一个空TreeSet,他根据指定比较器进行排序。也就是将比较器对象作为参数传递给TreeSet集合的构造函数。具体方法是,定义一个类实现Comparator接口,并覆盖comparte方法。

当两种排序都存在时,以比较器Comparator为主。

package Day14;

import java.util.*;

public class TreeSetDemo2 {

public static void main(String[] args) {

TreeSet ts = new TreeSet(new MyComparator());

ts.add(new Student("owen02",25));

ts.add(new Student("owen002",23));

ts.add(new Student("owen04",25));

ts.add(new Student("owen06",26));

ts.add(new Student("owen01",24));

ts.add(new Student("owen02",27));

ts.add(new Student("owen06",25));

for (Iterator it = ts.iterator();it.hasNext();)

{

Student stu = (Student)it.next();

System.out.println(stu.getName()+"..."+stu.getAge());

}

}

}

class Student

{

private int age;

private String name;

Student(String name, int age)

{

this.name = name;

this.age = age;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

}

class MyComparator implements Comparator

{

public int compare(Object o1,Object o2)

{

Student s1 = (Student)o1;

Student s2 = (Student)o2;

int num = s1.getName().compareTo(s2.getName());

if (num==0)

return s1.getAge()-s2.getAge();

return num;

}

}

练习一:

按照字符串长度排序

package Day14;

import java.util.*;

public class TreeSetTest2 {

public static void main(String[] args) {

TreeSet ts1 = new TreeSet(new StringLengthComparator());

ts1.add("abc");

ts1.add("z");

ts1.add("aa");

ts1.add("ab");

ts1.add("vasdf");

ts1.add("hahhah");

for (Iterator it = ts1.iterator();it.hasNext();)

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

}

}

class StringLengthComparator implements Comparator

{

public int compare(Object o1, Object o2)

{

if(!(o1 instanceof String)||!(o2 instanceof String))

throw new ClassCastException("不是String对象");

String s1 = (String)o1;

String s2 = (String)o2;

if(s1.length()==s2.length())

return s1.compareTo(s2);

return s1.length()-s2.length();

}

}

Java:Collection List Set的更多相关文章

  1. Java Collection开发技巧

    Java Collection(集合) 集合中的一些技巧: 通过Collections类的静态方法,可以对集合进行一些操作 1 java.util.List<Integer> number ...

  2. Java Collection Framework概述

    文章出自:听云博客 Collection概述 Java collection是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合主要可以划分为4个部分:Li ...

  3. Java Collection好文章

    Java Collection好文章 http://my.oschina.net/xiaomaoandhong/blog/78394

  4. java collection framework

    java collection framework Map

  5. Java Collection 集合类大小调整带来的性能消耗

    Java Collection类的某些详细实现因为底层数据存储基于数组,随着元素数量的添加,调整大小的代价非常大.随着Collection元素增长到某个上限,调整其大小可能出现性能问题. 当Colle ...

  6. Java Collection Framework : List

    摘要: List 是 Java Collection Framework的重要成员,详细包括List接口及其全部的实现类.由于List接口继承了Collection接口,所以List拥有Collect ...

  7. ------------------java collection 集合学习 ----小白学习笔记,,有错,请指出谢谢

    <!doctype html>java对象集合学习记录 figure:first-child { margin-top: -20px; } #write ol, #write ul { p ...

  8. java Collection中的排序问题

    java Collection中的排序问题 这里讨论list.set.map的排序,包括按照map的value进行排序. 1)list排序 list排序可以直接采用Collections的sort方法 ...

  9. Java集合框架介绍。Java Collection Frameworks = JCF

    Java集合框架 = Java Collection Frameworks  = JCF . 为了方便理解,我画了一张思维脑图.

  10. JAVA collection集合之 扑克牌游戏

    主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...

随机推荐

  1. excel转换日期格式,将yyyymmdd类型日期转换成yyyy-mm-dd等日期类型方法

    源数据日期格式:例如: 20160420 20160422 目标日期格式类型: 2016-4-20 2016-4-22 或 2016/04/20 2016/04/22 方法: 一.选中相应数据的单元格 ...

  2. Leetcode: Minimum Number of Arrows to Burst Balloons

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  3. wampserver---------如何让局域网其他电脑访问我的apache

    wamp版本:wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 修改方式,看图:修改完记得重启.

  4. Python 模块,数据类型,元组

    模块 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持,以后的课程中会深入讲解常用到的各种库,现在,我们先来象征性的学2个简单的. s ...

  5. Kindle 推送教程:教你用电子邮箱推送电子书(Kindle伴侣)

    Kindle 推送是什么意思?如何通过电子邮件附件推送?或许刚刚接触 Kindle 的朋友对这个概念不是很清楚,其实所谓 Kindle 推送是指亚马逊提供的一个"Kindle 个人文档服务& ...

  6. .Net程序员安卓学习之路4:使用xutils Get Post数据

    前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录. 本例服务端使用WCF来实现,写好的WCF服务端在 ...

  7. Linux内核链表深度分析【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51325646 链表简介: 链表是一种常用的数据结构,它通过指针将一系列数据节点连 ...

  8. PowerDesigner反向工程,根据Oracle数据库结构生成ER图(2014-3-25记)

    01.添加数据服务端 02. PowerDesigner 1. 新建PDM:选择菜单File->New Model,[Model type]选择Physical Data Model,[DBMS ...

  9. [已解决] 日常开发中禁用Tomcat自动重启

    最近做了一些Java Web开发,发现每次修改完java或者其他文件后tomcat都会重新加载一次项目,很耽误事,如何禁用Tomcat自动重启呢, 找到server.xml中的这一行,把其中的 rel ...

  10. img的hover事件闪动

    今天给同学写一个相册照片鼠标浮动显示细节的效果,遇到了闪动的bug,也顺利解决,就写下来跟大家分享. 我使用的是'标签:hover + 标签'的形式,如果使用jquery的mouseover.mous ...