Java集合框架

(一)集合

  1. 概念:对象的容器,定义了对多个对象进行操作的常用方法,类似数组的功能

  2. 特点:长度不固定,只能存储引用类型

  3. 位置:Java.util.*

(二)Collection接口

  1. 特点:代表一组任意类型的对象,无序、无下标、不能重复

  2. 方法:

  • boolean add(Odject obj) —— 添加一个对象
  • boolean addAll(Collection c) —— 将一个集合中的所有对象添加到此集合中
  • void clear() —— 清空此集合中的所有对象
  • boolean contains(Odject o) —— 检测此集合中是否包含o对象
  • boolean equals(Odject o) —— 比较此集合是否与指定对象相等
  • boolean isEmpty() —— 判断此集合是否为空
  • boolean remove(Odject o) —— 在此集合中移除o对象
  • int size() —— 返回此集合中的元素个数
  • Object[] toArray() —— 将此集合转换成数组

Collection使用

import java.util.*;
​
public class Demo01 {
    public static void main(String[] args) {
        //创建集合
        Collection collection= new ArrayList();
        //1.添加元素
        collection.add("苹果");
        collection.add("橘子");
        collection.add("榴莲");
        System.out.println("元素个数:"+collection.size());
        System.out.println(collection);
        //2.删除元素
        collection.remove("榴莲");
        System.out.println("删除之后:"+collection.size());
        //3.遍历元素
        //使用增强for循环
        System.out.println("使用增强for循环");
        for (Object object:collection){
            System.out.println(object);
        }
        //使用迭代器
        System.out.println("使用迭代器");
        //hasNext(); ————有没有下一个元素
        //next(); ————获取下一个元素
        //remove(); ————删除当前元素
        Iterator it= collection.iterator();
        while(it.hasNext()){
            String s=(String)it.next();
            System.out.println(s);
        }
        //4.判断
        System.out.println(collection.contains("橘子"));
        System.out.println(collection.isEmpty());
    }
}

(三)List接口

  1. 特点:有序、有下标、元素可以重复

  2. 方法:

  • 有Collection中的所有方法
  • void add(int index,Object o) —— 在index位置插入对象o
  • boolean addAll(int index,Collection c) —— 将一个集合中的元素添加到此集合中的index位置
  • Object get(int index) —— 返回集合中指定位置的元素
  • List subList(int formIndex,int toIndex) —— 返回 formIndex和 toIndex之间的集合元素

List使用

  • 遍历元素

//使用 ListIterator迭代器
//和Iterator的区别:ListIterator可以向前或向后遍历,添加、删除、修改元素
        ListIterator listIterator=list.listIterator();
        System.out.println("使用列表迭代器从前往后");
        while (listIterator.hasNext()){
            System.out.println(listIterator.nextIndex()+","+listIterator.next());
        }
        System.out.println("使用列表迭代器从后往前");
        while (listIterator.hasPrevious()){
            System.out.println(listIterator.previousIndex()+","+listIterator.previous());
        }
  • 获取位置

System.out.println(list.indexOf("黄瓜"));

List实现类

ArrayList

  • 数组结构实现,查询快、增删慢,必须开辟连续的存储空间

  • JDK1.2版本,运行效率快、线程不安全

//创建集合
ArrayList arrayList=new ArrayList<>();
//遍历
ListIterator list=arrayList.listIterator();
System.out.println("使用列表迭代器从前往后");
        while (list.hasNext()){
            System.out.println(list.nextIndex()+","+list.next());
        }
System.out.println("使用列表迭代器从后往前");
        while (list.hasPrevious()){
            System.out.println(list.previousIndex()+","+list.previous());
        }

Vector

  • 数组结构实现,查询快、增删慢

  • JDK1.0版本,运行效率慢、线程安全

public class Demo04 {
    public static void main(String[] args) {
        Vector vector = new Vector();
        vector.add("abc");
        vector.add("def");
        vector.add("ghi");
        //使用枚举器遍历
        Enumeration en=vector.elements();
        while (en.hasMoreElements()){
            String s=(String)en.nextElement();
            System.out.println(s);
        }
    }
}

LinkedList

  • 链表结构实现,增删快、查询慢,无需开辟连续的存储空间

(四)泛型

  • JDK1.5新特性,本质是参数化类型,把类型作为参数传递

  • 形式:泛型类、泛型接口、泛型方法

  • 语法:<T,....> T称为类型占位符,表示一种引用类型,编写多个时用逗号隔开

  • 好处:

    • 提高代码的重用性

    • 防止类型转换异常,提高代码的安全性

泛型类

语法:类名<T,...>

使用泛型类创建对象

注意:1、泛型只能使用引用类型

2、不同泛型类型对象之间不能相互赋值

public class MyGeneric<T> {
    //使用泛型 T
    //创建变量
    T t;
    //泛型作为方法的参数
    public void show (T t){
        System.out.println("泛型类:"+t);
    }
    //泛型作为方法的返回值
    public T getT(){
        return t;
    }
}

泛型接口

语法:接口名<T,...>

public interface MyInterface<T> {
    String name="Joyce_yu";
    T serve(T t);
}
public class MyInterfaceImpl1 implements MyInterface<String>{
    @Override
    public String serve(String t) {
        //TODO AUTO-generated method stub
        System.out.println("泛型接口1:"+t);
        return t;
    }
}
public class MyInterfaceImpl2<T>  implements MyInterface<T>{
    @Override
    public T serve(T t) {
        System.out.println("泛型接口2:"+t);
        return t;
    }
}

泛型方法

语法:<T,...>返回值类型

