集合框架相关知识点(二)

来源:互联网 发布:java面向对象代码 编辑:程序博客网 时间:2024/06/10 00:01

(一)知识点梳理

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);
}
}


0 0
原创粉丝点击