集合(Collection)的详细笔记

为什么要有集合?
int[] scores = new int[]{1,4,6,2,3}; 长度固定了,后期无法改变
当我们不确定一个数据到底有多少个的时候,数组根本就不适用
这个时候集合就出现了。

集合相当于是一种容器,这个容器的大小不固定。
可以无限制的往集合添加数据,而不受大小的限制。

数组不能在程序已经执行的过程中动态的扩展数组的大小。
集合可在程序执行的过程中动态的改变集合的容器大小。
集合(Collection)的三种分类:Set List Queue
Collection集合的常用方法:
add(Object e) :往集合中添加元素,集合默认可以添加任何类型的数据
clear() :清空集合数据
contains():判断集合中是否存在某个元素
isEmpty():判断集合是否为空 为空返回true 反之
size() : 集合的大小
把集合打成数组
Object[] objs = hashSet.toArray();
System.out.println(Arrays.toString(objs));
remove(Object o) 从集合删除某个元素
addAll(Collection<? extends E> c) 将其他集合的元素全部加入到自己的集合中
将set1的元素全部加入到set集合中
set.addAll(set1);

Set 基本上跟Collection规范(功能)一致
特征:元素无序不重复
Set依然是一个接口继承了Collection,Set不能直接创建对象

  1. Set的实现类HashSet: 元素无序不重复
    

    每个对象都有三个方法:toString equals hashcode(直接拿对象的地址)
    为什么不重复:
    集合第一步先拿对象的hashcode地址看和其他对象的hashCode地址是否一样。
    如果一样,再判断两个对象equals是否相等如果相等才认为重复,重复就会去掉,只保留一个。
    如果拿对象的hashcode已经不同,集合就认为两个对象没有重复,同时集合也觉得没有必要再判断equals
    集合中:对于对象,一般需要重写对象的hashCode()方法和equals()方法来制定对象的重复规则!!!!
    元素无序。 性能比较好。一般可以使用HashCode.

  2. Hashset集合的遍历:

      for循环不能遍历set集合
      foreach可以遍历
      iterator迭代器可以遍历
      jdk1.8以后的forEach函数式表达式可以遍历
    
  3. LinkedHashSet :元素有序不重复:增加了一个链可以记录元素的添加顺序

  4. SortedSet 排序集合 重点是TreeSet

       元素自动大小排序且不重复
       TreeSet中一般不能添加不同类型的元素,TreeSet默认无法比较不同的类型,也不知道怎么比较。
           默认一般只有相同类型的数值才可以进行比较
       如果添加了对象,应该给对象制定大小比较规则。 
         注意:如果对象的比较规则返回的是0就说明两个对象的大小是一样的,treeSet会去掉一个
    

比较规则的两种方法:
– 直接让对象实现比较接口Comparable,重写比较方法compareTo 制定比较规则
– 也可以通过匿名内部类直接给集合一个比较器new Comparator();
–如果TreeSet既有对象比较规则又自己拥有比较器优先使用集合自己的比较器
进行比较。
–如果集合已经存在比较器,对象可以不实现比较器。

List(重点):每个元素都有索引,有序可重复。

  1. ArrayList(实现类)

    很像数组了,但是大小可变,可添加任何类型的数据
    — List集合依然可以使用集合所有的方法,但是因为list有序有索引所以多了一些功能。
    — 第一个实现类ArrayList
    — get(int index) 返回列表中指定位置的元素。
    — list集合的遍历有四种方式:
    除了集合的三种遍历, list因为存在索引,而且可以根据索引获取对应位置的元素
    所以list可以直接用循环语句来遍历
    — ArrayList是开发中常用的,基本上都是用
    List<类型> list = new ArrayList<类型>();这个必须掌握。
    ArrayList性能比较好

  2. Queue:队列

队列:先进先出
offer():入队
poll():出队
栈 :后进先出
push():入栈
pop():出栈
Map集合(重要)
Collection集合是放置的具体类型的元素
Map中的元素都是键值对key=value的形式
而set集合中的元素都是key
Map集合就是set集合对应的元素加上一个附属元素
Map可以存储更加丰富的业务数据。

Map集合的特性跟Set集合是一样的。只是map集合的元素都带有一个附属元素
Map集合的特性是只管元素而不管附属元素。 

Set中的元素是: [元素1,元素2,元素3,.......]
Map中的元素是: [元素1=附属元素,元素2=附属元素,....... ]  
                  key = value  , key = value  (键值对)
  1. HashMap(重点)

    无序不重复,根据map元素中的key而定的。
    特性根据key与HashSet一致。

    为什么不重复?
    map集合第一步先拿对象key的hashcode地址看和其他对象key的hashCode地址是否一样。
    如果一样,再判断两个对象key的equals是否相等如果相等才认为重复,重复就会去掉,只保留一个。
    如果拿对象key的hashcode已经不同,集合就认为两个对象key没有重复,同时集合也觉得没有必要再判断equals
    map集合中: 对于对象key,一般需要重写对象key的hashCode()方法和equals()方法来制定对象key的重复规则!!!!
    元素无序。 性能比较好。一般可以使用HashMap.
    方法:
    put(key,value):添加
    get(key):根据key得到相应的value
    size():该集合的个数
    containsKey(key):判断是否包含某个key
    containsValue(value):判断是否包含某个value值
    clear():清空集合
    isEmpty():集合是否为空
    keySet():将map集合的所有key全部提取到一个集合里去

  2. LinkedHashMap 有序不重复

    根据key与LinkedHashSet特性一样。
    
  3. TreeMap 排序不重复。

    根据key与TreeSet特性一样
    
  4. HashTable 下的Properties(Map集合类型) 了解

    不允许使用null作为key
    Properties集合中的数据是存放在磁盘的文件里面,一般用于做配置文件
    而且这个文件一般是 xxxx.properties
    Properties也可以将配置文件读成一个集合对象Properties
    Map集合的遍历

 	public class MapBianli1 
{
	public static void main(String[] args) 
	{
		 Map<String,Integer> map = new HashMap();
		 map.put("admin",60);
		 map.put("ligang",100);
		 map.put("xlei",101);
		 System.out.println(map); // {xlei=101, ligang=100, admin=60}
		 // for循环不能遍历 
		 // foreach 
		 // {xlei=101, ligang=100, admin=60}
		 // {元素1, 元素2 , 元素3} = map.entrySet()
		 //  Map.Entry  = 元素1,
		 //   kv     
		 for(Map.Entry<String,Integer> kv : map.entrySet()){
			 String key = kv.getKey();
			 Integer value = kv.getValue();
			 System.out.println(key +"---"+value);
		 }
		 System.out.println(); 
		 // 拿到map集合中所有key的集合 
		 Set<String> keys = map.keySet();
		 for(String key : keys){
			 System.out.println(key +"---"+map.get(key));
		 }
		 System.out.println();
         
		 // JDK 1.8
		 map.forEach((k,v) -> {
			 System.out.println(k +"---"+v);
		 });
	}
}

泛型
JDK1.5以后引入泛型
泛型可以规定只能操作某种特定类型。

 Set<类型> 变量 = new HashSet<类型>();
 Set<类型> 变量 = new HashSet<>();
 
 ------------------------------------------
 List<类型> 变量 = new ArrayList<>();

 Map<类型,类型> 变量 = new HashMap<>();
 ------------------------------------------

 注意:
 泛型必须申明引用类型!!!不能使用基本数据类型
 // Map<String,int> map = new HashMap(); 错误的定义方式
 // Map<String,Integer> map = new HashMap(); 正确的定义方式
 集合申明了泛型以后,集合就只能存储泛型对应类型的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值