黑马程序员 集合框架知识点
(Treeset)整理------- android培训、java培训、期待与您交流!----------
(一)知识点梳理
1:List及其子类(掌握)
(1)List的特点:
Collection
|--List:元素有序(存入顺序和取出顺序一致),可重复。
|--Set:元素无序,唯一。
(2)List的特有功能:
A:添加功能
add(int index,Object obj)
B:删除功能
remove(int index)
C:获取功能
get(int index)
D:修改功能
set(int index,Object obj)
(3)案例:
List存储字符串并遍历。
List存储自定义对象并遍历。
使用集合存储自定义对象的步骤:
1、定义要存储到集合当中的类
2、创建 集合<要存储到集合当中的类> 集合引用变量 = new 集合<要存储到集合当中的类>();
3、创建要存储到集合当中的类的对象们
4、调用集合方法,存储对应的对象
5、返回对应集合的迭代器
6、使用迭代器判断是否有下个元素
7、如果有下个元素则获取下个元素
(4)List的三个子类的特点:
List:
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询慢,增删慢。
线程安全,效率低。所以一般不用。
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
到底使用谁?
是否需要安全:
是:Vector(将来其实也不用这个,会有更好的方式,后面提)
否:用ArrayList或者LinkedList
如何查询多:ArrayList
如果增删多:LinkedList
如果你根本就不知道用谁?用ArrayList。
(6)List的三个儿子的各自特有功能:(了解)
A:ArrayList
B:Vector
JDK1.0时候的功能。但是后来被替代。所以不用掌握。
C:LinkedList
由于是链表,所以,操作开头和结尾比较简答。提高了添加,删除,获取开头或者结尾。
(7)案例:
Collection
List
ArrayList
Vector
LinkedList
分别存储字符串和自定义对象并遍历。
(8)遍历:
Collection:迭代器。
|--List:普通for
|--ArrayList
|--Vector 返回Enumeration
|--LinkedList
2:Set(掌握)
(1)Set集合的特点:
无序(存储和取出的顺序不一致),唯一。
(2)HashSet
如何保证元素的唯一性呢?
底层数据结构是哈希表。哈希表依赖于哈希值。
最终依赖两个方法hashCode()和equals()。
顺序:
先比较hashCode()值:
相同:
继续走equals()方法,根据返回值:
true:说明元素重复。不添加。
false:说明元素不重复,添加。
不同:就直接添加到集合。
案例:
HashSet存储字符串并遍历。(String类重写了hashCode()和equals())
HashSet存储自定义对象并遍历。
存储Person对象,然后去掉重复值。(标准代码)
(3)TreeSet(理解)
如何保证元素的唯一性?
根据返回值是否是0。
如何保证元素的排序?
A:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
重写compareTo(T t)
B:比较器排序(集合具备比较性)
在创建集合对象的时候,传递Comparator接口的子类对象
重写compare(T t,T t2)
案例:
TreeSet存储字符串并遍历。(String实现了Comparable接口)
TreeSet存储自定义对象并遍历。
(标准代码 看懂就行)
存储学生对象,要求保证唯一和排序(先比较年龄,再比较姓名)。
(4)LinkedHashSet:(理解)
底层数据结构是哈希表和链表。
由哈希表保证元素唯一。
由链表保证元素有序。
3:增强for(掌握)
(1)是针对数组和Collection集合进行遍历的一种方式。
(2)格式:
for(数组或者Collection集合中的元素的数据类型 变量名 : 数组或者Collection集合对象) {
直接使用变量名即可,这个时候的变量名其实就是元素。
}
注意:
A:增强for的底层封装了迭代器的操作。
B:在使用增强for的时候,请保证迭代目标不为null。
C:增强for循环只能做展示数据的功能,不能修改数据
(二)代码实现部分
1. ListIterator
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
* ListIterator
*
* boolean hasPrevious() 判断是否有前一个元素
* E previous() 获取前一个元素
* void set(E e) 修改元素
*/
public class Demo01_iterator {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList();
//创建元素对象
String name = "宋江";
String name2 = "花荣";
String name3 = "李逵";
//将元素放到集合中
list.add(name);
list.add(name2);
list.add(name3);
//迭代集合
//返回迭代器
ListIterator iterator = list.listIterator();
//调用迭代器的hashNext与next方法,完成迭代
while (iterator.hasNext()) {
String string = (String) iterator.next();
System.out.println(string);
iterator.add("林冲");
}
while(iterator.hasPrevious()) {
String string = (String) iterator.previous();
System.out.println(string);
if("林冲".equals(string)) {
iterator.set("豹子头");
}
}
System.out.println(list);
}
}
2.HashSet相关的代码
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/*
* HashSet: Set子类,对元素进行哈希约束
*
* HashSet判断元素唯一性:
* 1:判断新添加的元素与老元素的哈希值是否相同
* 2:如果哈希值相同,就继续判断equals方法
* 如果哈希值不同,就直接判断新元素不存在与集合中,添加新元素
*/
public class Demo05_HashSet {
public static void main(String[] args) {
Set set = new HashSet();
Person p = new Person("貂蝉",16);
Person p2 = new Person("大乔",18);
Person p3 = new Person("小乔",17);
Person p4 = new Person("孙尚香",19);
set.add(p);
set.add(p2);
set.add(p3);
set.add(p4);
// set.add(new Person("貂蝉",16));
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Person person = (Person)iterator.next();
System.out.print(person+" ");
}
// System.out.println(set);
}
}
3.TreeSet的相关知识点
import java.util.Comparator;
import java.util.TreeSet;
/*
* 使用匿名内部类的方式创建比较器
*/
public class Demo09_TreeSet {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new Comparator() {
//指定两个学生的比较规则
//先比较姓名,再比较年龄
@Override
public int compare(Object o1, Object o2) {
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int result = s1.getName().compareTo(s2.getName());
if(result==0) {
result = s1.getAge() - s2.getAge();
}
return result;
}
});
Student s = new Student("c张飞", 18);
Student s2 = new Student("a关羽", 19);
Student s3 = new Student("b刘备", 20);
ts.add(s);
ts.add(s2);
ts.add(s3);
System.out.println(ts);
}
}