集合类

集合概述

Collection接口

Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通过的一些方法,这些方法可用于操作所有的单列集合。

Collection接口的方法

方法声明

功能描述

boolean add (Object o)

向集合中添加一个元素。

boolean addAll (Collection c)

将指定Collection中的所有元素添加到该集合中。

void clear ()

删除该集合中的所有元素

boolean remove (Object 0)

删除该集合中指定的元素

boolean removeAll (Collection c)

删除指定集合中的所有元素

boolean isEmpty ()

判断该集合是否为空。

boolean contains (Object o)

断该集合中是否包含某个元素。

boolean containsAll (Collection c)

判断该集合中是否包含指定集合中的所有元素

Iterator iterator ()

返回在该集合的元素上进行迭代的迭代器(Iterator),用于遍历该集合所有元素。

int size ()

获取该集合元素个数。

List接口

Set接口

Set接口简介

Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了.

与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复.

HashSet集合

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的,当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素.Set集合与List集合存取元素的方式都一样.

案例:

public static void main(String[] args) {

//创建HashSet集合

HashSet<Object> hashSet = new HashSet<>();

hashSet.add("1");

hashSet.add("22");

hashSet.add("3");

//向该Set集合中添加重复元素

hashSet.add("3");

//获取Iterator对象

Iterator<Object> iterator = hashSet.iterator();

//判断集合中是否有元素

while (iterator.hasNext()) {

//通过迭代器的next()方法获取元素

Object object = (Object) iterator.next();

System.out.println(object);

}

}

 

注意:HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃,整个存储的流程如下:

HashSet对象存储过程

案例:将对象存入HashSet

class Student {

String id;

String name;

public Student(String id, String name) {

super();

this.id = id;

this.name = name;

}

@Override

public String toString() {

return id + ":" + name;

}

}

public class Example04 {

public static void main(String[] args) {

//创建HashSet集合

HashSet hashSet = new HashSet();

 

Student s1 = new Student("1", "z");

Student s2 = new Student("2", "zl");

Student s3 = new Student("2", "z");

 

hashSet.add(s1);

hashSet.add(s2);

//向该Set集合中添加重复元素

hashSet.add(s3);

 

System.out.println(hashSet);

}

}

 

注意:向HashSet集合存入三个Student对象,出现重复元素,这样的学生信息应该不允许出现在HashSet集合中。之所有没有去掉,是因为在定义Student类时没有重写hashCode()和equals()方法。

案例:修改上例代码

class Student {

String id;

String name;

public Student(String id, String name) {

super();

this.id = id;

this.name = name;

}

public String toString() {

return id + ":" + name;

}

 

//重写hashCode方法

public int hashCode() {

return id.hashCode();

}

 

//重写equals方法

public boolean equals(Object o){

//判断是否为同一个对象

if (this == o) {

return true;

}

//判断对象是为Student类型

if (!(o instanceof Student)) {

//如果对象不是Student类型,返回false

return false;

}

//将对象强转为Student对象

Student s = (Student) o;

//判断id值是否相同

boolean b = this.id.equals(s.id);

return b;

}

}

public class Example04 {

public static void main(String[] args) {

//创建HashSet集合

HashSet<Student> hashSet = new HashSet<Student>();

 

Student s1 = new Student("1", "z");

Student s2 = new Student("2", "zl");

Student s3 = new Student("2", "z");

 

hashSet.add(s1);

hashSet.add(s2);

//向该Set集合中添加重复元素

hashSet.add(s3);

 

System.out.println(hashSet);

}

}

 

