Java面向对象 学习笔记(四)常用集合

Java集合

1.Collection

//Collection接口实现类的特点
public interface Collection<E> extends Iterable<E>
    1.Collection实现子类可以存放多个元素,每个元素可以是Object
    2.有些Collection的实现类,可以存放重复的元素,有些不可以
    3.有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
    4.Collection接口没有直接的实现子类,是通过它的子类接口Set和List来实现的
//Collction接口常用方法:
    List<T> list = new ArrayList<>();
	1. list.add("aaa"); //添加单个元素
	2. list.remove("aaa"); //删除指定元素或元素索引
	3. list.contains("Java"); //查找元素是否存在
	4. list.size(); //获取元素个数
	5. list.isEmpty(); //判断是否为空
	6. list.clear(); //清空集合
	7. list.addAll("list2"); //添加多个元素
	8. list.containsAll("list2"); //查找多个元素是否都存在
	9. list.removeAll("list2"); //删除多个元素
  • 集合遍历
Collection接口遍历元素方式 
//1.使用Iterator(迭代器遍历)
	1.Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
	2.所有实现Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器
	3.Iterator的结构:
		1.Iterator iterator = list.iterator(); //得到一个集合的迭代器
		2.hasNext(); //判断是否还有下一个元素
		3.while(iterator.hasNext()){
			//next()作用:1.指针下移 2.将下移以后集合位置上的元素返回
             //返回一个Object对象
            System.out.println(iterator.next());
		}
	4.Iterator仅用于遍历集合,Iterator本身不存放对象
    
//2.使用增强for循环(简化版的迭代器)
		特点:增强for就是简化版的iterator,本质一样。只能遍历集合或数组。
		基本语法:
		for(Object object : list){
         	System.out.println(object);
		}

1.List

//List接口常用方法:
	List集合里添加了一些根据索引来操作集合元素的方法
	1.void add(int index, Object ele); //在index位置插入ele元素
	2.boolean addAll(int index, Collection eles); //从index位置开始将eles中的所有元素添加进来
	3.Object get(int index); //获取指定index位置的元素
	4.int indexOf(Object obj); //返回obj在集合中首次出现的位置
	5.int lastlndexOf(Object obj); //返回obj在当前集合中未次出现的位置Object remove(int index):移除指定index位置的元素,并返回此元素
	6.Object set(int index, Object ele); //设置指定index位置的元素为ele相当于是替换.
	7.List subList(int fromlndex, int tolndex); //返回从fromIndex到tolndex位置的子集合 前闭后开

