本文共 6104 字,大约阅读时间需要 20 分钟。
集合实际上就是一个容器,可以用来容纳其他类型的数据。
集合是一个容器,是一个载体,可以一次容纳多个对象。在实际开发中,假设连接数据库,数据库中有10条记录,那么假设把这10条记录查询出来,在Java程序中会将10条数据封装成10个Java对象,然后将10个Java对象放到某一个集合中,将集合传到前端,然后遍历集合,将一个数据一个数据展现出来。
集合不能直接存储基本数据类型,另外集合也不能直接存储Java对象,集合当中存储的都是Java对象的内存地址(或者说集合中存储的是引用)
注意:集合在Java中本身就是一个容器,是一个对象,集合中任何时候存储的都是“引用”
在Java中每一个不同的集合,底层会对应不同的数据结构,往往在不同的集合中存储元素,等于将数据放到了不同的数据结构中。(数据存储的结构就是数据结构)
使用不同的集合等于使用了不同的数据结构。 例如: new ArrayList(); 创建一个集合,底层是数组 new LinkedList(); 创建一个集合对象,底层是链表 new TreeSet();创建一个集合对象,底层是二叉树 …Java.util. * ; (所有的集合类和集合接口都在Java.util包下)
集合继承结构图 ---- Collectiion部分
集合继承结构 ------ Map部分
总结: ArrayList:底层是数组 LinkedList:底层是双向链表 Vector:底层是数组,线程是安全的,效率较低,使用较少 HashSet:底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合的key部分了 TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap集合key部分了 HashMap:底层是哈希表 Hashtable:底层也是哈希表,只不过线程是安全的,效率较低,使用较少 Properties:是线程安全的,并且key和value只能存储字符串String TreeMap:底层是二叉树,TreeMap集合的key可以自动按照大小顺序排序注意:借口是抽象的,无法实例化
import java.util.ArrayList;import java.util.Collection;public class Test { public static void main(String[] args) { Collection c = new ArrayList(); //Collection c = new LinkedList(); c.add(10000); //自动装箱,实际上是放进去了一个对象的内存地址,Integer x = new Integer(10000); c.add(new Object()); c.add(true); //都是自动装箱 System.out.println("集合中元素的个数:" + c.size()); //3 //清空集合 c.clear(); System.out.println("集合中元素的个数:" + c.size()); //0 //再向集合中添加元素 c.add("java"); c.add("c"); c.add("钢铁侠"); c.add(666); c.add(new Student()); //判断集合中是否包含 "钢铁侠" boolean flag =c.contains("钢铁侠"); System.out.println(flag); //true System.out.println(c.contains("java")); //true //删除集合中的某个元素 c.remove(666); //如果集合中有相同的元素,则本语句只能删除其中的一个元素 System.out.println(c); // [java, c, 钢铁侠] //判断集合是否为空 System.out.println(c.isEmpty()); //false //将集合转换成数组 Object[] objects = c.toArray(); for (Object o : objects) { System.out.println(o); } }}class Student{ }
迭代器遍历集合:
迭代器是一个对象,迭代器对象有三个方法import java.util.Collection;import java.util.HashSet;import java.util.Iterator;public class CollectionTest { public static void main(String[] args) { //以下遍历方式/迭代方式,是所有Collection的通用的一种方式 //在Map集合中不能使用,在所有的Collection以及子类中使用 Collection c = new HashSet(); //无序不可重复 c.add("Jay"); c.add("lee hom"); c.add(10000); c.add(new Object()); //第一步:获取集合对象的迭代器对象Iterator Iterator it = c.iterator(); /* 以下两个方法是迭代器对象Iterator中的方法; boolean hasNext() 如果仍有元素可以迭代,则返回true Object next() 返回迭代的下一个元素 */ //第二步:遍历集合 while (it.hasNext()){ Object obj = it.next(); System.out.println(obj); } }}
注意:contains方法是用来判断集合中是否包含某个元素的方法,它在底层实现是调用了equals方法进行比对,equals方法方法返回true,就表示包含这个元素。
import java.util.ArrayList;import java.util.Collection;public class CollectionTest02 { public static void main(String[] args) { Collection c = new ArrayList(); User u1 = new User("jack"); c.add(u1); User u2 = new User("jack"); System.out.println(c.contains(u2)); //假如User类没有重写equals方法,结果会是false,因为他会调用Object类的equals方法 //当user类重写equals方法时,结果是true,比较的是那么值 }}class User{ private String name; public User(){ } public User(String name) { this.name = name; } public boolean equals(Object o){ if (o == null || !(o instanceof User)) return false; if(o == this) return true; User u = (User)o; return u.name.equals(this.name); }}
存放在一个集合中的类型,一定要重写equals方法
集合元素的remove()方法
重点:当集合的结构发生改变时,迭代器必须重新获取,否则会出现异常。 重点:在迭代集合元素的过程中,不能调用集合对象的remove方法,删除元素 重点:在迭代元素的过程中,一定要使用Iterator的remove()方法删除元素时,因为这样会自动更新迭代器,并且更新集合(即删除集合中的元素)List集合:List接口是Collection 接口的子接口
List集合存储元素的特点:有序可重复 有序:LIst集合中的所有元素都有下标,从0开始,依次递增 可重复:可以存储相同的元素List 接口下面主要有两个实现 ArrayList 和 LinkedList,他们都是有顺序的,也就是放进去
是什么顺序,取出来还是什么顺序,也就是基于线性存储,可以看作是一个可变数组 ArrayList:查询数据比较快,添加和删除数据比较慢(基于可变数组) LinkedList:查询数据比较慢,添加和删除数据比较快(基于链表数据结构) List集合通过下标进行遍历import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ListTest { public static void main(String[] args) { List myList = new ArrayList(); myList.add("A"); myList.add("B"); myList.add("C"); myList.add("D"); System.out.println(myList); //[A, B, C, D] myList.add(1, "K"); //迭代 Iterator it = myList.iterator(); while (it.hasNext()){ Object object = it.next(); System.out.println(object); } //根据下标获取元素 Object firstObj = myList.get(0); //A System.out.println(firstObj); for (int i = 0; i < myList.size(); i++){ Object o = myList.get(i); System.out.println(o); } //获取指定对象第一次出现处的索引 System.out.println(myList.indexOf("K")); // 1 //获取指定对象的最后一次出现处的索引 System.out.println(myList.lastIndexOf("C"));// 3 //删除指定下标的元素 myList.remove(0); // 删除下标为0的元素A System.out.println(myList); // [K, B, C, D] //修改指定位置的元素 myList.set(2, "Java"); System.out.println(myList); // [K, B, Java, D] }}
ArrayList的三种构造方法:
mport java.util.ArrayList;import java.util.Collection;import java.util.HashSet;import java.util.List;public class ArrayListTest { public static void main(String[] args) { //默认初始化容量为10 List myList1 = new ArrayList(); //指定初始化容量为50 List myList2 = new ArrayList(50); //创建一个HashSet集合 Collection c = new HashSet(); c.add(111); c.add(222); c.add(333); c.add(444); //通过这个构造方法就可以贾昂HashSet集合转换为List集合 List myList3 = new ArrayList(c); for (int i = 0; i < myList3.size(); i++){ System.out.println(myList3.get(i)); } }}
转载地址:http://aeqwi.baihongyu.com/