# 1 集合:
* 1、用于存储对象的容器
* 2、集合的长度是可变的 (数组的大小是固定的)
* 3、集合中不可以存储基本数据类型
Collection中常用的方法
1,添加。
boolean add(Object obj):
boolean addAll(Collection coll):
2,删除。
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();
3,判断:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判断集合中是否有元素。
4,获取:
int size():
Iterator iterator():取出元素的方式:迭代器。
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。
所以该迭代器对象是在容器中进行内部实现的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,
也就是iterator方法。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
5,其他:
boolean retainAll(Collection coll);取交集。
Object[] toArray():将集合转成数组。
public static void collection(){ Collection col1 = new ArrayList(); Collection col2 = new ArrayList(); col1.add("1"); col2.add("2"); col2.add("3"); System.out.println(col1); col1.addAll(col2); System.out.println(col1); // col1.remove("1"); // System.out.println(col1); // col1.removeAll(col2); // System.out.println(col1); boolean contain = col1.contains("5"); System.out.println(contain); boolean containsAll = col1.containsAll(col2); System.out.println(containsAll); boolean empty = col1.isEmpty(); System.out.println(empty); int size = col1.size(); System.out.println(size); Iterator iterator = col1.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); if (next instanceof String && next.equals("1")) { iterator.remove(); } else { System.out.println(next); } } }
Collection
|-- List 有序可重复
|-- Set 无序不重复
# 2 、List
List:
|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。 addFirst等方法
/** * List :常见方法 1,添加 void add(index,element); void add(index,collection); 2,删除; Object remove(index): 3,修改: Object set(index,element); 4,获取: Object get(index); int indexOf(object);获取指定元素的索引 int lastIndexOf(object); List subList(from,to); * */ public static void list(){ List list = new ArrayList(); list.add("11"); list.add("22"); list.add("33"); list.add(1,"111"); System.out.println(list); list.remove(1); System.out.println(list); list.set(1,"222"); Object o = list.get(1); System.out.println(o); int i = list.indexOf("33"); System.out.println(i); int i1 = list.lastIndexOf("11"); System.out.println(i1); List list1 = list.subList(0, 1); System.out.println(list1); // List的遍历方式以及使用,使用Iterator接口的子接口ListIterator来完成在迭代中对集合元素进行的增删改查,不会抛出并发修改的异常, ListIterator listIterator = list.listIterator(); while (listIterator.hasNext()) { Object o1 = listIterator.next(); if (o1.equals("11")) { // 集合和迭代器同时对元素进行修改,就会产生异常,所以这里不能使用list.add(obj)等方法; listIterator.add("44"); // listIterator.set("111212"); // listIterator.remove(); } } System.out.println(list); }
# 3、Set
/** * Set * Set接口中的方法和Collection一致。 * |-- HashSet * |-- TreeSet 自然排序,如果存放的是自定义对象,使用TreeSet,必须实现Comparable接口,覆盖里面的compareTo方法,添加元素的时候进行比较;如果添加的是字符串 就不需要覆盖compareTo方法,因为字符串有自己的compareTo方法 , 自定义对象在TreeSet存储时候,如果不覆盖,就会报 java.lang.ClassCastException: cn.itcast.p.bean.Person cannot be cast to java.lang.Comparable异常 */ /** * HashSet * 内部数据结构是哈希表 ,是不同步的。 * 如何保证该集合的元素唯一性呢? 是通过对象的hashCode和equals方法来完成对象唯一性的。 如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。 如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。 如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。 如果HashSet不覆盖equal和hashCode方法的话,默认的是使用Object中的equal和hashCode方法 Object中的equal方法比较地址的,而不是比较内容,如果添加重复的对象,地址不同,就会认为没有重复的对象 所以比较对象是否相同,必须覆盖equal和hashCode方法 */ public static void hashSet(){ HashSet set = new HashSet(); set.add(new Person("pp",21)); set.add(new Person("zz",22)); set.add(new Person("tt",23)); set.add(new Person("pp",21)); Iterator iterator = set.iterator(); while (iterator.hasNext()) { Person person = (Person)iterator.next(); System.out.println(person.getName() + "---------" + person.getAge()); } } public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object obj) { System.out.println("调用了equals方法---------------"); if (this == obj) { return true; } if (!(obj instanceof Person)) { throw new ClassCastException("类型转化错误"); } Person person = (Person) obj; return this.name.equals(person.name) && this.age == person.age; } @Override public int hashCode() { // 判断人的hash值是否相同 System.out.println("调用了hashCode方法---------------"); return this.name.hashCode() + age; } }
# 4、 Map
*
* 可以使用键来查找对象,类似于数组下标。Map.put(key,value)插入数据,Map.get(key)查找数据。键要求唯一。存储方式不是顺序存储,速度快。不必指定Map的尺寸,因为它自己会自动的调整。
*
(1)HashMap使用最快的查找技术,存储无顺序。
(2)TreeMap按照比较结果升序保存。
(3)LinkedHashMap按照插入顺序保存键,同时保留HashMap的查询速度
常用方法:
1,添加。
value put(key,value):返回前一个和key关联的值,如果没有返回null.
2,删除。
void clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。
3,判断。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,获取。
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回null,来判断是否包含指定键。
int size(): 获取键值对的个数。
5.特殊方法: Collection<V> values() 包含的值的 Collection 视图。
private static void method1(Map<Integer, String> map) { map.put(1, "zhang"); map.put(2, "wang"); map.put(3, "li"); System.out.println(map); if (!map.isEmpty()) { if (map.containsKey(2)) { map.remove(2); } } System.out.println(map); System.out.println("size : " + map.size()); System.out.println(map.get(3)); Collection values = map.values(); Iterator iterator = values.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } }
/** * 第一种遍历的方法 * Set<K> keySet():返回键的set集合 * 取出map中的所有元素。 * 原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键, 在对每一个键通过map集合的get方法获取其对应的值即可。 */ private static void method2(Map<Integer, String> map) { map.put(8,"zhaoliu"); map.put(2,"zhaoliu"); map.put(7,"xiaoqiang"); map.put(6,"wangcai"); Set<Integer> keySet = map.keySet(); Iterator<Integer> iterator = keySet.iterator(); while (iterator.hasNext()) { Integer key = iterator.next(); String value = map.get(key); System.out.println(value); } }
/** * * Set<Map.Entry<K,V>> entrySet()方法:返回一个set集合,里面装的是Map.Entry接口类型的键值对象 * * 第二种遍历map的方式:通过看API:Set<Map.Entry<K,V>> entrySet():Map.Entry<K,V>接口类型, * 里面有K getKey() 返回与此项对应的键。 V getValue() 返回与此项对应的值。 * 思路:通过把map转化为set,进行迭代 * 通过使用entrySet方法吧键和值的映射关系作为对象,存储到set集合中,这个映射关系的类型为Map.Entry类型 * * */ private static void method3(Map<Integer, String> map) { map.put(8,"zhaoliu"); map.put(2,"zhaoliu"); map.put(7,"xiaoqiang"); map.put(6,"wangcai"); Set<Map.Entry<Integer, String>> entrySet = map.entrySet(); Iterator<Map.Entry<Integer, String>> iterator = entrySet.iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); System.out.println("key : " + entry.getKey()); System.out.println("value : " + entry.getValue()); } }