TreeSet集合

    1. TreeSet是Set接口的另一个实现类,它内部采用自平衡的排序二叉树来存储元素,这样的结构可以保证TreeList集合中没有重复的元素,并且可以对元素进行排序。
    1. 所谓二叉树就是说每个节点最多有两个子节点的有序树,每个节点及其子节点组成的树称为子树,通常左侧的子节点称为“左子树”,右侧的子节点称为“右子树”,二叉树中元素的存储结构:

    二叉树的存储结构

    1. 二叉树分为很多种,如排序二叉树、平衡二叉树等。TreeSet集合内部使用的是自平衡的排序二叉树,它的特点 是存储的元素会按照大小排序,并能去除重复元素。

    例如向一个二叉树中存入8个元素,依次为13、8、17、1、11、15、25,如果以排序二叉树的方式来存储,在集合中的存储结构会形成一个树状结构。

    排序二叉树

    从排序二叉树可以看出,在向TreeSet集合依次存入元素时,首先将第1个存入的元素放在二叉树的最顶端,之后存入的元素与第一个元素,就将该元素放在右子树上,依此类推,按照左子树元素小于右子树元素的顺序进行排序。当二叉树中已经存入一个17的元素时,再向集合中存入一个为17的元素时,TreeSet将会把重复的元素去掉。

    案例:

    public static void main(String[] args) {

    TreeSet<String> ts = new TreeSet<String>();

    ts.add("Jack");

    ts.add("Helena");

    ts.add("Helena");

    ts.add("Eve");

    Iterator iterator = ts.iterator();

    while (iterator.hasNext()) {

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

     

    }

    }

     

    注意:

    1. 通过迭代器Iterotor迭代出的字符串元素按照字母表的顺序打印了出来 。 这些元素之所以能够排序是因为每次向TreeSet集合中存入一个元素时,就会将该元素与其他元素进行比较,最后将它插入到有序的对象 序列中。集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable接口中定义的,因此要想对集合中的元素进行排序 ,就必须实现 Comparable接口中定义的,因此要想对集合中的元素进行排序 ,就必须实现Comparable接口。
    2. JDK中大部分的类都实现Comparable接口,拥有了接口中的CompareTo()方法,如Integer、Double和String等。
    3. 在TreeSet集合中存入Student类型对象时,如果Student类没有实现Comparable接口,则Student类型的对象将不能进行比较。这时,TreeSet集合就不知道按照什么排序规则对Student对象进行排序,最终导致程序报错。因此,为了在TreeSet集合中存放Studen对旬,必须使Student类实现Comparable接口。

    //定义实现Comparable接口

    class Student implements Comparable {

    String name;

    int age;

    public Student(String name, int age) {

    super();

    this.name = name;

    this.age = age;

    }

    public String toString() {

    return name + ":" + age;

    }

     

    //重写Comparable接口的CompareTO方法

    public int compareTo (Object o){

    Student s = (Student) o;

    //定义比较方式

    if (this.age-s.age>0){

    return 1;

    }

    if(this.age - s.age == 0){

    //将比较结果返回

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

    }

    return -1;

    }

    }

     

    public class Example04 {

    public static void main(String[] args) {

    TreeSet ts = new TreeSet();

    ts.add(new Student("Jack", 19));

    ts.add(new Student("Rose", 18));

    ts.add(new Student("Tom", 19));

    ts.add(new Student("Rose", 18));

     

    Iterator iterator = ts.iterator();

    while (iterator.hasNext()) {

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

    }

    }

    }

     

    希望字符串可以按照长度来进行排序,这时,可以通过自定义比较器的方式对TreeSet集合中的元素排序,即实现 Comparator接口,在创建TreeSet集合时指定比较器。

    class MyComparator implements Comparator{

     

    public int compare(Object o1, Object o2) {

    // TODO Auto-generated method stub

    String s1 = (String) o1;

    String s2 = (String) o2;

    int temp = s1.length()-s2.length();

    return temp;

    }

     

    }

    public class Example14 {

    public static void main(String[] args) {

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

    ts.add("Jack");

    ts.add("Helena");

    ts.add("Helena");

    ts.add("Eve");

    Iterator iterator = ts.iterator();

    while (iterator.hasNext()) {

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

     

    }

    }

    }

     

    注意:定义了一个MyComparator类实现了Comparator接口,在compare()方法中实现元素的比较。

 

 

Map接口

JDK5.0新特性——泛型

Collections工具类

针对集合的操作非常频繁,例如将集合中的元素排序、从集合中查找某个元素等。针对这些常见操作,JDK提供了一个工具类专门用来操作集合,这个类就是Collections,它位于java.util包中。Collections类中提供了大量的方法用于对集合中的元素进行排序、查找和修改等操作。

