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集合中常用的方法{
-
void add(int index, E element)
在列表的指定位置插入指定元素(可选操作)。 -
E get(int index)
返回列表中指定位置的元素。可用来遍历元素可与int size() 连用获取集合中元素的个数 -
int indexOf(Object o)
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 -
int lastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。 -
Object remove(int index)
移除列表中指定位置的元素(可选操作)。 -
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){
}
}
小结
- ?表示泛型通配符,如果要对?泛型通配符的取值范围进行限制,可以使用泛型限定