Java中集合概述

1.集合里面存储的是什么?
集合里面存储的都是引用,eg:list.add(10)实际上利用了自动装箱机制,转化为Integer类型之后,再进行存储。
2.集合中存储形式?
集合有按value存储和按key-value存储,按value存储的是Collection,按key-value的是Map。
3.集合继承结构图?
在这里插入图片描述
3.1.List集合的继承结构图
在这里插入图片描述
3.2.Set集合的继承结构图
在这里插入图片描述
Set与SortedSet区别,SortedSet可排序,Set是不排序的。
4.Map集合继承图
Map集合的常用方法

 Map<K,V>的常用方法:
            - public V put(K key, V value):  把指定的键与指定的值添加到Map集合中。
            - public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
            - public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

            - public boolean containsKey(Object key):判断该集合中是否有此键
            - public boolean containsValue(Object value):判断该集合中是否有此值

            - public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
            - public Collection<V> values(): 获取Map集合中所有的值,存储到Collection集合中。

            - public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
                Map.Entry<K,V>:表示键值对对象---把键值对包装成一个对象,该对象的类型就是Entry类型

在这里插入图片描述
5.总结(所有的实现类):
1.ArrayList: 底层是数组。
2.LinkedList: 底层是双向链表。
3.Vector: 底层是数组,线程安全的,效率较低,使用较少。
4.HashSet: 底层是HashMap,放到HashSet集合中的元素等同于放到HashMap的key部分了。
5.TreeSet: 底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap的key部分了。
**6.HashMap:**底层是Hash表。
**7.Hashtable:**底层是Hash表,线程安全的,使用较少了。
8.Properties: 是线程安全的,并且key和value只能存储字符串String.
9.TreeMap: 底层是二叉树。TreeMap集合的key可以自动按照大小顺序排序。
6.集合存储的特点:
List集合存储的特点: 有序可重复。
有序:存进去的顺序和取出的顺序相同。
可重复:存进去1,可以在存储一个1.
Set(Map)集合存储元素的特点: 无序不可重复
无序:存进去的顺序和取出的顺序不一定相同。另外Set集合中元素没有下标。
不可重复:存进去1,不能再存储1了。
SortedSet(SortedMap)集合存储元素的特点: 首先是无序不可重复的,但是SortedSet集合中的元素是可排序的。
无序:存进去的顺序和取出的顺序不一定相同。另外Set集合中元素没有下标。
不可重复:存进去1,不能再存储1了。
可排序:可以按照大小顺序排列。
Map集合的key,就是一个Set集合
7.Collection接口中的常用方法
1.boolean add(E e) 向集合中添加元素
2.int size() 获取集合中元素的个数
3.void clear() 清空集合
4.boolean contains(Object o) 判断集合中是否包含指定的元素。
5.boolean remove(Object o )删除集合中某个元素,底层也是调用了equals方法。
6.boolean isEmpty() 判断集合中元素是否为空
7.Object[] toArray() 将集合转化成数组
8.Iterator iterator() 迭代器方法 *****重要
boolean hasNext()
如果仍有元素可以迭代,则返回 true。
Object next()
返回迭代的下一个元素。
void remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
while(it.hasnext()){
Object o= it.next();//it.next()返回的类型是object
System.out.println(o);
}
9.contains()方法图分析:原理底层调用了eauqls()方法。在这里插入图片描述
结论:1.存放在集合中的java类型一定要重写equals()方法。2.关于迭代器的知识点:当集合的结构发生改变时,迭代器必须重新获取,如果还用老的迭代器,会出现异常。3.存放在集合里面的元素都是包装类对象。4.迭代过程中不能调用集合对象的remove方法。会出现Exception in thread "main"java.util.ConcurrentModificationException
要用迭代器对象的Iterator自带的remove方法删除元素。
6.List有自己特有的遍历方式
6.1.List集合中常用的方法{

  1. void add(int index, E element)
    在列表的指定位置插入指定元素(可选操作)。

  2. E get(int index)
    返回列表中指定位置的元素。可用来遍历元素可与int size() 连用获取集合中元素的个数

  3. int indexOf(Object o)
    返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

  4. int lastIndexOf(Object o)
    返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

  5. Object remove(int index)
    移除列表中指定位置的元素(可选操作)。

  6. Object set(int index, E element)
    用指定元素替换列表中指定位置的元素(可选操作)。

}
6.2.List不仅仅可以通过iterator遍历,还可以通过fori遍历,因为List集合里面特有的方法Object get(int index) 返回列表中指定位置的元素。
Arraylist默认容量是10(底层创建了一个长度为0的数组,当第添加第一个元素的时候,初始化容量是10),下面是Arraylist底层源码。在这里插入图片描述
在这里插入图片描述
6.3.Arraylist的扩容?
Arraylist扩容是增长到原始容量的1.5倍。
Arraylist底层是数组,如何优化?
Arraylist底层是一个数组,在初始化尽可能给出预估计的值,因为Arraylist扩容效率较低。数组的检索效率最高,缺点是:增删效率较低。
6.4.链表数据结构
单链表的节点。
节点是单向链表中基本的单元。
每一个节点Node都有两个属性:
第一个属性:存储的数据结构。
第二个属性:下一个节点的内存地址。
链表增删结构图如下:
元素新增与删除在这里插入图片描述

