黑马程序员——Java基础---集合总结

本文深入讲解Java集合框架的基础概念,包括Collection、List、Set、Map等核心接口与类的使用方法,以及各种容器的特性与应用场景。
------- android培训java培训、期待与您交流! ---------

一,集合概述

集合是存储对象最常用的一种方式。关于集合部分的知识点比较零碎,学习后一定要复习。

 

1,集合类的出现背景:

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储

2,集合与数组的异同

相同点:集合和数组都是一个容器。

不同点:集合长度是可变的,可以存储对象,也只能存储对象;

                   数组长度是固定的,可以存储对象,也可以存储基本数据类型。

3,集合的特点

集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

4,集合结构

因为容器数据结构的不同,出现了容器的体系,经过不断的向上抽取,形成了如下的集合类关系图


二,collection

由上面的图可知,collection是集合类的顶层(根)接口。

Collection接口中定义了集合的共性方法:

1,添加:

boolean add(E); 确保此Collection包含指定的元素

boolean addAll(Collection); 将指定Collection中的所有元素都添加到此Collection中

2,删除

boolean remove(Object); 从此 Collection中移除指定元素的单个实例,如果存在的话

boolean removeAll(Collection); 移除此Collection中那些也包含在指定Collection中的所有元素

void clear();移除此Collection 中的所有元素

3,判断

boolean contains(Object); 如果此 Collection包含指定的元素,则返回 true

Boolean isEmpty();判断容器中是否含有元素,依据size方法

4,获取

Iterator iterator();迭代器

5,获取交集

retainAll(Collection);

a.retainAll(b);将a集合中只保留和b集合共有的元素

6,获取个数

Int size();返回集合中的元素数

7,转成数组

T[] toArray(T[] t);

 

 

Collection接口下有两个子接口:List(列表),Set(集)

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

Set:元素是无序的,元素不可以重复。

 

2.1,List

List中特有的一些常用方法

1, 添加:add(index,obj),

2,删除:remove(index)

3,获取:get(index)

4,索引:indexOf(obj)、lastIndexOf(obj)

5,获取字列表:subList(start,end)

6,list集合支持迭代器ListIterator:

         Iterator在迭代时,只能对元素进行获取(next())和删除(remove())操作;

         ListIterator在迭代list集合时,可添加(add(obj))和修改(set(obj))元素

 

List组成:

1,ArrayList:底层是数组数据结构,线程不同步,特点:查询速度快,增删稍慢。

2,LinkedList:底层是链表数据结构,线程不同步,特点:查询速度稍慢,增删速度很快。

3,Vector:底层是数组数据结构,线程同步,效率低,在jdk1.2版本后被ArrayList替代。

 

与其他两个不同,LinkedList有一些自己特有的方法:

1,addFirst();

2,  addLast();

3,getFirst();

4,getLast();

5,removeFirst();

6,removeLast();

如果在获取和删除时,容器中没有元素,会抛出异常NoSuchElementException;jdk1.6后,没有元素返回null;

2.2,set

Set集合中没有特有的方法,所有的方法直接继承自Collection。

Set集合组成:HashSet和TreeSet

1, HashSet:底层数据结构是哈希表,线程不同步,存取速度快。判断元素唯一方式:先判断元素的hashCode值是否相同,若相同,再判断元素的equals方法是否为true。

注意:子类LinkedHashSet基于哈希表,又融入了链表,可以对Set集合进行增删提高效率。

示例:

/*
 * 在hashSet集合中存入自定义对象,去除重复的元素,并取出元素
 * 思路:
 * 1,描述手机,对手机的一些属性进行封装
 * 2,定义容器,存入手机对象
 * 3,使用迭代器取出容器内的对象
 * 4,打印结果
 * 
 * */
import java.util.HashSet;
import java.util.Iterator;

public class HashSet1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HashSet<Phone> h = new HashSet<Phone>();
		h.add(new Phone("魅族", 5));
		h.add(new Phone("苹果", 4));
		h.add(new Phone("小米", 3));
		h.add(new Phone("华为", 4));
		
		h.add(new Phone("华为", 4));
		Iterator<Phone> it = h.iterator();
		while(it.hasNext()){
			Phone p = (Phone) it.next();
			System.out.println(p.getBRAND()+"---"+p.getSIZE());
		}
		
	}

}

class Phone{
	private String BRAND;
	private int SIZE;
	
	public Phone(String brand,int size) {
		// TODO Auto-generated constructor stub
		this.BRAND = brand;
		this.SIZE = size;
	}

	public String getBRAND() {
		return BRAND;
	}

	public void setBRAND(String bRAND) {
		BRAND = bRAND;
	}

	public int getSIZE() {
		return SIZE;
	}

	public void setSIZE(int sIZE) {
		SIZE = sIZE;
	}
	
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(!(obj instanceof Phone)){
			return false;
		}    
		Phone p=(Phone)obj;  
        return this.BRAND.equals(p.BRAND)&&this.SIZE==p.SIZE;
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return this.BRAND.hashCode()+this.SIZE;
	}
	
}

1, TreeSet:底层数据结构是二叉树结构。判断元素唯一方式:通过比较方法的return 0来判断元素是否相同。

treeSet可以对Set集合中的元素进行排序,原因是TreeSet类实现了Comparable接口,强制对元素进行比较。

两种排序方式:

