集合框架(简介、Collection方法、迭代器,ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证,Vector,LinkedList,ArrayList中的重复元素去重及其底层原)

1、集合框架(简介、Collection方法、迭代器)

集合框架中提供了一个内部类专门操作集合中的元素,这个内部类就是迭代器
数据结构
集合框架的由来:数据多了用对象进行存储,对象多了用集合来进行存储。
而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从而形成了集合框架这一体系。
Collection方法
如图所示
在这里插入图片描述

演示结果如下
在这里插入图片描述

迭代器
如图所示
在这里插入图片描述

错误演示

Iterator it = a1.iterator();
		while(it.hasNext()) {
		Object obj = it.next();
		a1.remove(obj);
		}

在这里插入图片描述
原因:
出现了并发问题。两个对象同时操作了同一个变量,所以不能这样删除集合里的元素

2、集合框架List(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)

**
* Collection
1. List 有序 元素可以重复 因为该集合体系有索引
2. Arraylist 数组结构 增删慢,查询快 有连续下标 线程不同步(没有synchronized(索契标)) 增长因子为1.5
* 内部表示如下:
* 在这里插入图片描述
增长因子为1.5 论证代码如下
在这里插入图片描述
效果如下:
在这里插入图片描述
在这里插入图片描述
解释增长因子(1.5):
原数组的默认长度为10,一旦超过这种长度它的长度就会以原来的数组长度情况下乘以1.5,取整。
例如一开始默认为10,超过之后就是10
1.5,结果为15-----以此类推超过15后就是10
1.51.5,取整后为22-----超过22后就是101.51.51.5,取整后为22。因此可以得出增长因子的性质

    1. vector 数组结构 增删改查都慢 有连续下标 线程同步(有synchronized(索契标)) 增长因子2
      list集合的调优
      * 内部表示如下:
      * 在这里插入图片描述
      增长因子为2 论证代码如下
      在这里插入图片描述
      在这里插入图片描述
      解释增长因子(2):
      原数组的默认长度为10,一旦超过这种长度它的长度就会以原来的数组长度情况下乘以2,取整。
      例如一开始默认为10,超过之后就是102,结果为20-----以此类推超过20后就是1022,取整后为40-----超过40后就是10222,取整后为80。因此可以得出增长因子的性质
      1. Linkedlist 链表结构 增删快,查询慢 没有连续下标
    • 链表结构 如图所示
    • 在这里插入图片描述
      解释:小红要去找小明,她先找到小狗问小狗认识小明嘛,小狗不认识,但他认识小马,就问小马认识小马嘛,小马认识,所以小红就找到了小明,这就是我们所说的链表结构。
      这就表示了这种结构查询慢,但它的优点就是增删快
      列如:如图所示:
      在这里插入图片描述
      解释:要进行删除和增加操作的时候,只需要让小狗记住小马就行了,直接在他们中间进行增删,这样就不会影响到其它的内容,这样就提高了增删速度。
  • 5.Set 无序 元素不可以重复
    • List:凡是可以操作角标的方法都是该体系所特有的方法
    • Add(index,element)
    • Add(index,Collection)
    • Remove(index)
    • Set(index,element)
    • Get(index)
    • subList(from,to)
    • listIterator()
    • index(element)
    • list集合所特有的迭代器,ListIterator是Iterator的子接口
    • 在迭代时,不可以通过集合对象的方法操作集合中的元素;
    • 因为会发生并发修改异常(ConcurrentModificationException);
    • 所以,在迭代时,只能通过迭代器来操作元素,课时Iterator的方法是有限的,Iterator只提供了判断、
    • 取出、删除的操作;
    • 如果想要有其他的操作,如添加、修改等,就需要使用其子接口ListIterator,该接口只能list集合的listIterator方法来获取
      3、Iterator与ListIterator的区别
      在这里插入图片描述
      ListIterator可以顺着获取值也可以倒着获取值

      运行结果 如图所示:
      在这里插入图片描述
      */

3、集合框架Vector

在这里插入图片描述
只需要了解它的遍历方式是特殊的就行(了解)

4、集合框架LinkedList

**
链表的数据结构:
上面已经展示过了(如果有疑问可以看一下上面的详细介绍)

  • 特有方法
    addFirst();
    addLast();
    获取元素但是不删除元素,如果集合中没有元素,会出现NoSuchElementException
    getFirst();
    getLast();
    获取元素的同时会删除元素,如果集合中没有元素,会出现NoSuchElementException
    removeFirst();
    removeLast();
    在jdk1.6出现了替代方法
    offerFirst()
    offerLast()
    peekFirst();
    peekLast();
    获取元素的同时会删除元素,如果集合中没有元素,会返回null
    pollFirst();
    pollLast();
    由于是链表结构,当前节点能够记住上一个节点、以及下一个节点,所有有带First、last的方法存在。
    模拟队列以及堆栈 如图所示:
    在这里插入图片描述
    堆栈:先进后出 子弹夹

    在这里插入图片描述
    结果:
    在这里插入图片描述
    执行移除方法后的结果 如图所示:
    在这里插入图片描述
    队列:先进先出 水管
    在这里插入图片描述
    执行移除方法后的结果 如图所示:
    在这里插入图片描述
    5、集合框架ArrayList中的重复元素去重及其底层原理
    判断list 集合中元素是否相同,依据的是元素的equals方法
    Contains调用了equals
    Remove调用了equals
    list中存储的是字符串,而string的equals方法就是比的字符串值
    字符串去重
    代码如图所示
    在这里插入图片描述
    对象类型去重(同姓名同年龄视为同一个人)
    思路
    1、对人进行描述,将数据封装进对象
    2、将对象放入容器
    3、去重
    集合list中Contains方法调用时,调用了equals方法验证

代码如下:

package com.dengrenli.list;

import java.util.ArrayList;

/**
 * 如何取出list中的集合元素
 * @author machenike
 *
 */
public class ArrayListRepeatDemo1 {
	 public static void main(String[] args) {
			ArrayList a1=new ArrayList();
			a1.add(new Person("aa", 12));
			a1.add(new Person("bb", 13));
			a1.add(new Person("cc", 43));
			a1.add(new Person("dd", 23));
			a1.add(new Person("ee", 23));
			//a1.add(new Person("aa", 12));
			a1.remove(new Person("aa", 12));
			System.out.println(a1.size());
			//调用去重方法
//			ArrayList newall=repeatList(a1);
//			System.out.println(newall.size());
		}

		   //去重复元素的方法
		private static ArrayList repeatList(ArrayList a1) {
			// TODO Auto-generated method stub
			ArrayList newall=new ArrayList();
			for (Object obj : a1) {
				if(!newall.contains(obj)) {
					newall.add(obj);
				}
			}
			return newall;
		}
}
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 Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Person) {
			Person p=(Person) obj;
			System.out.println(this.getName() +"----equals-----"+p.getName());
			return this.getName().equals(p.getName())
					&& this.age == p.getAge();
		}
		return false;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	
	
}


结果如图所示:
在这里插入图片描述
集合list中remove方法调用时,调用了equals方法验证
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值