public class MyGenericMethod {
    public <T> T show(T t){
        System.out.println("泛型方法:"+t);
        return t;
    }
}

运行测试

public class TestGeneric {
    public static void main(String[] args) {
        MyGeneric<String>myGeneric1=new MyGeneric<String>();
        myGeneric1.t="hello";
        myGeneric1.show("hello,everyone!");
        String string=myGeneric1.getT();
​
        MyGeneric<Integer>myGeneric2=new MyGeneric<Integer>();
        myGeneric2.t=100;
        myGeneric2.show(200);
        Integer integer=myGeneric2.getT();
​
        //泛型接口
        MyInterfaceImpl1 impl1=new MyInterfaceImpl1();
        impl1.serve("Joyce_yu");
​
        MyInterfaceImpl2 impl2=new MyInterfaceImpl2();
        impl2.serve(1000);
​
        //泛型方法
        MyGenericMethod myGenericMethod=new MyGenericMethod();
        myGenericMethod.show("TFBoys");
        myGenericMethod.show(520);
    }
}

 运行结果

 

 泛型集合

  1. 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致

  2. 特点:

  • 编译即可检查,而非运行时抛出异常
  • 访问时不必类型转换(拆箱)
  • 不同泛型之间引用不能相互赋值,泛型不存在多态

(五)Set接口

  1. 特点:无序、无下标、元素不可重复

  2. 方法:全部继承自Collection中的方法

HashSet

  1. 存储结构:哈希表(数组+链表+红黑树)

  2. 存储过程:

  • 根据hashcode计算保存位置,如果此位置为空,则直接保存,如果不为空则执行第二步
  • 执行equals方法,如果结果为true,则认为是重复,否则,形成链表补充内容

     3. 补充内容

 

TreeSet

  • 基于排列顺序实现元素不可重复

  • 实现了SortedSet接口,对集合元素自动排序

  • 元素对象的类型必须实现Comparable接口,指定排序规则

  • 通过CompareTo方法确定是否为重复元素

import java.util.Comparator;
import java.util.TreeSet;
​
public class Demo05 {
    public static void main(String[] args) {
        //创建集合,并指定比较规则
        TreeSet<String> treeSet=new TreeSet<>(new Comparator<String>(){
            @Override
            public int compare(String s1, String s2) {
                int n1=s1.length()-s2.length();
                int n2=s1.compareTo(s2);
                return n1==0?n2:n1;
            }
        });
        treeSet.add("World");
        treeSet.add("China");
        treeSet.add("Liaoning");
        treeSet.add("Fushun");
        treeSet.add("Xinbin");
        treeSet.add("Shangjiahe");
        treeSet.add("Wulong");
        System.out.println(treeSet);
​
    }
}

(六)Map接口

  1. 特点:存储键值对,键不能重复、值可以重复,无序、无下标

  2. 方法:

  • V put(K key,V value) —— 将对象存入到集合中,关联键值;key重复则覆盖原值
  • Object get(Object,key) —— 根据键获取对应的值
  • Set <K> —— 返回所有key
  • Collection <V> values() —— 返回包含所有值的Collection集合
  • Set<Map.Entry<K,V>> —— 键值匹配的Set集合
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
​
public class Demo06 {
    public static void main(String[] args) {
        //创建Map集合
        Map<String,String> map=new HashMap<>();
        //1.添加元素
        map.put("cn","中国");
        map.put("uk","英国");
        map.put("us","美国");
        System.out.println("元素个数:"+map.size());
        System.out.println(map.toString());
        //2.删除
        map.remove("us");
        System.out.println("删除之后:"+map.size());
        //3.遍历
        //entrySet();效率高于 keySet();
        //3.1使用 keySet();
        Set<String> keyset=map.keySet();
        for (String key:map.keySet()){
            System.out.println(key+"--keySet--"+map.get(key));
        }
        //3.2使用 entrySet();
        Set<Map.Entry<String,String>> entries=map.entrySet();
        for (Map.Entry<String,String> entry:entries){
            System.out.println(entry.getKey()+"--entrySet--"+entry.getValue());
        }
        //4.判断
        System.out.println(map.containsKey("cn"));
        System.out.println(map.containsValue("法国"));
    }
}

运行结果

HashMap

  • JDK1.2版本,线程不安全,运行效率快;允许null作为key或value

  • 存储结构:哈希表(数组+链表+红黑树)

TreeMap

存储结构:红黑树

(七)Collections

package 集合框架;
​
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
​
public class Demo07 {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(20);
        list.add(5);
        list.add(12);
        list.add(30);
        list.add(6);
        //sort排序
        System.out.println("排序前:"+list.toString());
        Collections.sort(list);
        System.out.println("排序后:"+list.toString());
        //binarySearch二分查找
        int i=Collections.binarySearch(list,13);
        System.out.println("二分查找出的位置是:"+i);
        //copy复制
        List<Integer> dest=new ArrayList<>();
        for (int k = 0; k <list.size() ; k++) {
            dest.add(0);
        }
        Collections.copy(dest,list);
        System.out.println("复制后:"+dest.toString());
        //reverse反转
        Collections.reverse(list);
        System.out.println("反转后:"+list);
        //shuffle打乱
        Collections.shuffle(list);
        System.out.println("打乱后:"+list);
        //补充:list转成数组
        Integer[] arr=list.toArray(new Integer[10]);
        System.out.println("设置数组大小为:"+arr.length);
        System.out.println("list转成数组:"+Arrays.toString(arr));
        //数组转成集合
        String[] names={"张三","李四","王五"};
        List<String> list2=Arrays.asList(names);
        System.out.println("数组转成集合:"+list2);
    }
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头酱酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值