1, 让元素自身具有比较性。也就是实现Comparable接口,覆盖compareTo方法,这种方式作为元素的自然排序,也可以说是默认排序。

示例:

import java.util.Iterator;
import java.util.TreeSet;

public class TreeSet1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<Person1> t = new TreeSet<Person1>();
		t.add(new Person1("小明", 21));
		t.add(new Person1("小明", 21));
		t.add(new Person1("小明", 22));
		t.add(new Person1("小红", 21));
		t.add(new Person1("小刚", 23));
		
		Iterator<Person1> it = t.iterator();
		while(it.hasNext()){
			Person1 p = it.next();
			System.out.println(p.getName()+"---"+p.getAge());
		}
	}

}

class Person1 implements Comparable{
	private String name;
	private int age;
	
	public Person1(String name,int age) {
		// TODO Auto-generated constructor stub
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName()  
    {  
        return name;  
    }  
  
    public int getAge()  
    {  
        return age;  
    }  
	
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		Person1 p = (Person1) o;
		if(this.age==p.age)  
            return this.name.compareTo(p.name);  
        return this.age-p.age;  
	}
}

2,自定义比较器。若元素自身不具有比较性,或者元素自身具有的比较性不是自己所需要的,这时只能让容器自身具备。

示例:

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSet2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<Person2> t = new TreeSet<Person2>(new CompareTest());
		t.add(new Person2("小明", 21));
		t.add(new Person2("小明", 21));
		t.add(new Person2("小明", 22));
		t.add(new Person2("小红", 21));
		t.add(new Person2("小刚", 23));
		
		Iterator<Person2> it = t.iterator();
		while(it.hasNext()){
			Person2 p = it.next();
			System.out.println(p.getName()+"---"+p.getAge());
		}
	}

}

class Person2 implements Comparable{
	private String name;
	private int age;
	
	public Person2(String name,int age) {
		// TODO Auto-generated constructor stub
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName()  
    {  
        return name;  
    }  
  
    public int getAge()  
    {  
        return age;  
    }  

	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		Person2 p = (Person2) o;
		if(this.age==p.age)  
            return this.name.compareTo(p.name);  
        return this.age-p.age;  
	}
}

//定义一个比较器,以姓名长度(name)和年龄(age)比较
class CompareTest implements Comparator<Person2>{

	@Override
	public int compare(Person2 o1, Person2 o2) {
		// TODO Auto-generated method stub
		int res=new Integer(o1.getName().length()).compareTo(new Integer(o2.getName().length()));  
        if (res==0)  
        {  
            return new Integer(o1.getAge()).compareTo(o2.getAge());  
        }  
        return res;  
	}
	
}

那么多容器,如何判断容器的数据结构?

可以通过容器的命名就可以明确其数据结构:

ArrayList:数组Array

LinkedList:链表link

HashSet、HashMap:哈希表hash

TreeSet、TreeMap:二叉树tree

 

三,迭代器Iterator

迭代器是所有Collection集合共性的取出方式。

1,一般通过两个方法来完成:

hasNext():判断容器中是否有元素

next():取出元素,注意:next方法每调用一次,指针就会放下走。

2,使用方式:

ArrayList a=newArrayList();//创建一个集合

Iterator it=a.iterator();//获取一个迭代器,用于取出集合中的元素。

第一种方式:

for(Iterator iter = a.iterator();iter.hasNext();  )

      {

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

      }

第二种方式:

      Iterator iter = a.iterator();

      while(iter.hasNext())

       {

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

       }

 

1, 使用迭代器注意事项:

       迭代器的next方法自动向下取元素,在去之前使用hasNext()判断是否有元素,避免出现NoSuchElementException。

迭代器的next方法返回值类型是Object,所以要记得类型转换。

 

 

四,map集合

Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)

       特点:一次存入一对元素,以键值对的形式存在,必须保证键的唯一性。

       注意:当对象之间存在映射关系时,首先想到的就是使用map集合

 

4.1 map集合的常用方法

 1、添加

       put(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。

       putAll(Map <? extends K,? extends V> m);//添加一个集合

2、删除

       clear();//清空

       remove(Object key);//删除指定键值对

3、判断

       Boolean containsKey(key);//判断键是否存在

       Boolean containsValue(value)//判断值是否存在

       BooleanisEmpty();//判断是否为空

4、获取

       get(key);//通过键获取对应的值

       int size();//获取集合的长度

       Collection<V>value();//获取Map集合中所以的值,返回一个Collection集合

5,取出:原理是将map集合转成Set集合后,通过迭代器取出。

       Set<Map.Entry<K,V>>entrySet();将map集合中的键值映射关系打包成一个Map。Entry对象。

       Set<K>  keySet();将map集合中所有的键取出存入set集合,再通过get方法获取键对应的值。

注:

HashMap集合可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。

HashMap集合可以存入null键null值。

 

4.2 Map组成结构:

1,HashTable:底层是哈希表数据结构,线程同步,不能存入null键、null值。效率低,被hashMap取代。

2,HashMap:底层是哈希表数据结构,线程不同步,可以存入null键、null值。保证键的唯一性:覆盖hashCode方法和equals方法。

3,TreeMap:底层是二叉树数据结构,可以对map集合中的键进行排序。使用Comparable或Comparator进行比较排序。通过return 0 判断键的唯一性。


------- android培训java培训、期待与您交流! ---------


(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值