目录
什么是集合?
当我们存储一组类型相同的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。 但是数组一旦定义,它的长度将不再变化;然而在实际开发中,我们经常需要保存一些长度变化的数据,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。 而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。Java中对于各种数据结构的实现,就是我们用到的集合。
集合的体系概述
Collection接口
Collection<String> c = new ArrayList<>();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Collection<String> d = new ArrayList<>();//通过泛型语法为集合设置了一个类型
d.add("a");
d.add("b");
d.add("c");//集合末尾加元素
d.add("d");
c.size();//集合的长度
c.addAll(d);//集合c+d abcdabcd给c
c.clear();//清空集合
d.isEmpty();//判断集合元素个数是否为空
c.remove("a");//删除集合中指定元素 返回值为bollean类型,删除成功返回true
c.retainAll(d);//集合c中保留与集合d中交集的元素 返回值bollean类型,集合c发生变化,返回true
/*c: abcd d: defg c.retainAll(d); c:d 返回true */
Object [] objects = c.toArray();//返回一个包含此集合中所有元素的数组。
String [] strings = c.toArray(new String[0]);
//返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。
List 接口及实现类
ArrayList
LinkedList
Vector
ArrayList的常用方法:
ArrayList <String> list = new ArrayList<>();
list.add("ona");
list.add("ona");
list.add("ona");
list.add(0, "onanananana");//向指定位置添加元素
list.remove(0);//删除并返回指定元素
list.get(0);//获取指定位置元素
list.set(0, "ONANANA");//替换指定位置元素
System.out.println(list.size());//返回集合中元素个数
LinkedList的常用方法:
LinkedList<String> listL = new LinkedList<>();
listL.add("ona");
listL.add("ona");
listL.add("ona");
listL.add(int index,Object element);//向指定位置添加元素
listL.addFirist(Object element);//添加元素到链表头
listL.addLast(Object element);//添加元素到链表尾
listL.get(int index);//获取指定位置元素
listL.removeFirst();//删除头元素
listL.removeLast();//删除尾元素
System.out.println(listL.remove(1));//删除并返回指定元素
listL.getFirst();//获取头元素
listL.getLast();
Set接口
Map接口
Map的常用方法
V put(K key,V value)//输入数据到Map
V remove(Object key)//通过键值删除数据
void clear()//清空map
boolean containsKey(Object key)//判断有没有相同的键
boolean containsValue(Object value)
boolean isEmpty()//判断空 还有元素返回false
int size()//长度方法
V get(Object key)//通过键获取值
Collection values()//返回此地图中包含的值的Collection
视图。
Set keySet()
Set<Map.Entry<K,V>> entrySet()//遍历
HashMap
数组+链表+二叉树(黑红树)
HashMap中元素的key值不能重复, 排列顺序是不固定的,可以存储一个为null的键TreeMap
TreeMap中所有的元素都保持着某种固定的顺序,如果需要得到一个有序的Map就应该使用TreeMap,key值所在类必须实现Comparable接口,适用于按自然顺序或自定义顺序遍历键(key)。
TreeMap根据key值排序,key值需要实现Comparable接口,重写compareTo方法。TreeMap根据compareTo的逻辑,对 key进行排序。
键是红黑树结构,可以保证键的排序和唯一性
HashTable实现了同步,不能存储为null的键。
集合的遍历/迭代
增强for循环不能删除集合中的元素: 增强for循环本质上是利用迭代器循环,而如果你在循环中删除元素的话,会导致当前迭代器失效。线程安全除外
List接口集合迭代
for循环遍历
增强for循环遍历
迭代器遍历Iderator
List <String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("e");
list.add("e");
list.add("c");
list.add("e");
list.add("e");
/*Iterator 迭代器遍历 返回一个ArryayList中内部类对象,实现Iterator接口,此内部类专门用作
对集合进行遍历时的控制*/
Iterator<String> it = list.iterator();
/*list.removeIf(e -> e.equals("e"));和while代码块作用一样*/
while(it.hasNext())// 判断里面有没有元素 有就会返回TRUE
{
String e =it.next();
if(e.equals("e")){
it.remove();
}
}
System.out.println(list);
List <String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("e");
list.add("e");
list.add("c");
list.add("e");
list.add("e");
ListIterator <String> its = list.listIterator(3);//指定位置遍历
while(its.hasNext())
{
String str = its.next();//正序
System.out.println(str);
}
ListIterator <String> it = list.listIterator(list.size());
while(it.hasPrevious())
{
String str1 = it.previous();//逆序
System.out.println(str1);
}
Set接口遍历/迭代
Map集合遍历
Collections类
什么是泛型?为啥要用泛型?
泛型类
public class Demo<T>{ / /T可以为任意标识符,常见的如T、E、K、V等形式的参数常用于表示泛型
private T key; / /key这个成员变量的类型为T,T的类型由外部指定
public Demo(T key) { / /泛型构造方法形参key的类型也为T,T的类型由外部指定
this.key = key;
}
public T getKey(){ / /泛型方法getKey的返回值类型为T,T的类型由外部指定
return key;
}
}
从泛型类派生子类
class A extends Demo<String>
泛型接口
泛型通配符
类型擦除
泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除
泛型类被类型擦除后,相应的类型就被替换成 Object 类型或者上限类型
public class Demo<T>{
T name;
public Demo(T name) {
this.name= name;
}
}
Demo是一个泛型类,我们查看它在运行时的状态信息可以通过反射。
Demo<String> demo= new Demo<String>("jim");
Field f = eclz.getField(“name”);
System.out.println(f.getName()+" type:"+f.getType());
name type:java.lang.Object
反射:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力
点击这里了解更多知识~~~今天也要涨姿势啦