一、Collection的常用方法以及迭代
public class TestCollection {
public static void main(String[] args) {
//1.创建Collection相关的对象
Collection<Integer> c = new ArrayList();
//2.向集合中存入数据
c.add(100);
c.add(200);
c.add(300);
c.add(400);
c.add(500);
System.out.println(c);//[100, 200, 300, 400, 500]
//3.测试集合中的常用方法
//c.clear();//清空集合
System.out.println(c.hashCode());//打印集合对象的哈希码值
System.out.println(c.equals(200));//false,集合对象与集合中某一个元素不等
System.out.println(c);//打印的不是集合对象的地址值,而是集合中的具体元素
System.out.println(c.contains(200));//true,判断集合当中是否包含200
System.out.println(c.isEmpty());//false,判断集合是否为空
System.out.println(c.remove(100));//删除集合中的指定元素100
System.out.println(c.size());//4,获取集合中元素的个数
Object[] array = c.toArray();//将集合对象转化为数组
System.out.println(Arrays.toString(array));//使用数组工具类打印数组
//4.1测试集合间的操作
Collection<Integer> c2 = new ArrayList<>();
c2.add(2);
c2.add(4);
c2.add(5);
System.out.println(c2);//[2, 4, 5]
//4.2测试多个集合间的操作
System.out.println(c.addAll(c2));//将c2集合的所有元素添加到c集合中
System.out.println(c.containsAll(c2));//判断c集合中是否包含c2集合的所有元素
System.out.println(c.removeAll(c2));//删除c集合中属于c2的所有元素
System.out.println(c.retainAll(c2));//保留c集合中属于c和c2集合的公共元素,取交集
//使用迭代器迭代c2集合
//1.获取迭代器
Iterator<Integer> it = c2.iterator();
//2.判断集合中是否有下一个元素可以迭代
while (it.hasNext()){
//3.获取本轮循环迭代到的集合元素
System.out.println(it.next());
}
}
二、List接口常用方法以及迭代
1、List接口
List接口是有下标的、有序的、可以存放重复元素的集合。
//测试单个集合的操作
System.out.println(list.contains());//包判断是否包含该元素
System.out.println(list.isEmpty());//判断集合是否为空
System.out.println(list.remove());//删除指定元素
System.out.println(list.size());//获取集合中元素的个数
System.out.println(Arrays.toString(list.toArray()));//集合转数组并打印
//测试集合间的操作
List<String> list2 = new ArrayList<>();
list2.add("1");
list2.add("2");
list2.add("3");
list2.add("4");
System.out.println(list2);
System.out.println(list.addAll(list2));//将集合list2添加到list集合中
System.out.println(list.containsAll(list2));//判断list中是否包含list2
System.out.println(list.removeAll(list2));//删除list中list2的元素
System.out.println(list2.retainAll(list));//保留list2中的所有元素
//测试list集合的独有方法
list.add();//根据索引添加元素,可重复添加
System.out.println(list.indexOf());//判断元素第一次出现的索引
System.out.println(list.lastIndexOf());//判断元素最后一次出现的索引
System.out.println(list.remove());//根据下标删除元素,并把被删除的元素返回
System.out.println(list.get());//根据索引获取对应的元素
System.out.println(list.set());//根据索引修改指定位置的元素
list.addAll(list2);
list.addAll(1,list2);//在集合list中指定索引添加list2中的元素
/*集合的迭代方式
* 1.for循环
* 2.foreach循环
* 3.iterator迭代器
* 4.listIterator*/
//方式一:因为List集合是有序的,元素是有下标的,所以可以根据下标进行遍历
for (int i = 0; i < list.size(); i++) {
//根据本轮循环到的下标值,获取集合中对应下标处的元素
System.out.println(list.get(i));
}
//方式二:因为普通for循环写法复杂,效率还低,所以使用高效for循环
for (String e : list){
System.out.println(e);
}
//方式三:使用的是从父接口Collection处继承过来的迭代器iterator
Iterator<String> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//方式四:使用List接口特有的迭代器ListIterator
/*listIterator是List接口特有的迭代器
* ListIterator<E>--子接口--继承了父类的功能*/
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()){
System.out.println(it2.next());
}
2、ArrayList实现类
ArrayList的特点:
* 1.List接口的实现类
* 2.底层的数据结构是数组,内存空间是连续的
* 3.元素有下标,有序,允许存放重复的元素
* 4.通常可以根据下标进行操作
* 5.增删操作比较慢,查询操作比较快[数据量比较大时]
/*底层会自动帮我们创建数组用于存放对象,并且数组的初始容量是10*/
//1.创建对应的集合对象
ArrayList<Integer> list = new ArrayList<>();
//2.向集合添加元素
//[100, 200, 300, 400, 400, 300]
//3.测试常用方法
System.out.println(list.contains());//是否包含该集合类型的元素
System.out.println(list.get());//获取集合中下标0处的元素
System.out.println(list.indexOf();//获取元素第1次出现的索引
System.out.println(list.lastIndexOf());//获取元素最后一次出现的索引
System.out.println(list.remove());//根据下标删除集合中的指定元素
/* List中有两个重载的remove(),如果直接传入数字300
会直接匹配int类型的index索引方法,而不会认为这是一个Integer类型的数据
所以,如果想要根据指定元素删除数据,需要把int类型的数据手动装箱成Integer*/
System.out.println(list.remove(Integer.valueOf(300)));
System.out.println(list.size());//获取集合的元素个数
list.set(2,777);//修改下标2处的元素,值为777
/**
* ArrayList集合的迭代方式
*/
//1.使用for循环迭代集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//2.使用高效for循环迭代集合
for(Integer e : list){
System.out.println(e);
}
//3.使用iterator迭代器
Iterator<Integer> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//4.使用ListIterator迭代器
ListIterator<Integer> it2 = list.listIterator();
while (it2.hasNext()){
System.out.println(it2.next());
}
3、LinkedList实现类
1)LinkedList的内存地址不连续,是靠着节点之间的地址连接起来的
2)LinkedList也是有下标的,从0开始,也就是说头节点是0号字节
3)普通节点保存的是上一个节点的地址与下一个节点的地址
4)头节点保存的只有下一个节点的地址,尾节点保存的只有上一个节点的地址
LinkedList的特点:
* 1.List接口的实现类
* 2.底层的数据结构是链表,内存空间是不连续的
* 3.元素有下标,有序,允许存放重复的元素
* 4.通常进行首尾节点的操作比较多
* 5.增删操作比较快,查询操作比较慢[数据量比较大时
注意:LinkedList的查询操作也不是都慢,首尾操作还是比较快的
//1.创建集合对象
LinkedList<String> list = new LinkedList<>();
//2.添加数据
//[孙悟空, 猪八戒, 唐三藏, 沙师弟, 白龙马]
//3.测试LinkedList独有的方法
list.addFirst("蜘蛛精");//向链表添加首元素
list.addLast("玉兔精");//向链表添加尾元素
System.out.println(list);
System.out.println(list.getFirst());//获取链表中的首元素
System.out.println(list.getLast());//获取链表中的尾元素
System.out.println(list.removeFirst());//删除链表中的首元素并返回被删除的元素
System.out.println(list.removeLast());//删除链表中的尾元素并返回被删除的元素
//4.其他测试
LinkedList<String> list2 = new LinkedList<>();
//[水浒传, 三国演义, 西游记, 石头记]
System.out.println(list2.element());//获取首元素
/*别名:查询系列*/
System.out.println(list2.peek());//获取首元素
System.out.println(list2.peekFirst());//获取首元素
System.out.println(list2.peekLast());//获取尾元素
/*别名:新增系列*/
System.out.println(list2.offer("斗罗大陆"));//添加尾元素
System.out.println(list2.offerFirst("三体"));//添加首元素
System.out.println(list2.offerLast("娃"));//添加尾元素
/*别名:移除系列*/
System.out.println(list2.poll());//删除首元素
System.out.println(list2.pollFirst());//删除首元素
System.out.println(list2.pollLast());//删除尾元素
}
三、Set接口的迭代
1、Set集合的特点
set集合中的元素都是没有顺序的
set集合中的元素不能重复
set集合允许存null值,但是最多存一个
如果set集合中存放的是我们自定义的类型,需要给自定义类中添加重写equals()与hashCode()
set集合才会实现按照类型+属性+属性值来去重
否则会认为其是两个不同的对象,因为地址值不同,不会去重
2、Set集合的迭代
Iterator<String> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}