Java se:集合

在这里插入图片描述

Collection接口

Collection 层次结构中的根接口。
Collection
		|--List
			|--ArrayList
			|--Vector
			|--LinkedList
		|--Set
			|--HashSet
			|--TreeSet
  • Collection接口的成员方法
    boolean add(E e)
    boolean remove(Object o)
    void clear()
    boolean contains(Object o)
    boolean isEmpty()
    int size()

Object[] toArray()
把集合转成数组,可以实现集合的遍历

Iterator iterator()
迭代器,集合的专用遍历方式

  • 集合的操作步骤:
    A:创建集合对象
    B:创建元素对象
    C:把元素添加到集合
    D:遍历集合

      			//创建集合对象
      			Collection c = new ArrayList();
      			
      			//创建并添加元素
      			c.add("hello");
      			c.add("world");
      			c.add("java");
      			
      		//遍历集合(迭代器)
      		Iterator it = c.iterator();
      		while(it.hasNext()) {
      			String s =(String) it.next();
      			System.out.println(s);
    

Iterator接口

对 collection 进行迭代的迭代器
依赖于集合而存在

  • 成员方法
    boolean hasNext()
    E next()

List接口

  • 特点:有序(存储顺序和取出顺序一致),可重复。
  • 成员方法
    void add(int index,E element)
    E remove(int index)
    E get(int index)
    E set(int index,E element)

ListIterator listIterator()
列表迭代器的特有功能;(了解)
可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。

ArrayList类

  • 底层数据结构是数组,查询快,增删慢。
    线程不安全,效率高。

Vector类

  • 底层数据结构是数组,查询快,增删慢
    线程安全,效率低

LinkedList类

  • 底层数据结构是链表,查询慢,增删快。
    线程不安全,效率高。
  • 特有功能:
    • 添加:
      addFirst()
      addLast()
    • 删除:
      removeFirst()
      removeLast()
    • 获取:
      getFirst()
      getLast()

泛型

  • 格式:
    <数据类型> 注意:该数据类型只能是引用类型。
  • 好处:
    避免强制类型转换
    更加安全
    运行时期的问题提前到了编译期
  • 泛型类:
    public class 类名<泛型类型1,…>
  • 泛型方法:
    public <泛型类型> 返回类型 方法名(泛型类型 .)
  • 泛型接口:
    public interface 接口名<泛型类型1…>
  • 泛型通配符:<?>
  • ? extends E:向下限定,E及其子类
  • ? extends E:向上限定,E及其父类

foreach/增强for

简化数组和Collection集合的遍历。本质是迭代器,用来替代迭代器

  • 格式:
  • for(元素数据类型 变量 : 数组或者Collection集合) {
    使用变量即可,该变量就是元素
    }
  • 增强for循环的目标不能为null。建议在使用前,先判断是否为null。

并发修改异常ConcurrentModificationException

  • 出现的现象:
    迭代器遍历集合,集合修改集合元素
  • 原因:
    迭代器是依赖于集合的,而集合的改变迭代器并不知道。
  • 解决方案:
    a:迭代器遍历,迭代器修改(ListIterator)
    元素添加在刚才迭代的位置
    b:集合遍历,集合修改(size()和get())
    元素添加在集合的末尾

静态导入

直接导入到方法的级别

  • 格式:import static 包名…类名.方法名;
  • 注意:
    方法必须静态
    如果多个类下有同名的方法,就不好区分了,还得加上前缀。

可变参数

写方法的时候,参数个数不明确,就应该定义可变参数。

  • 格式:修饰符 返回值类型 方法名(数据类型… 变量) {}
  • 注意:
    改变量其实是一个数组名
    如果一个方法有多个参数,并且有可变参数,可变参数必须在最后
  • 例如:
    asList(T… a)
    把数组转成集合。
    注意:这个集合的长度不能改变。

Set接口

  • 特点:无序,唯一

HashSet类

  • 底层数据结构是哈希表(是一个元素为链表的数组)
  • 特点:不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。
  • 哈希表底层依赖两个方法:hashCode()和equals() (自动生成即可)
  • 执行顺序:
    1.比较哈希值是否相同
    • 相同:执行equals()
      • true:元素重复,不添加
      • false:添加元素
    • 不同:把元素直接添加到集合

LinkedHashSet类

  • 特点:元素唯一,链表保证元素有序,哈希表保证元素唯一

TreeSet类

  • 底层数据结构是红黑树(是一个自平衡的二叉树)
  • 特点:
    自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序
    具体取决于使用的构造方法。
  • 实现排序:
    自然排序(元素具备比较性):让元素所属的类实现Comparable接口
public class Student implements Comparable<Student> {
}

比较器排序(集合具备比较性):让集合构造方法接收Comparator的实现类对象

		// 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
		// 而匿名内部类就可以实现这个东西
		TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
			@Override
			public int compare(Student s1, Student s2) {
				// 姓名长度
				int num = s1.getName().length() - s2.getName().length();
				// 姓名内容
				int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
						: num;
				// 年龄
				int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
				return num3;
			}
		});

Map接口

  • 概述:将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值。
  • Map接口与Collection接口不同:
    • Map 存储的是键值对形式的元素,键唯一,值可以重复。
    • Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。
    • Map集合的数据结构值针对键有效,跟值无关。Collection集合的数据结构是针对元素有效。
  • 成员方法:
    V put(K key,V value)
    V remove(Object key)
    void clear()
    boolean containsKey(Object key)
    boolean containsValue(Object value)
    boolean isEmpty()
    int size() //返回键值对的对数
  • V get(Object key) //根据键返回值
    Set keySet() //返回键的Set集合
    Collection values() //返回值
    Set<Map.Entry<K,V>> entrySet() //返回键值对
  • Map集合的遍历
    • 键找值:(常用
    • a:获取所有键的集合
      b:遍历键的集合,得到每一个键
      c:根据键到集合中去找值
Set<String> set = hm.keySet();
for(String key : set) {
	String value = hm.get(key);
	System.out.println(key+"---"+value);
}
    • 键值对对象找键和值
      a:获取所有的键值对对象的集合
      b:遍历键值对对象的集合,获取每一个键值对对象
      c:根据键值对对象去获取键和值
Set<Map.Entry<String,String>> set2 = hm.entrySet();
	for(Map.Entry<String,String> me : set2) {
	String key = me.getKey();
	String value = me.getValue();
	System.out.println(key+"---"+value);
}

HashMap类

  • 键是哈希表结构,可以保证键的唯一性
  • Hashtable和HashMap的区别?
    Hashtable:线程安全,效率低。不允许null键和null值
    HashMap:线程不安全,效率高。允许null键和null值

TreeMap类

  • 键是红黑树结构,可以保证键的排序和唯一性

集合的嵌套遍历

Collections类

  • 针对集合进行操作的工具类,可以对集合进行排序和查找等,都是静态方法
  • 成员方法:
    public static void sort(List list)
    public static int binarySearch(List<?> list,T key)
    public static T max(Collection<?> coll)
    public static void reverse(List<?> list)
    public static void shuffle(List<?> list) //随机置换
  • ArrayList存储自定义对象并排序
// 自然排序
Collections.sort(list);
// 比较器排序
// 如果同时有自然排序和比较器排序,以比较器排序为主
Collections.sort(list, new Comparator<Student>() {
	@Override
	public int compare(Student s1, Student s2) {
		int num = s2.getAge() - s1.getAge();
		int num2 = num == 0 ? s1.getName().compareTo(s2.getName()): num;
		return num2;
	}
});

大部分情况下使用foreach对集合进行遍历

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页