JAVA关于Collectin集合和List集合的常用方法详解

本文深入解析Java集合框架,包括Collection、List、Set、Map等核心接口及其实现类的特性与应用场景,探讨数组与集合的区别,以及List集合的特殊功能。

集合

面向对象语言对事的体现都是以对象的形式,为了方便对对象的操作,JAVA提供了集合类。
数组与集合的区别:
	*长度区别
		数组的长度是固定的而集合的长度是可以改变的
	*存储元素类型的区别
		数组既可以存储基本类型数据还可以存储引用类型数据,而集合只能存储引用类型的数据
	*内容区别:
		数组只能存储相同数据类型的元素,而集合可以存储不同数据类型的元素
	集合有三种重要的类型:
		List:一个有序的集合,可以存放重复的数据
		Set:一个无序的集合,不允许存放重复的数据
		Map:一个无序集合,集合中包括一个键对象,一个值对象,键对象不允许重复,值对象可以重复

Collection集合

因为Collection集合是接口,不允许实例化,所以得用多态的形式实例化。
Collection集合下又有两个子接口:
	List(存储元素特点):有序可重复
	Set:无序不可重复
Collection集合的功能:
	添加功能:
		boolean add(Object obj):添加一个元素
		boolean addAll(Collection c):添加一个集合的元素  (给一个集合添加进另一个集合中的所有元素)
	删除功能
		void clear():移除所有元素
		boolean remove(Object o):移除一个元素
		boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素,如果没有交集元素 则删除失败 返回false
	判断功能
		boolean contains(Object o):判断集合中是否包含指定的元素	
		boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)
		boolean isEmpty():判断集合是否为空
	获取功能
		Iterator<E> iterator()
	长度功能
		int size():元素的个数
	交集功能
		boolean retainAll(Collection c):获取两个集合的交集元素(交集:两个集合都有的元素)
	集合转换为数组
		Object[] toArray()
public static void main(String[] args) {
    Collection c=new ArrayList();
    c.add("abc");//添加元素abc
    Collection c1=new ArrayList();
    c1.addAll(c);//将集合c元素全部添加到c1中
    c1.clear();//将c1集合清空
    c.remove("abc");//移除c中的"abc"元素
    c.add("abc");
    System.out.println(c.contains("abc"));//判断c集合是否包含"abc"
    System.out.println(c.isEmpty());//判断c集合是否为空
    Collection c2=new ArrayList();
    c2.add("abc");
    c2.add("abcd");
    c2.add("abcde");
    c2.retainAll(c);//使c2集合保留c集合中的元素
    Iterator it=c2.iterator();//调用c2集合的迭代器
    //使用集合判断,要是下一指针指向有元素,就输出。
    while (it.hasNext()){
        System.out.println(it.next());
    }
    System.out.println(c2.removeAll(c));//因为c2和c集合的元素一样,所以c2移除c集合元素成为了空集合
    Object[] o=c.toArray();//将集合转换为数组,并使用size()与循环输出
    for (int i = 0; i <c.size() ; i++) {
        System.out.println(o[i]);
    }
}
迭代器的原理
为什么迭代器要定义为接口?
	如果迭代器是一个类,在我们想要调用该类的方法时,我们需要创建该类的对象,但是JAVA中有许多集合类的数据结构不同,存储方式和遍历方式不同,所以不能定义迭代器类
List集合
List集合接口下有三个实现类
	ArrayList:底层采用的是数组存储元素的,所以ArrayList集合适合查询,不适合随机增删元素
	LinkedList:底层采用的是双向链表数据结构存储数据,适合随机增删元素,不适合查询
	Vector:底层和ArrayList集合相同,但是在多线程的情况下,但是Vector是线程安全的,效率低
List集合功能
	void add(int index,E element):	在指定索引处添加元素
	E remove(int index):移除指定索引处的元素  返回的是移除的元素
	E get(int index):获取指定索引处的元素
	E set(int index,E element):更改指定索引处的元素 返回的而是被替换的元素