链表优点:随即增删元素效率较高。
链表缺点:查询效率较低,每一次查找元素的时候都需要从头节点开始往下遍历。	

**7.定义和使用含有泛型的方法**
修饰符<泛型变量> 返回值类型 方法名(形参列表){
  方法体)
  }
  泛型变量:任意字母  一般会写T,M...
  使用含有泛型的方法:调用含有泛型方法的时候确定其泛型的具体数据类型。
  什么时候会定义含有泛型的方法;
    7.1.public static<T> T method(T t){
		        return t;
    }



    #### 定义含有泛型的接口

定义格式:

修饰符 interface接口名<代表泛型的变量> {  }

例如,

package com.itheima.demo09_定义和使用含有泛型的接口;

public interface IA<E> {

    public abstract void method1(E e);

    public default E method2(E e){
        return e;
    }
}

小结

  • 泛型是一种未知的数据类型,定义在类上的泛型,使用类的时候会确定泛型的类型,定义在方法上的泛型,会在使用方法的时候确定泛型,定义在接口上的泛型,需要使用接口的时候确定泛型。

泛型的小结

泛型:定义的时候表示一种未知的数据类型,在使用的时候确定其具体的数据类型。
使用含有泛型的类:  创建该类对象的时候,指定泛型的具体数据类型
使用含有方向的方法: 调用该方法的时候,确定泛型的具体数据类型
使用含有泛型的接口:
	1.创建实现类实现接口的时候,指定泛型的具体数据类型
    2.创建实现类实现接口的时候,不知道泛型的具体数据类型,而是创建实现类对象的时候指定泛型的具体数据类型

下面的泛型通配符完全是照抄黑马视频的课堂笔记。

知识点-- 泛型通配符

目标:

  • 能够使用泛型通配符

路径:

  • 通配符基本使用
  • 通配符高级使用----受限泛型

讲解:

通配符基本使用

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

此时只能接受数据,不能往该集合中存储数据。

例如:

package com.itheima.demo10_泛型通配符.demo1_通配符基本使用;

import java.util.ArrayList;
public class Test {
    public static void main(String[] args) {
        /*
            通配符基本使用:
                泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
                注意: 不能往该集合中存储数据,只能获取数据.
         */
        // 关系:String继承Object,Integer继承Number,Number继承Objec
        ArrayList<Object> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<Integer> list3 = new ArrayList<>();
        ArrayList<Number> list4 = new ArrayList<>();

        list2.add("itheima");

        //method1(list1);
        method1(list2);
        //method1(list3);
        //method1(list4);

        //method2(list1);
        method2(list2);
        //method2(list3);
        //method2(list4);

        // 泛型没有多态
        //ArrayList<Object> list = new ArrayList<String>();// 编译报错
    }
    // 定义一个方法,可以接收以上4个集合
    public static void method1(ArrayList list){
        Object obj = list.get(0);
        list.add("jack");
        System.out.println("obj:"+obj);// itheima
        System.out.println("list:"+list);// [itheima, jack]
    }

    public static void method2(ArrayList<?> list){
        Object obj = list.get(0);
        //list.add("jack");// 编译报错
        System.out.println("obj:"+obj);// itheima
        System.out.println("list:"+list);// [itheima]
    }
}

通配符高级使用----受限泛型

之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限下限

泛型的上限

  • 格式类型名称 <? extends 类 > 对象名称
  • 意义只能接收该类型及其子类

泛型的下限

  • 格式类型名称 <? super 类 > 对象名称
  • 意义只能接收该类型及其父类型

比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类

package com.itheima.demo10_泛型通配符.demo2_通配符高级使用;

import java.util.ArrayList;
public class Test {
    public static void main(String[] args) {
        /*
            通配符高级使用----受限泛型:
                上限: <? extends 类名>  只能接收该类类型或者其子类类型
                下限: <? super 类名>   只能接收该类类型或者其父类类型
         */
        // 关系:String继承Object,Integer继承Number,Number继承Objec
        ArrayList<Object> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<Integer> list3 = new ArrayList<>();
        ArrayList<Number> list4 = new ArrayList<>();
        
        method1(list1);
        method1(list2);
        method1(list3);
        method1(list4);
        
        //method2(list1);// 编译报错
        //method2(list2);// 编译报错
        method2(list3);
        method2(list4);


        method3(list1);
        //method3(list2);// 编译报错
        method3(list3);
        method3(list4);
    }

    // 定义一个方法,只可以接收以上list3和list4集合
    public static void method2(ArrayList<? extends Number> list){

    }
    
    // 定义一个方法,只可以接收以上list3和list4,list1集合
    public static void method3(ArrayList<? super Integer> list){

    }
    
    // 定义一个方法,可以接收以上4个集合
    public static void method1(ArrayList<?> list){
       
    }
    // 定义一个方法,可以接收以上4个集合
    public static void method(ArrayList list){

    }
}

小结

  • ?表示泛型通配符,如果要对?泛型通配符的取值范围进行限制,可以使用泛型限定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值