java基础之集合框架

1.框架大概结构
java的集合类主要是由collection和map这两个接口派生而来的:注意map不是collection的子接口,它们平级
set接口和list接口继承了collection接口
所以java中的集合可以看成三大类:list、set、map
list是有序集合,集合中的元素允许重复,访问集合可以通过元素的索引来访问
set是无序集合,集合中的元素不允许重复,访问集合中的元素只能根据元素自身来访问

2.collection与map概述
(1).collection是一个接口,是高度抽象出来的集合,它定义了集合的基本操作,它的实现类主要是list和set
list是有序集合,每个元素都有其索引,从0开始,list的实现类有:arrayLiat、linkedList、vector、stack。
set是不允许有重复元素的集合。实现类主要有hashset、treeset,hashset依赖于hashmap,也是通过hashmap实现的,treeset依赖于treemap,也是通过treemap实现的
那么,set是如何判断元素是否相同呢?
现有一个person类

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

进行存入集合的操作

public class ListTest {
    public static void main(String [] args){
        Set<Person> set=new HashSet();
        Person person=new Person();
        person.setName("张三");
        person.setAge(14);
        set.add(person);
        person=new Person();
        person.setName("王五");
        person.setAge(15);
        set.add(person);
        person=new Person();
        person.setName("王五");
        person.setAge(15);
        set.add(person);

        Iterator<Person> it= set.iterator();
        while(it.hasNext()){
            System.out.println(it.next().getName());
        }
    }
}

在这里插入图片描述
结果是三个元素都存进去了

改写一下person的equals方法,只有当姓名和年龄都相同的时候才判断为同一元素

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        Person person=null;
        if(o instanceof Person){
             person= (Person) o;
        }else{
            return false;
        }

        if (this.name == person.getName()&&this.getAge()==person.getAge()){ return true;}

        return false;
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

结果
在这里插入图片描述

姓名与年龄相同的存不进去了
所以,set是通过元素的equals方法来判断是否是重复元素
并且set中元素的位置是由hashcode决定的。

(2).map是映射接口,即键值对,map接口派生了一个抽象类AbstractMap,hashMap、treeMap、weakHashMap都继承了这个类,而hashtable没有继承这个类,但是它实现了map接口

(3).iterator是遍历集合的工具,也就是迭代器,用于迭代collection集合。

(4)Arrays和Collections是操作数组了集合的两个工具类

3.List接口
(1).ArrayList
是一个动态数组,它允许插入任何符合规则的数据,包括null,每个ArrayList都有个初始容量,该容量代表了数组的初始大小,随着数据的增加,容量也会不断的扩张(为原来的1.5倍),最好在初始化的时候指定大小,就不会浪费时间、效率
(2).LinkedList
是一个双向链表,不支持随机访问,只能从头到尾遍历,它提供了一些方法,使其可以当成堆栈和队列来使用
(3).vector是一个线程安全的动态数组,操作和list基本一致
(4).stack是一个堆栈,继承了vector,所以也是线程安全

4.set接口
(1).HashSet是一个没有重复元素的无序集合,由HashMap实现,通过一个HashMap保存元素,元素是存放在Key当做,Value统一使用一个Object对象
(2).TreeSet是一个有序集合,TreeSet支持两种排序,自然排序和比较排序,基于TreeMap实现

5.Map接口
(1).HashMap无序键值对,通过哈希表数据结构实现
(2).TreeMap有序键值对,通过红黑树实现

6.Collections类的使用
(1).排序操作
void reverse(List list):反转

public class ListTest {
    public static void main(String [] args){
        ArrayList list=new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
        Collections.reverse(list);
        System.out.println(list);
    }
}

在这里插入图片描述

void shuffle(List list),随机排序

public class ListTest {
    public static void main(String [] args){
        ArrayList list=new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
        Collections.shuffle(list);
        System.out.println(list);
    }
}

在这里插入图片描述

void sort(List list),按自然排序的升序排序

public class ListTest {
    public static void main(String [] args){
        ArrayList list=new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}

在这里插入图片描述

void sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑

public class ListTest {
    public static void main(String [] args){
        ArrayList list=new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s, String t1) {
                if(s.hashCode()<t1.hashCode()){
                    return 1;
                }else if(s.hashCode()==t1.hashCode()){
                    return 0;
                }
                return -1;
            }
        });
        System.out.println(list);
    }
}

在这里插入图片描述
如果s.hashCode<t1.hashCode时,返回-1,则按照升序排序,返回1,则按照降序排序,相等则放回0
第二种定制排序(排序对象实现comparable接口)
按年龄降序排序

public class Person implements Comparable<Person>{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public int compareTo(Person person) {
        if(this.getAge()<person.getAge()){
            return 1;
        }else if(this.getAge()==person.getAge()){
            return 0;
        }
        return -1;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ListTest {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        Person person = new Person();
        person.setAge(11);
        person.setName("张三");
        list.add(person);
        person = new Person();
        person.setAge(14);
        person.setName("李四");
        list.add(person);
        person = new Person();
        person.setAge(10);
        person.setName("王五");
        list.add(person);
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}

在这里插入图片描述
void swap(List list, int i , int j),交换两个索引位置的元素
void rotate(List list, int distance),旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。

(2).查找、替换操作
nt binarySearch(List list, Object key), 对List进行二分查找,返回索引,注意List必须是有序的
int max(Collection coll),根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
int max(Collection coll, Comparator c),根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
void fill(List list, Object obj),用元素obj填充list中所有元素
int frequency(Collection c, Object o),统计元素出现次数
int indexOfSubList(List list, List target), 统计targe在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素。

(3)同步控制,collections类提供了一些方法,可以将普通集合转为同步集合

public class ListTest {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
       Collections.synchronizedList(list);
       Set set=new HashSet();
       Collections.synchronizedSet(set);
       Map map=new HashMap();
       Collections.synchronizedMap(map);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值