来源于博客园,csdn,b站等各大知识分享平台,只是整理方便自己复习,没有任何商用,有问题联系立马删除!
集合的概述
集合:集合是java中提供的一种容器,可以用来存储多个数据。java.util包下
集合与数组的区别:
* 数组的长度是固定的。集合的长度是可变的。
* 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
集合的体系图:
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List
和java.util.Set
。其中,List
的特点是元素有序、元素可重复。Set
的特点是元素无序,而且不可重复。List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,Set
接口的主要实现类有java.util.HashSet
和java.util.TreeSet
。
那么根据上面的图进行自顶向下去分析:
Collection接口时所有单列集合的父接口,因此定义了一些方法可以满足使用,(list和set通用),注意:操作的仅仅是单列集合。
public boolean add(E e)
: 把给定的对象添加到当前集合中 。
public void clear()
:清空集合中所有的元素。
public boolean remove(E e)
: 把给定的对象在当前集合中删除。
public boolean contains(E e)
: 判断当前集合中是否包含给定的对象。
public boolean isEmpty()
: 判断当前集合是否为空。
public int size()
: 返回集合中元素的个数。
public Object[] toArray()
: 把集合中的元素,存储到数组中。
创建集合以多态的形式进行创建,用ArrayList作为其实现类去使用
Collection<String> coll = new ArrayList<String>();
添加元素:
coll.add();
输出集合:
System.out.println(coll);
之前也说过,直接输出说明重写了toString方法,
迭代器(Iterator)
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator
。Iterator
接口也是Java集合中的一员,但它与Collection
、Map
接口有所不同,Collection
接口与Map
接口主要用于存储元素,而Iterator
主要用于迭代访问(即遍历)Collection
中的元素,因此Iterator
对象也被称为迭代器。
Iterator是一个接口,所以每个集合都存在这个方法生成一个迭代器。
public Iterator iterator()
: 获取集合对应的迭代器,用来遍历集合中的元素的。
迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
常用的方法如下所示:
* public E next()
:返回迭代的下一个元素。
* public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
使用:
Iterator<String> it = coll.iterator();// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
如果使用next()后没有元素,会报出java.util.NoSuchElementException没有集合元素的错误。
关于迭代器的实现原理可以阅读更高级的jvm书籍或者Java书籍去获得,作者也并未深究,因为目前的还没学习完
如果学过c,你可以理解成指针,它的内部就是指针进行的,如果不好理解就可以用链表相关的去进行一个理解。后续补上····
这里关于遍历,除了while,for,dowhile还有一种,foreach,也就是增强for
格式:
for(元素的数据类型 变量 : Collection集合or数组){
//写操作代码
}
它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。
int[] arr = {3,5,6,87};
for(int a : arr){//a代表数组中的每个元素
System.out.println(a);
}
泛型
概念:
* 泛型:可以在类或方法中预支地使用未知的类型。
tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
定义格式:
修饰符 class 类名<代表泛型的变量> { }
例如,API中的ArrayList集合:
class ArrayList<E>{
public boolean add(E e){ }
public E get(int index){ }
....
}
使用泛型: 即什么时候确定泛型。
在创建对象的时候确定泛型
例如,ArrayList<String> list = new ArrayList<String>();
此时,变量E的值就是String类型,那么我们的类型就可以理解为:
class ArrayList<String>{
public boolean add(String e){ }
public String get(int index){ }
...
}
再例如,ArrayList<Integer> list = new ArrayList<Integer>();
此时,变量E的值就是Integer类型,那么我们的类型就可以理解为:
class ArrayList<Integer> {
public boolean add(Integer e) { }
public Integer get(int index) { }
...
}
举例自定义泛型类
public class MyGenericClass<MVP> {//没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
private MVP mvp;
public void setMVP(MVP mvp) {
this.mvp = mvp;
}
public MVP getMVP() {
return mvp;
}
}
使用:
public class GenericClassDemo {
public static void main(String[] args) {// 创建一个泛型为String的类
MyGenericClass<String> my = new MyGenericClass<String>(); // 调用setMVP
my.setMVP("大胡子登登");// 调用getMVP
String mvp = my.getMVP();
System.out.println(mvp);//创建一个泛型为Integer的类
MyGenericClass<Integer> my2 = new MyGenericClass<Integer>();
my2.setMVP(123);
Integer mvp2 = my2.getMVP();
}
}
含有泛型的方法
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
public <MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public <MVP> MVP show2(MVP mvp) {
return mvp;
}
public static void main(String[] args) {// 创建对象
MyGenericMethod mm = new MyGenericMethod();// 演示看方法提示
mm.show("aaa");
mm.show(123);
mm.show(12.45);
}
含有泛型的接口
定义格式:
修饰符 interface接口名<代表泛型的变量> { }
同上
泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用? ?表示未知通配符。
public static void main(String[] args) {
Collection<Intger> list1 = new ArrayList<Integer>();
getElement(list1);
Collection<String> list2 = new ArrayList<String>();
getElement(list2);
}
public static void getElement(Collection<?> coll){}
泛型不存在继承关系 Collection