泛型和集合

泛型:
Generics 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
安全校验机制
可以在类或者方法中预支的使用未知的类型。在JDK1.5之后引入的新特性
让你在设计API时可以指定类或者方法支持泛型,这样我们使用API的时候也变得更为简洁,
并且还得到了在程序编译时期的语法安全检查。
将运行时期的ClassCastException,转移到编译时期变成了编译异常。
也避免了类型强转的麻烦。
使用:
在集合中会大量使用到泛型。
在开发中,泛型,用来灵活的将数据类型应用到不同的类、方法、接口当中。
将数据类型作为参数进行传递。
Collection.add(E e) 泛型的通配符 不是* 而是<?>
List Set Map
数据结构:
数据存储的常用结构:栈、队列、链表、红黑树
栈:
stack,又称为堆栈,它是运算受限的线性表,它的限制主要体现在仅允许在标的的一端进行插入和删除操作,
不允许在其他任何位置进行添加、查找、删除等操作。
它的存取有以下几个特点:
1.先进后出(存进去的元素,要在它的后面的元素依次取出后才能去除该元素)。
2.栈的入口、出口都在栈的最顶端位置。

有两个名词需要注意:
压栈:就是存元素,即是把元素存储到栈的最顶端,栈中已有的元素依次向栈底方向移动一个位置。
弹栈:就是取元素。即是把栈的最顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

队列:
queue,简称队,它和堆栈是一样的,也是一种运算受限的线性表,它的限制是仅允许在标的一端进行插入,而在
标的另一端进行删除。
它的存取有以下特点:
1.先进先出(即,存进去的元素,要在它前面的元素依次取出后,才能取出该元素)汽车过隧道、山洞 走独木桥
2.队列的入口和出口各占一端
数组:
Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间中存储元素。
数组存储有以下特点:
1.查找元素块
2.增删元素慢
2.1指定索引位置删除元素。
2.2指定索引位置添加元素。
链表、二叉树、红黑树
Set集合:单列数据结构
特点:
1.不允许存储重复的元素。
2.最多包含一个null元素。
3.通常认为Set接口元素是无序的。
4.通常认为Set接口无索引。
Set接口的子类:java.util.HashSet和java.util.LinkedHashSet
//创建一个Set集合 HashSet
Set<String> set = new HashSet<>();
//添加元素
set.add("小明");
set.add("小王");
set.add("小刘");
set.add("小周");
set.add("小王");
//通过迭代器获取
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
//next()方法
String str = iterator.next();
System.out.println(str);
}

//构建一个Set集合  LinkedHashSet
Set<String> set = new LinkedHashSet<>();
set.add("小明");
set.add("老王");
set.add("老刘");
set.add("老周");
set.add("老王");
set.add("老马");
set.add("老张");
set.add("老赵");
set.add("老孙");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
//next()方法
String str = iterator.next();
System.out.println(str);
}


HashSet集合
它存储的元素不允许重复,并且元素是无序的(存取顺序不一致)、
HashSet的底层实现需要有java.util。HashMap支持。
它的元素是根据对象的哈希值来确定在集合中元素的存储位置,因此存取和查找性能较好,
保证元素性能唯一依赖于重写的hashCode和equals方法
JDK1.8之前 哈希表底层采用数组+链表结构存储数据
JDK1.8之后 哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8),将链表转换成红黑树存储。(目的是为了提升查找性能)
LinkedHashSet集合 (链表结构可以保证元素是有序的)
元素不重复,并且是有序的。
我们常说的链表结构:单向链表和双向链表
Map集合:TreeMap, HashMap, LinkedHashMap
特点:
1.将键映射到值的对象,一个建设不能包含重复的键,每个键最多只能映射到一个值。
2.Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
/*
boolean containsKey(Object key)判断map集合中是否包含指定的key
boolean containsValue(Object value)判断map集合中是否包含指定的value
V get(Object key) 通过指定的key值获取对应的value值,如果没有找到就返回null
Set<K> keySet() 获取map集合中所有的key值,封装到Set集合中
V put(K key, V value) 将指定的一对key值和value值存储到map集合中,返回存储的value
void putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key) 根据指定的key值删除此映射(一对keyvalue) 返回删除的value
int size() 返回map集合中的键值映射数
Collection<V> values() 获取map集合中所有的value值,封装到Collection集合中
Set<Map.Entry<K,V>> entrySet() 获取map集合中的所有的映射值,封装到map内部类Entry类中
K getKey()获取entry集合中的key
V getValue()获取entry集合中的value
*/
//构建一个map集合
Map<Integer, String> map = new HashMap<>();
//put(K,V)
map.put(1, "小明");
map.put(5, "老王");
map.put(3, "小刘");
map.put(7, "小周");
map.put(10, "小孙");
map.put(4, "小赵");
//判断包含
boolean b = map.containsKey(7);
System.out.println(b);
boolean containsValue = map.containsValue("小刘");
System.out.println(containsValue);
//V get(K)
String str = map.get(7);
System.out.println(str);
//获取map集合中的所有的key
Set<Integer> keys = map.keySet();
//获取迭代器
Iterator<Integer> iterator = keys.iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
System.out.print(key + ":");
String value = map.get(key);
System.out.println(value);
}
//Collection<V> values()
Collection<String> values = map.values();
//迭代器
Iterator<String> values2 = values.iterator();
while (values2.hasNext()){
String value = values2.next();
System.out.println(value);
}
 
原文地址:https://www.cnblogs.com/lk625/p/13942101.html