-
集合与数组的区别
相同点:都是容器,且能存放多个数据
不同点:
1.数组长度固定,集合长度可变;
2.数组可以存放基本数据类型或引用数据类型,而集合只能存放引用数据类型,对于基本数据类型需要存放其对应的包装类
Collection【接口】
- Collection集合体系结构
-
常用方法
方法名 说明 boolean add(E e) 添加元素 boolean remove(Object o) 从集合中移除指定的元素 void clear() 清空集合中的元素 boolean contains(Object o) 判断集合中是否存在指定的元素 boolean isEmpty() 判断集合是否为空 int size() 集合的长度,也就是集合中元素的个数 package darkhorse.jihe; import java.util.ArrayList; import java.util.Collection; public class CollectionDemo { public static void main(String[] args) { Collection<String> coll = new ArrayList<>(); // public boolean add(E e) // 只有是List允许添加重复元素,如果子接口是Set,那么返回的结果就是false,因为Set是不允许有重复元素的 coll.add("aaa"); System.out.println(coll.add("aaa")); coll.add("bbb"); coll.add("ccc"); System.out.println(coll.toString());// ArrayList类中对toString()方法进行了重写 // public void clear() // coll.clear(); // System.out.println(coll); // public boolean remove(E e) coll.remove("bbb"); System.out.println(coll); // public boolean contains(Object obj) System.out.println(coll.contains("aaa")); // public boolean isEmpty() System.out.println(coll.isEmpty()); // public int size() System.out.println(coll.size()); System.out.println("-------------------------------"); Collection<Student> coll1 = new ArrayList<>(); Student s1 = new Student("www",18); Student s2 = new Student("zzz",19); Student s3 = new Student("qqq",20); Student s4 = new Student("qqq",20); coll1.add(s1); coll1.add(s2); coll1.add(s3); System.out.println(coll1); // 需要在自定义的类中重写equals方法才能比较内容值,否则就会比较地址值,一般常用类中都会对equals进行重写以实现对内容值的比较 System.out.println(coll1.contains(s4)); } }
package darkhorse.jihe; import java.util.Objects; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } /** * 获取 * @return name */ public String getName() { return name; } /** * 设置 * @param name */ public void setName(String name) { this.name = name; } /** * 获取 * @return age */ public int getAge() { return age; } /** * 设置 * @param age */ public void setAge(int age) { this.age = age; } public String toString() { return "Student{name = " + name + ", age = " + age + "}"; } @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
-
遍历方式
-
迭代器遍历
package darkhorse.jihe; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class IteratorDemo { public static void main(String[] args) { Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd"); System.out.println(coll); // 创建迭代器对象,指针会指向集合第一个元素 Iterator<String> it = coll.iterator(); // 判断当前指针指向的位置是否有元素 while (it.hasNext()){ // 获取当前位置的元素,并将指针移动到下一个元素 String string =it.next(); System.out.println(string); } // 以上过程说明迭代器并不是通过索引来进行遍历的,而是来通过指针的移动来获取对应位置上的元素 // 遍历结束后并不会复位,而会指向空白,若强行获取元素则会报异常:NoSuchElementException // 所以要想重新遍历,必须再次创建一个迭代器对象来遍历 // System.out.println(it.next()); // 循环中next()个数为且集合元素个数同时偶数或者同时为奇数时,不会报错 // 反之,循环中next()个数与集合元素个数的奇偶性不同时,就会报错:NoSuchElementException // 原因:奇偶性相同,在遍历到最后一个元素时刚好结束一次完整的循环,此时指针指向空白,hasNext()的返回值为false,就不会开启下一次循环 // 原因:奇偶性不同,在遍历到最后一个元素时并没有结束一次完整的循环,此时指针指向空白,下一个Next()会强行获取空白位置的元素,从而产生异常:NoSuchElementException Iterator<String> it1 = coll.iterator(); while (it1.hasNext()){ System.out.print(it1.next()+" "); System.out.println(it1.next()+" "); } Iterator<String> it3 = coll.iterator(); while (it3.hasNext()){ String string = it3.next(); if(string.equals("aaa")){ // 若遍历的过程中通过集合对象的remove方法来删除元素,则会产生并发异常:ConcurrentModificationException //coll.remove(string); // 对此,迭代器对象也提供了一个remove方法,来实现在遍历过程中删除元素的需求 it3.remove(); } } System.out.println(coll); } }
-
增强for遍历
package darkhorse.jihe; import java.util.ArrayList; import java.util.Collection; public class EnhancedForDemo { public static void main(String[] args) { Collection<String> coll = new ArrayList<>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); coll.add("ddd"); // 增强for循环的底层是迭代器 for (String string : coll) { System.out.println(string); } for (String string : coll) { string = "fff"; // 循环过程中对变量string进行修改并不会改变集合对象中的值 // string只是一个基于迭代器第三方变量,指针指向哪个元素,string就存储哪个元素的值,并不会改变集合对象中的元素 } System.out.println(coll); } }
-
List【接口】
-
特点
存取有序、可重复、有索引
-
特有方法
方法名 描述 void add(int index,E element) 在此集合中的指定位置插入指定的元素 E remove(int index) 删除指定索引处的元素,返回被删除的元素 E set(int index,E element) 修改指定索引处的元素,返回被修改的元素 E get(int index) 返回指定索引处的元素 这四个方法(增删改查)都是基于List有索引这一特点来实现的,除了继承父接口能够直接删除元素外还可以通过索引来删除元素
-
List系列集合中的两个删除的方法
//1.直接删除元素 //2.通过索引进行删除 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.remove(1); // 删除索引为1的元素 list.remove(Integer.valueOf(1)) // 将int类型的1包装成integer对象来删除值为1的元素 System.out.println(list);
-
-
遍历方式
-
迭代器遍历:除普通迭代器之外还有特有的列表迭代器
ListIterator<String> it = list.listIterator(); while(it.hasNext()){ String str = it.next(1); // 从指定位置开始遍历 // 列表迭代器也可有 if("bbb".equals(str)){ it.add("qqq"); // 特有的增加操作 } } System.out.println(list);
基于List的特点,
ListIterator
要比Iterator
功能更丰富:- 双向遍历(
hasPrevious()
和previous()
)。 - 获取当前索引(
nextIndex()
和previousIndex()
)。 - 修改元素(
set(E e)
)。 - 添加元素(
add(E e)
)。 - 从指定位置开始遍历。
- 双向遍历(
-
增强for循环
-
普通for循环
for (int i = 0; i < list.size(); i++) { //i:依次表示集合中的每一个索引 String s = list.get(i); System.out.println(s); }
-