数组和集合的区别
1.数组的长度是固定的;数组元素类型可以是基本类型,也可以是引用类型
2.集合的长度是可变的;集合元素类型只能是引用数据类型。
集合中如要想存储基本数据类型,需要转换为包装类
int-->Integer
集合的体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zl8BtAiv-1598542352127)(assets/1598233973591.png)]
Colletion接口:集合体系的根接口
-- List接口: 有索引、新增了一些对索引进行操作的方法,可添加重复元素,存取有序
ArrayList类 : 底层数据结构是数组,查询快,增删慢
LinkedList类 : 底层数据结构是链表,查询慢,增删快
-- Set接口: 没有索引,不能添加重复元素,存取无序
HashSet类
TreeSet类
Collection接口
Collection集合体系的根接口,该接口中定义了集合的通用方法。
public boolean add(E e)
将指定的元素集合的结尾
public void clear()
清空集合中的元素
public boolean contains(Object o)
如果这个列表包含指定元素,返回true
public boolean isEmpty()
如果集合不包含任何元素,则返回true
public boolean remove(Object o)
从这个集合中移除指定元素的一个实例,如果它是存在的(可选操作)。
default boolean removeIf(Predicate<? super E> filter)
删除满足给定条件的这个集合的所有元素。
条件:通过Lambda表达式来提供
public int size()
返回此集合中的元素的数目
//Collection是一个接口,不能直接创建的对象。但是可以创建它的实现类对象,也可以调用接口的方法。
Collection<String> coll=new ArrayList<>();
//添加元素
coll.add("helloJava");
coll.add("world");
coll.add("helloWorld");
coll.add("java");
//删除集合中以"hello"开头的元素, s.startsWith("hello") 为判断语句
coll.removeIf(s->s.startsWith("hello")); //这里的s表示集合中的元素
System.out.println(coll);
三种遍历
迭代器遍历
在Java中所有的集合都可以使用迭代器(Iterator)进行遍历。不能遍历数组
- 使用迭代器遍历的注意事项
public class Test {
public static void main(String[] args) {
Collection<String> str = new ArrayList<>();
str.add("11");
str.add("2");
Iterator<String> it = str.iterator();
//str.removeIf(s -> s.startsWith("1",0)); 报错,创建迭代器后不能对集合进行增,删
while (it.hasNext()){
String next = it.next();
System.out.println(next);
}
}
}
注意问题:
当使用迭代器进行遍历集合的时候,集合自己不能去增加,删除集合中的元素
Java不允许迭代器遍历集合时,集合自己去增加,删除集合中的元素
否则java.util.ConcurrentModificationException(出现异常)
增强For的底层结构是迭代器,故同样不能在遍历过程中对集合增加,删除元素的操作
解决方案:
使用迭代器自己的删除方法 it.remove()
增强for遍历
增强for其实就是为了简化迭代器的代码书写,原理和迭代器一模一样。可以遍历数组和集合,同样不能在遍历过程中增加,删除元素,但不能使用迭代器的删除方法 it.remove()
for(元素类型 变量名 : 集合/数组){
//变量名就表示所有的元素
}
- 增强for遍历数组
int[] array={1,2,3,4,5};
for(int s:array){
System.out.println(s);
}
普通for遍历
普通for循环没有遍历对象,增强for有遍历对象,即普通for的循环判断语句可以自己所以随意设置
数据结构
数据的组织方式就叫做数据结构,不同的组织方式就形式不同的数据结构,每一种数据结构的特点不一样。
栈结构:先进后出 (子弹夹)
队列结构:先进先出 (排队、安检机)
数组:查询快,增删慢
链表:查询慢,增删快(每一个元素记录下一个元素的地址)
LinkedList类特有方法
由于 LinkedList底层是链表,新增了一些针对头和尾进行操作的方法。
public void addFirst(E e)
添加元素到集合开头
public void addLast(E e)
添加元素到集合末尾
public E removeFirst()
移除开头的元素
public E removeLast()
移除结尾的元素
public E getFirst()
获取开头的元素
public E getLast()
获取结尾的元素
素到集合末尾
public E removeFirst()
移除开头的元素
public E removeLast()
移除结尾的元素
public E getFirst()
获取开头的元素
public E getLast()
获取结尾的元素