集合

集合

在这里插入图片描述
Vector,HashTable,Stack,StringBuffer,String类都是线程安全的
哈希表中的链表指的是单向链表

LinkedHashSet继承了HashSet,在HashSet中有单独给LinkedHashSet提供了一个构造方法,是用LinkedHashMap构造的,然后LinkedHashMap继承了HashMap,又调用了HashMap的构造方法。
所以LinkedHashSet实际使用的HashMap的构造方法。

数组和集合区别:

数组大小不可变,只能存放同一种数据类型,可以存放基本数据类型和引用数据类型。
集合大小可变,可以存放不同种数据类型,只能存放引用类型,(基本数据类型自动封装箱)

本文是List集合

Set集合看:Set集合
Map集合看:Map集合
集合案例,斗地主

ArrayList 、LinkedList 与Vector的区别?

ArrayList 底层 可变大小的数组 。查询快 ,增删慢。线程不安全
LinkedList 底层 双向链表,查询慢 ,增删快。线程不安全
Vector线程安全的,用法 同ArrayList。

集合迭代Iterator

为什么要设计Iterator迭代器

遍历和实现分离(迭代器设计模式)

  • 首先使用迭代器适用性强,因为如果用for循环遍历,需要事先知道集合的数据结构,而且当换了一种集合的话代码不可重用要修改,不符合开闭原则。而Iterator是用同一种逻辑来遍历集合
  • 其次使用Iterator可以在不了解集合内部数据结构的情况下直接遍历,这样可以使得集合内部的的数据不暴露。更安全。
注意1:next(),hasNext()

1next()是直接获取下一个的值,从第一个开始。
2hasNext()是判断最后一个next()的指针还有没有下一个,如果之前没有next()就看有没有第一个元素,只是个判断,不移动指针

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		Iterator<Integer> it = list.iterator();
		System.out.println(it.next());//1
		System.out.println(it.next());//2
		System.out.println(it.next());//3
		System.out.println(it.next());//4
//		next()是直接获取下一个的值,从第一个开始。
//		hasNext()是判断最后一个next()的指针还有没有下一个,如果没有next()就看有没有第一个,只是个判断,不移动指针
		System.out.println(it.hasNext());//false
		System.out.println(it.hasNext());//false 
		System.out.println(it.hasNext());//false
		System.out.println(it.hasNext());//false
		System.out.println(it.hasNext());//false
		System.out.println(it.hasNext());	//false
	}
}
注意2:删除集合元素细节

for循环遍历时,不能使用集合方式删除元素。即remove(obj/index),可能会导致ConcurrentModificationException 并发修改异常。(因为在遍历的时候,删除会少一个元素,导致遍历循序变化,少一个索引值就都变了。增强for底层也是迭代器,在for的时候固定了一个迭代器,删除同样会使循序变乱)
要用迭代器的remove()方法删除

public class 自定义类元素的删除问题 {
	public static void main(String[] args) {
		ArrayList<Worker>  list=new ArrayList<>();
		list.add(new Worker("马六", 30));
		list.add(new Worker("王五", 30));
		list.add(new Worker("六七", 30));
		list.add(new Worker("赵四", 30));
		//删除姓名为马六的工人。
		//for循环
		/*for(Worker w:list) {
			if(w.name.equals("马六")) {
//				当在遍历时,使用集合的删除方法,可能会导致ConcurrentModificationException 并发修改异常。
				list.remove(w);
			}
		}*/
		//建议使用迭代器删除
		Iterator<Worker> it = list.iterator();
		while(it.hasNext()) {
			Worker w = it.next();
			if(w.name.equals("马六")) {
				it.remove();
			}
		}
		System.out.println(list);
	}
}
注意3:List常用方法中需要注意的

add(index,Element);//向指定索引位置插入元素。
插入,必须在有元素的旁边或中间插入
set(int index, E element) 将index位置的元素替换为参数。
subList(int fromIndex, int toIndex) 截子集合 包括开始索引不包括 结束索引

public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("a");//0 
		list.add("b");//1
//		list.add(3,"d");//会报越界异常
		list.add(2,"c");
		System.out.println(list);
	}

List接口特有的迭代器的特有方法

listIterator()返回ListIterator迭代器。该迭代器是List集合特有的迭代器。
1》hasPrevious()判断集合中是否存在元素,逆序遍历。(从第一位开始,如果从第一位直接判断,是false)
2》previous() 返回集合中的元素 ,逆序遍历。

List遍历方法

1》 通过数组
toArray() 转换为对象数组
2》 Iterator。
iterator() 返回迭代器接口对象。
3》for循环
4》listIterator
5》增强for

LinkedList的其它特点
可以当做堆栈与队列使用
1> 栈 : 先进后出
(1) 压栈 : 进入栈中
(2) 弹栈: 出栈。
2> 队列:先进先出

Vector常用方法

1》elements() 相当于迭代器iterator
2》hasMoreElements --》 hasNext() 判断集合中是否存在元素
3》nextElement --》 next() 返回集合中的元素

Collections工具类

1.binarySearch(List<? extends Comparable<? super T>> list, T key)

采用二分法查找集合中是否存在该元素,返回索引值,要求该集合是一个有序的集合。

2.fill(List<? super T> list, T obj)

替换用obj 替换list集合中的元素。

3.reverse(List<?> list) 反转 倒序
4.shuffle(List<?> list)

随机置换,用来打乱集合顺序(重要)

5.sort(List list)

按照元素的自然顺序进行List集合的升序排序。(还有一个sort()用自定义的Comparator接口)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值