java集合
把java集合理解成一个行李箱就可以了,行李箱里面装的都是相同类型的对象,方便携带,查找等。java语言的数据结构主要体现在java集合中。
java集合框架的体系结构:
由两大家族组成(Collection家族和Map家族)
Collection接口有三个子接口:List(元素排列有序,可重复),Queue(元素排列有序,可重复),Set(元素无序,不可重复)
List有一个很重要的实现类:ArrayList
Queue有一个很重要的实现类:LinkedList(同时也是List的实现类)
Set也有一个很重要的实现类:HashSet,HashSet本质上是通过HashMap实现的(只用了它的Key,没有使用它的Value)
Map有一个非常重要的实现类:HashMap,里面存储的是Entry(键值对)
List可以精确的控制每个元素的插入位置,或删除某个位置的元素。ArrayList的底层由数组实现。
List<Course> coursesToSelect=new ArrayList<Course>();
coursesToSelect.add(new Course());//增
coursesToSelect.add(0,new Course());在第一个位置插入对象
将数组转化成一个List:
Course[] courses=new Course[];
coursesToSelect.addAll(Arrays.asList(courses));//添加一个List
Iterator it=coursesToSelect.iterator(); //返回一个迭代器 (遍历)
while(it.hasNext()){
Course cr=it.next()
}
coursesToSelect.size() //返回当前List的大小
coursesToSelect.get(3); //查
coursesToSelect.set(1,new Course()); //改
coursesToSelect.remove() //删
集合中存放的是一个个对象的引用
泛型:限制容器中只能添加某种类型的对象。
------------------------------------------------------------------------
Set<Course> courses=new HashSet<Course>();
遍历Set只能使用foreach或者iterator,每次遍历出来的元素顺序都不一样。不能使用get()方法,因为集合里面的元素是无序的。
-----------------------------------------------------------------------------
Map<K,V> students=new HashMap<K,V>();
students.put(K key,V value); //往map中添加一个元素(Entry)
map中存放的是一个个键值对,键是不可以重复的,可以根据键来查找到对应的Value值。
students.remove(Object key) //根据键来删除某个Entry
HashMap是基于哈希表实现的,HashMap中的Entry对象是无序排列的
通过map的keySet()方法可以返回Map中的所有“键”的Set集合
通过map的EntrySet()方法可以返回Map中的所有键值对的Set集合
Set<Entry<String,Student>> entrySet=students.entrySet();
-------------------------------------------------------------------------------------------------------------
容器的contains()方法:判断该容器是否包含某个对象。以ArrayList为例,查看ArrayList类的源代码发现,
contains()方法的实现原理是遍历容器中的每一个对象,并调用该对象的equals()方法,如果内中有一个对象
与要判断的对象相等,就返回true.
因为所有对象都继承自Object对象,而Object对象的equals()方法默认是通过==来实现的,所以如果没有复写
equals()方法,那么
List<Student> students=new ArrayList<Student>();
Student s1=new Student("libi");
students.add(s1);
则students.contains(s1);返回true
Student s2=new Student("libi");
students.contains(s2);返回false,因为比较的是java虚拟机栈中的引用值。
这时就需要复写Student类中的equals()方法了,根据姓名来判断两个对象是否相等,如果name相等,那么
obj1.equals(obj2)返回true;
那么Student s2=new Student("libi");
students.contains(s2);返回true
-----------------------------------------------------------------------------------------------------------------------------------
HashMap的底层实现原理:
HashMap的底层实际上是一个数组,数组里面存放的是Entry,即键-值对。每一个数组的元素又叫bucket(桶),一桶里只能存放一个Entry(或者一个Entry链)。现在有一个键值对<Key,Value>,HashMap通过对键进行hashcode(),得到键的哈希值,然后hash()得到具体的在数组中的索引值。
hash()
hashcode(key)————>得到存放于数组中的位置
现在如果想得到该Entry,只需计算出该Entry存放在数组中的具体位置(使用相同的哈希算法,即hash(hashcode(key))),就能非常快捷方便的找到该Entry了。
如果有两个key,它们对应的hash(hashcode(key))的值相同,那么就需要比较key是否相同了(使用equals()比较),如果key相同的话,那么就覆盖掉原来的Value值,即修改key对应的value值;如果key不相同的话,那么这两个Entry存放在数组中的相同位置,只不过通过链表关联起来(新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部)
HashMap的本质就是:不同的东西放在不同的位置,需要时才能快速找到它。
————————————————————————————————————————
java集合框架的5大家族:Collection,Map,Collections工具类(主要是sort()方法),Comparable<T>接口,Comparator<T>接口
List<Student> students=new ArrayList<Student>();
Collections.sort(students);
要想对Student排序,必须让Student实现Comparable接口(只有实现了之后才能说明Student是可以进行比较的)。
List<Integer> list0=new ArrayList<Integer>();
List<String> list1=new ArrayList<String>();
Integer和String(先数字,后字母(先大写后小写))都是可以比较的,因为它们都实现了Comparable接口。
实现了Comparable<T>接口,就必须实现int compareTo(Object obj)方法,在方法体中定义通过类的什么属性进行比较,
如果this>obj,则返回正数,=的话返回零,this<obj则返回负数。
Comparator<T>接口:定义临时的比较规则。实现了该接口的类必须实现int compare(T o1, T o2)方法。
如何使用:Collections.sort(students,new Comparator<Student>());