//List的三种遍历方式 [ArrayList,LinkedList,Vector均可使用以下方法对集合进行遍历]
	1.方式一:使用iterator
		lterator iter = col.iterator();
		while(iter.hasNext(0){
			Object o = iter.next();
		}
	2.方式二:使用增强for循环
		for(Object o:col){
			System.out.println(o);
		}
	3.方式三:使用普通for
		for(int i=0;i<list.size();i++){
			Object object = list.get(i);
			System.out.println(object);
		}
             
//ArrayList的注意事项
	1.permits all elements, including null ,ArrayList可以加入null,并且多个
	2.ArrayList是由数组来实现数据存储的
	3.ArrayList 基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码.,在多线程情况下,不建议使用ArrayList                                            
1.ArrayList
//ArrayList底层结构和源码剖析
//ArrayList的底层操作机制源码分析(重点,难点.)
	1.ArrayList中维护了一个Object类型的数组elementData. [debug看源码]
        transient Object[] elementData;//transient 表示瞬间的,短暂的,表示该熟悉不会被序列化
	2.当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,
	  如需要再次扩容,则扩容elementData为1.5倍。
	3.如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
2.Vector
//Vector底层结构和源码剖析
//Vector的基本介绍
	1.Vector类的定义说明
		public class vector<E>
		extends AbstractList<E>
		implements List<E>,RandomAccess,cloneable,Serializable
	2.Vector底层也是一个对象数组
		protected Object[] elementData;
	3.Vector是线程同步的,即线程安全, Vector类时探作万法带有 syncnrona
		public synchronized E get(int index) {
			if (index >= elementCount){
				throw new ArraylndexOutOfBoundsException(index);
			}
			return elementData(index);
		}
	4.在开发中,需要线程同步安全时,考虑使用Vector

Vector和ArrayList的比较

底层结构版本线程安全(同步)效率扩容倍数

ArrayList

可变数组

jdk1.2

不安全,效率高
如果有参构造1.5倍
如果是无惨
1.第一次是10
2.从第二次开始按1.5倍扩

Vector

可变数组
Object[]

jdk1.0

安全,效率不高
如果是无惨,默认10,
满后,就按2倍扩容
如果指定大小,则每次直接
按2倍扩

ArrayList和LinkedList比较

底层结构增删的效率改查的效率
ArrayList可变数组较低
数组扩容
较高
LinkedList双向链表较高,通过链表追加.较低
//如何选择ArrayList和LinkedList:
	1.如果我们改查的操作多,选择ArrayList
	2.如果我们增删的操作多,选择LinkedList
	3.一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择ArrayList
	4.在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另外一个模块是LinkedList.

2.Set

//Set接口基本介绍
	1.无序(添加和取出的顺序不一致),没有索引
	2.不允许重复元素,所以最多包含一个null
	3.JDK API中Set接口的实现类有
		java.util
		接口 Set<E>
类型参数:
	E—此set所维护元素的类型
所有超级接口:
	Collection<E>,Iterable<E>
所有已知子接口:
	Navigableset<E>,SortedSet<E>
所有已知实现类:
	//重点:HashSet,TreeSet
	AbstractSet,ConcurrentSkipListSet,
	CopyOnWriteArraySet,EnumSet,
	JobStateReasons,LinkedHashSet
    
//Set接口的常用方法
	和List接口一样, Set接口也是Collection的子接口,因此,常用方法和Collection接口一样.
//Set接口的遍历方式
同Collection的遍历方式一样,因为Set接口是Collection接口的子接口。
	1.可以使用迭代器
	2.增强for
	3.不能使用索引的方式来获取.
1.HashSet
//HashSet的全面说明
	1.HashSet实现了Set接口
	2.HashSet实际上是HashMap
		public Hashset() {
			map = new HashMap<>();
    	}
	3.可以存放null值,但是只能有一个null
	4.HashSet不保证元素是有序的,取决于hash后,再确定索引的结果.
	5.不能有重复元素/对象.在前面Set 接口使用已经讲过
2.LinkedHashSet
//Set接口实现类-LinkedHashSet
LinkedHashSet的全面说明
	1.LinkedHashSet是 HashSet的子类
	2.LinkedHashSet底层是一个 LinkedHashMap,底层维护了一个数组+双向链表
	3.LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
	4.LinkedHashSet 不允许添重复元素

2.Map

//Map接口和常用方法
//Map接口实现类的特点[很实用]
注意:这里讲的是JDK8的Map接口特点
	1.Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
	2.Map 中的 key和 value可以是任何引用类型的数据,会封装到HashMap$Node对象中
	3.Map 中的 key 不允许重复,原因和HashSet一样
	4.Map 中的value可以重复
	5.Map 的 key 可以为null, value也可以为null,注意key为null, 只能有一个,value为null ,可以多个.
	6.常用String类作为Map的key
	7.key 和 value 之间存在单向一对一关系,即通过指定的key 总能找到对应的value
        
//Map接口的常用方法
	1.put("数据结构","100.0"); //添加
	2.remove("数据结构"); //根据键删除映射关系
	3.get("数据结构"); //根据键获取值
	4.size(); //获取元素个数
	5.isEmpty(); //判断个数是否为零
	6.clear(); //清空Map集合
	7. containsKey("数据结构"); //查找键是否存在

1.HashMap

//Map接口和常用方法
Map接口遍历方法 
    //Map map = new HashMap();
	1.containsKey:查找键是否存在
	2.keySet:获取所有的键
         Set keyset = map.keySet();
	3.entrySet:获取所有关系k-v
		Set set = map.enterSet();
	4.values:获取所有的值
		Collection values = map.values();
    
//HashMap六种遍历方法

	//第一组:先取出所有的Key,通过Key取出对应的Value
         Set keyset = map.keySet();
	1.增强for
		for(Object key : ketset){
			System.out.println(key + "-" + map.get(key));
		}
	2.迭代器
		Iterator iterator = keyset.iterator();
		while(iterator.hasNext()){
			Object key = iterator.next(); 
			System.out.println(key + "-" + map.get(key));
		}

	//第二组:先取出所有的Value
		Collection values = map.values();
		这里可以使用所有的Collections使用的遍历方法
	3.使用增强for遍历
		for(Object value : values){
			System.out.println(value);
    	}
	4.使用迭代器遍历
		Iterator iterator = values.iterator();
		while(iterator.hasNext()){
			Object value = iterator.next(); 
			System.out.println(value);
		}

	//第三组:通过EnterSet 来获取 k-v
		Set enterSet = map.enterSet();
	5.增强for
		for(Object enter : enterSet){
             //将entry 转成 Map.Enter
			Map.Enter m = (Map.Enter) entry;
			System.out.println(m.getKey() + "-" + m.getValue());
    	}	
	6.使用迭代器遍历
		Iterator iterator = values.iterator();
		while(iterator.hasNext()){
			Object enter = iterator.next(); 
			Map.Enter m = (Map.Enter) entry;
             System.out.println(m.getKey() + "-" + m.getValue());
		}

3.Collections

//Collections工具类
	Collections工具类介绍
1.Collections是一个操作 Set、List 和 Map 等集合的工具类
2.Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作
        排序操作:(均为静态方法)
	1.reverse(List):反转 List 中元素的顺序
	2.shuffle(List):对List 集合元素进行随机排序
	3.sort(List):根据元素的自然顺序对指定List 集合元素按升序排序
	4.sort(List, Comparator):根据指定的 Comparator 产生的顺序对 List集合元素进行排序
	5.swap(List, int,int):将指定list集合中的i处元素和j处元素进行交换
Collections工具类
//●查找、替换
	1.Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
	2.Object max(Collection, Comparator):根据Comparator 指定的顺序,返回给定集合中的最大元素
	3.Object min(Collection)
	4.Object min(Collection, Comparator)
	5.int frequency(Collection, Object):返回指定集合中指定元素的出现次数
	6.void copy(List dest,List src):将src中的内容复制到dest中
	7.boolean replaceAll(List list, Object oldVal, Object newVal):使用新值替换 List 对象的所有旧值

以上只是对部分常用集合的简单介绍,如果想真正搞懂集合
需要对集合底层源码进行深入研究和学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所恋皆洛尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值