java回顾之单列集合、泛型、数据结构
一、collection
1.1集合概述
集合的作用:集合是一个容器,可以存储同种类型的多个数据
集合的特点:集合的长度是可变的,只能存储引用数据类型,不能存储基本数据类型,可以存基本数据类型的包装类
Collection常用方法
add:添加 clear:清空 remove:删除某个 contains:是否包含 isEmpty:判断集合是否为空
toArray 将集合装成Object[]类型
二、Iterator迭代器
2.1迭代器的作用
帮助Collection集合遍历元素的。用迭代器遍历集合要先获取迭代器的对象
快捷键:itit
Collection<String> coll = new ArrayList<>(); 获取迭代器对象 Iterator<String> it=coll.iterator(); 迭代器的方法有 next() 获取集合中的元素 hasNext() 判断集合中有没有下一个元素 remove()删除当前元素 while(it.hasNext()){ String s=it.next() }
迭代器原理
lastRet是下标
使用迭代器遍历集合会出现并发修改异常,是因为在遍历集合的时候,进行了增删的操作,目前新增无解决办法,删除使用迭代器删除,就可以避免迭代器异常
//使用循环获取每一个元素 while(it.hasNext()){ String s = it.next(); if(s.equals("柳岩")){ //使用迭代器对象删除当前元素 it.remove(); } }
2.2、增强for循环
增强for循环也是可以遍历collection集合和数组
快捷键:iter
格式 for(元素的类型 元素名 : 集合/数组){ }
好处是简单快捷,缺点是底层也是迭代器,也会出现并发修改异常,而且不能使用索引
3、泛型
3.1泛型的作用
规定了要存储的类型,取出来也方便使用,给集合加上泛型,一看就知道里面的数据是什么类型
当使用未定义的泛型的时候,只有在调用的时候确定类型 格式:<大写字母>
比如类上定义泛型格式
//泛型代表的是某一种引用数据类型 public class MyArrayList<T> { } 在每次创建对象时确定具体的类型 //创建对象 MyArrayList<String> list = new MyArrayList<>(); //泛型确定为了字符串类型
比如方法上定义泛型格式
在每次调用方法时确定具体类型 public class AAA { //方法上定义泛型 public <T> void method(T t){ } } //创建对象 AAA a = new AAA(); //调用方法泛型确定为字符串 a.method("abc"); //调用方法泛型确定为整数 a.method(123);
接口上定义泛型
//泛型代表某种引用数据类型
//泛型的定义是在<>写一个大写字母
public interface MyColl<T> { void method(T t); } - 在定义子类时确定泛型具体的类型 public class MyAAA implements MyColl<String>{ //在子类中确定了泛型的具体类型 @Override public void method(String s) { } } - 在子类上不确定具体类型,就把接口的泛型变成类上的泛型 public class MyBBB<T> implements MyColl<T> { //重写父类抽象方法 @Override public void method(T t) { } } 然后在创建对象的时候,确定泛型的类型 MyBBB<String> mb = new MyBBB<>(); mb.method("123");
3.2 泛型通配符
<?> :可以传递任何的泛型类型
<? extends XXX> :可以传递XXX以及XXX的子类类型
<? super XXX> :可以传递XXX以及XXX的父类类型
4、数据结构
4.1栈和队列
栈:
栈是一个线性表结构,只有一个出入口,从同一个口存放数据和移出数据 特点:先入后出
队列:
队列也是一个线性表,队列有两个开口,从一边存入数据,从另一边取出数据 特点:先入先出
数组:数组是在内存中开辟的一块连续的内存空间 特点:增删慢,查询快
链表:链表在内存中时不连续的内存空间,数据结构有单向链表和双向链表,先说单向链表,单向链表的意思就是前一个节点记录后一个节点的位置。特点:增删快,查询慢