迭代器 Iterator
Collection接口下遍历集合(ArrayList , LinkedList , Vector)使用的普通for循环或者foreach,除此之外List在API还提供了一种新的迭代器Iterator
注意:迭代器在运行时不能使用集合中的remove()方法,会发生异常
foreach本质上也是用迭代器实现的,所以foreach也不能用remove()方法删除元素
优点:就是提供一种方法,对一个容器对象中的各个元素进行访问,而且程序员不需要知道底层结构
ArrayList<String> a = new ArrayList<String>(); a.add("sds"); a.add("sfd"); a.add("sgf"); a.add("shg"); Iterator<String> iterator = a.iterator(); while (iterator.hasNext()){ String s = iterator.next(); System.out.println(s); }
List接口:有序集合
list接口概念:一个有序集合(也被称之为序列),此接口的用户在列表中的每个元素被插入的地方都有精准控制,用户可以通过他们的整数搜索(在列表中的位置访问元素),并在列表中搜索元素
List接口是:ArrayList、LinkedList、Vector类的父接口
List接口提供了特殊的迭代器,称之为listIterator,该迭代器允许元素的插入和替换
List集合的有序接口和实现类
list接口的实现类:元素有序(索引)、允许null元素、允许重复元素、jdk1.5之后支持泛型、可以在指定位置上插入元素、通过索引访问元素
ArrayList:线程不同步,ArrayList是可变动态数组数据结构,对于查询和修改ArrayList的效率更高,它的容量自动增加初始化10
重要的方法:
ArrayList<String> list = new ArrayList<String>(); list.add("das"); //添加的方法,返回值是布尔 list.add(1,"dasdsa");//将指定元素插入到指定位置 返回值void list.lastIndexOf("dsa");//返回对象在集合中最后一次出现的索引位置,没有就是-1 list.indexOf("dsa");//返回对象在集合中出现的位置没有就是-1 list.contains("fddf");//如果此列表包含此元素就返回true 返回的是布尔 list.set(0,"fdf");//修改此列表中某个索引上的元素 list.get(2);//返回此列表中索引处的元素 list.remove(1);//删除方法可以写索引,也可以写要删除的元素 list.size();//返回此列表的元素数
list转数组:toArray()
ArrayList<String> list = new ArrayList<String>(); list.add("das"); list.add("das"); list.add("das"); String[] strings = list.toArray(new String[0]); for (int i = 0; i < strings.length; i++) { System.out.println(strings[i]); }
isEmpty() 判断集合中是否有元素
list.isEmpty();//判断集合中是否有元素,返回值是布尔
Linkedlist:线程不同步,基于链表数据结构,对于插入和删除Linkedlist效率更高,他的容量是自动增加没有初始化大小
Linkedlist提供的房和和Arraylist的方法基本相同,但是Linkedlist此外增加了很多方法
LinkedList<String> list = new LinkedList<String>(); list.addFirst("fsd");//将指定元素插入此列表的开头 list.addLast("dasd");//将指定元素插入此列表的结尾 list.getFirst();//返回此列表的第一个元素 list.getLast();//返回此列表的最后一个元素 list.removeFirst();//删除此列表的第一个元素 list.removeLast();//删除此列表的最后一个元素
队列:这个集合的add方法是先进先出,
堆栈操作
list.push("das");//堆栈操作:先进后出 list.peek();//获取但不移除此列表的第一个元素 list.poll();//当列表没有元素访问该方法返回null list.pop();//基于栈构建元素,当栈中没有元素时,调用该方法会发生异常
Vector:线程同步安全、可变动态数组结构、它的容量自动增加大小为10、方法和Arraylist一样
Set接口无序集合:不包含重复的元素,最多只能有一个空元素
HashSet:支持泛型,不同步,元素不可以重复,可以为null,不保证set迭代顺序,
HashSet底层结构是哈希表,他如何保证元素唯一性:
HashCode和equals方法在说明:1、hashcode相等,两个对象不一定相等,需要equals再进行判断
2、hashcode不相等两个对象一定不相等
3、equals为true,则hashcode肯定一样
4、equals为false,则hashcode不一定一样,也有可能一样
如果哈希值不同(hashcode)就添加到元素中,如果哈希值相同那么用equals进行在判断
java对象如果要比较是否相等,则需要重写equals和hashcode方法,将两个对象加入HashSet
instanceof严格来说是java中的一个双目运算符,用来测试一个对象是否是一个类的实例
TreeSet实现类:支持泛型,不同步,元素可以重复,值不能为为null,元素间有一定自然顺序(数值类型默认:从小到大 字符串按照字典)