//List集合是有序的,元素可重复
public static void main(String[] args) {
    List list=new ArrayList();
    //向list集合中添加元素
    list.add("abc");
    list.add("zhouyuyang");
    list.add(1,"liao");
    list.add(0,"zhaorunfa");
    list.remove(2);//移除索引为2的元素
    System.out.println(list.set(1, "liao"));//更改指定索引处的元素,并且返回被更改元素
    System.out.println(list.get(0));//得到指定位置元素
    System.out.println(list.size());
    Iterator it=list.iterator();
    while (it.hasNext()){
        System.out.println(it.next());
    }
}
List集合特有的遍历功能
	List集合可以用for循环与size()和get()方法进行遍历
 public static void main(String[] args) {
        List list=new ArrayList();
        list.add("zhaorunfa");
        list.add("llll");
        list.add(2312);
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));
        }
 }
ListIterator迭代器特有的功能
	ListIterator继承Iterator,可以使用Iterator的方法
	ListIterator的特有功能
		boolean hasPrevious():			是否存在前一个元素					
		E previous():					返回列表中的前一个元素
	有了这个方法,就可以进行反向遍历
并发修改异常
	若我们使用Iterator迭代器进行迭代的过程中,对集合进行增删操作的话,就会出现并发修改异常。
	原因是迭代过程依赖集合,我们往集合添加好元素之后,获取迭代器的时候迭代器已经知道集合的元素个数了,那我们在遍历的过程中通过集合的增删方法操作元素,就会改变集合的元素个数,就会出错。
	使用ListIterator迭代器的自有的添加方法就可以解决该问题。
 public static void main(String[] args) {
        List list=new ArrayList();
        list.add("zhaorunfa");
        list.add("aa");
        list.add("bb");
        list.add(1213);
        list.add("aa");

        /*
        //出现ConcurrentModificationException
        Iterator it=list.iterator();
        while (it.hasNext()){
            String str=(String) it.next();
            if(str.equals("aa")){
                list.add("bbb");
            }
        }

         */
        ListIterator it=list.listIterator();
        while (it.hasNext()){
            Object str=it.next();
            if(str.equals("aa")){
                it.add("bbb");

            }
        }
        System.out.println(list);
         while (it.hasPrevious()){
            System.out.println(it.previous());
        }
<think> 我们有一个需求:逐行解释包含采集表、区域表用户表的Django模型代码并说明用法。 根据引用[1]中提到的,在Django中创建模型是在models.py文件中定义数据结构。 我们将创建三个模型:采集表(可能用于存储采集的数据)、区域表(可能用于存储区域信息)用户表(存储用户信息,但注意Django已有内置用户模型,通常我们会扩展或使用内置的)。 假设: 1. 采集表(Collection)包含采集的数据字段,比如酒店名称、价格等(参考引用[3]中提到的酒店信息)。 2. 区域表(Area)可能用于存储区域信息,比如景区名称等。 3. 用户表(User)我们可能会扩展Django内置用户模型。 注意:在Django中,用户模型通常使用内置的`AbstractUser`或`AbstractBaseUser`进行扩展。 下面我们将编写这三个模型的代码,并逐行解释。 首先,我们需要导入必要的模块。 </think> ### 逐行解释 Django 模型代码(采集表、区域表、用户表)及用法 ```python from django.db import models from django.contrib.auth.models import AbstractUser ``` 1. **导入模块** - `from django.db import models`: 导入 Django 的模型基类,用于定义数据库表结构 - `from django.contrib.auth.models import AbstractUser`: 导入 Django 内置的用户抽象类,用于自定义用户模型[^1] --- ```python class Area(models.Model): name = models.CharField("区域名称", max_length=100, unique=True) code = models.CharField("区域代码", max_length=10, unique=True) parent = models.ForeignKey( 'self', on_delete=models.SET_NULL, null=True, blank=True, related_name='children' ) ``` 2. **区域表模型 (Area)** - `class Area(models.Model)`: 定义区域表,继承自 Model 基类 - `name = models.CharField(...)`: 区域名称字段,字符类型,最大长度100,唯一约束 - `code = models.CharField(...)`: 区域代码字段,用于行政区划编码 - `parent = models.ForeignKey(...)`: 自关联外键,实现区域层级关系[^2] - `'self'`: 指向自身模型 - `on_delete=models.SET_NULL`: 父区域删除时子区域置空 - `related_name='children'`: 反向查询名称 --- ```python class User(AbstractUser): ROLE_CHOICES = [ ('admin', '管理员'), ('collector', '采集员'), ('auditor', '审核员'), ] role = models.CharField("用户角色", max_length=20, choices=ROLE_CHOICES, default='collector') area = models.ForeignKey(Area, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="管辖区域") ``` 3. **用户表模型 (User)** - `class User(AbstractUser)`: 自定义用户模型,扩展 Django 内置用户[^1] - `ROLE_CHOICES`: 用户角色选项定义 - `role = models.CharField(...)`: 用户角色字段,使用选项约束 - `area = models.ForeignKey(...)`: 关联区域表,表示用户管辖范围 - `on_delete=models.SET_NULL`: 区域删除时用户关联置空 --- ```python class Collection(models.Model): STATUS_CHOICES = [ ('draft', '草稿'), ('submitted', '已提交'), ('approved', '已审核'), ('rejected', '已驳回'), ] name = models.CharField("采集项名称", max_length=200) data = models.JSONField("采集数据", default=dict) status = models.CharField("状态", max_length=20, choices=STATUS_CHOICES, default='draft') area = models.ForeignKey(Area, on_delete=models.PROTECT, verbose_name="所属区域") collector = models.ForeignKey( User, on_delete=models.CASCADE, related_name='collections', verbose_name="采集员" ) created_at = models.DateTimeField("创建时间", auto_now_add=True) updated_at = models.DateTimeField("更新时间", auto_now=True) ``` 4. **采集表模型 (Collection)** - `STATUS_CHOICES`: 采集项状态选项 - `name`: 采集项名称 - `data = models.JSONField(...)`: 存储结构化采集数据(如酒店信息)[^3] - `status`: 流程状态字段 - `area`: 关联所属区域,`on_delete=models.PROTECT` 防止误删区域 - `collector`: 关联采集员用户 - `related_name='collections'`: 用户反向查询所有采集项 - `created_at/updated_at`: 自动管理的时间戳字段 --- ### 模型用法示例 1. **创建区域层级** ```python province = Area.objects.create(name="浙江省", code="ZJ") city = Area.objects.create(name="杭州市", code="HZ", parent=province) ``` 2. **创建采集员用户** ```python user = User.objects.create_user( username="collector_li", password="securepwd123", role="collector", area=city ) ``` 3. **创建采集项** ```python hotel_data = { "name": "西湖大酒店", "price": 680, "rating": 4.8, "features": ["湖景房", "免费停车"] } Collection.objects.create( name="西湖区酒店采集", data=hotel_data, area=city, collector=user ) ``` 4. **查询操作** ```python # 获取杭州所有待审核采集项 pending_items = Collection.objects.filter( area__name="杭州市", status="submitted" ) # 获取用户管辖区域 user_area = user.area.children.all() # 下级区域 ``` 5. **更新状态** ```python item = Collection.objects.get(id=101) item.status = "approved" item.save() ``` ### 设计要点说明 1. **数据关系** - 用户→区域:多对一(每个用户负责特定区域) - 区域→采集项:一对多(每个区域有多个采集项) - 用户→采集项:一对多(用户创建多个采集项) 2. **扩展性** - JSONField 灵活存储不同结构的采集数据[^3] - 状态机设计支持工作流扩展 - 区域层级支持无限级联(省→市→区→街道) 3. **权限控制** 通过用户角色字段实现: ```python def can_approve(user): return user.role == 'auditor' or user.is_superuser ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值