排序操作

Collections类中提供了一系列方法用于对List集合进行排序。

方法声明

功能描述

static <T>boolean addAll( Collection <? super T> c, T…. elemnts)

将所有指定元素添加到指定的collection中

static void reverse (List list)

反转指定List集合中元素的顺序

static void shuffle (List list)

对List集合中的元素进行随机排序(模拟玩扑克中的“洗牌“)

static void sort (List list)

根据元素的自然顺序对List集合中的元素进行排序。

static void swap (List list, int I, int j)

将指定List集合中i处元素和j处元素进行交换。

案例:

public static void main(String[] args) {

ArrayList list = new ArrayList<Object>();

Collections.addAll(list, "C", "Z", "B", "K");

System.out.println("排序前:"+list);

Collections.reverse(list);

System.out.println("反转后:"+list);

Collections.sort(list);

System.out.println("按自然顺序排序后:"+list);

Collections.shuffle(list);

System.out.println("洗牌后:"+list);

}

 

查找、替换操作

Collections类还提供了一些常用方法用于查找、替换集合中的元素。

方法声明

功能描述

static int binarySearch (List list, Object key)

使用二分法搜索指定对象在List集合中的索引,查找List集合中的元素必须是有序的。

static Object max (Collection col)

根据元素的自然顺序,返回给定集合中最大的元素。

static Object min (Collection col)

根据元素的自然顺序,返回给定集合中最小的元素。

static boolean replaceAll (List list, Object oldVal, Object newVal)

用一个新的newVal替换List集合中所有的旧值oldVal。

案例:

public static void main(String[] args) {

ArrayList list = new ArrayList<Object>();

Collections.addAll(list, -3, 2, 9, 5, 8);

System.out.println("集合中的元素:"+list);

System.out.println("集合中的最大元素:"+Collections.max(list));

System.out.println("集合中的最小元素:"+Collections.min(list));

//将集合中的8用0替换掉

Collections.replaceAll(list, 8, 0);

System.out.println("替换后:"+list);

}

 

Arrays工具类

java.util包中提供了一个专门用于操作数组的工具类——Arrays。Arrays工具类提供了大量的静态方法。

使用Arrays的sort()方法排序。

案例:

public static void main(String[] args) {

int[] arr = {9, 8, 3, 5, 2};

System.out.print("排序前: ");

printArray(arr);

Arrays.sort(arr);

System.out.print("排序后:");

printArray(arr);

}

 

private static void printArray(int[] arr) {

System.out.print("[");

for (int x=0; x<arr.length; x++) {

if (x != arr.length-1){

System.out.print(arr[x]+",");

}else{

System.out.println(arr[x]+"]");

}

}

}

 

使用Arrays的binarySearch(Object[]a, Object key)方法查找元素

案例:在数组中查找某些特定的元素。

public static void main(String[] args) {

int[] arr = {9, 8, 3, 5, 2};

System.out.print("排序前: ");

Arrays.sort(arr);

int index = Arrays.binarySearch(arr, 3);

System.out.print("数据的排序后元素3的索引是:"+index);

}

 

使用Arrays的copyOfRange (int[]original, int from, int to)方法拷贝元素

案例:拷贝数组

public static void main(String[] args) {

int[] arr = {9, 8, 3, 5, 2};

int[] copyOfRange = Arrays.copyOfRange(arr, 1, 7);

for (int i = 0; i < copyOfRange.length; i++) {

System.out.print(copyOfRange[i]+" ");

}

}

 

使用Arrays的fill(Object a, Objectval)方法填充元素

案例:填充元素

public static void main(String[] args) {

int[] arr = {9, 8, 3, 5, 2};

//用8替换数组中的每一个值

Arrays.fill(arr, 8);

for (int i = 0; i < arr.length; i++) {

System.out.println(i+":"+arr[i]);

}

}

 

使用Arrays的toString(int[] arr)方法把数组转换为字符串

案例:将数组转换为字符串

public static void main(String[] args) {

int[] arr = {9, 8, 3, 5, 2};

//使用toString()方法将数组转换为字符串

String arrString = Arrays.toString(arr);

System.out.println(arrString);

}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值