一.集合框架的分类
1.为什么会出现集合框架,他与数组的区别(3点)
2.在util包下,使用的时候需要导包(建议一直导到类名下)。
3.结构
集合框架 |
|
A.Collection与Map的比较
B.List和Set及其具体实现类的特点、底层的数据结构、、何时使用、区别与联系
C.HashMap和TreeMap的区别。
5.Collection的功能以及其实现类的功能
A.添加 | boolean add(E e) //添加指定的元素e,这里是加到集合的末尾。 boolean addAll(Collection <? extends E> c) 项目3 |
B.删除 |
void clear()
boolean remove(object o) //这里返回的是Boolean类型的,与后面的注意区分
boolean removeAll(Collection<? > c)
|
C.获取 | iterator foreach |
D.判断 | boolean isEmpty() boolean conatains(object o) boolean containsAll(collection<?> c) //判断是否存在c集合里的元素 |
E.长度 | int size() //返回元素个数 |
A.添加 |
void add(int index,E element)
boolean addAll(int index,Collection<? extends E> c)
|
B.删除 | E romove (int index) //这里返回的是集合中被删除的元素 |
C.获取 | int indexOf(object o) //根据元素值返回下标,第一次出现该元素的 int lastIndexOf(objcect o) E get(int index) List subList(int fromIndex, int toIndex) //返回一个包含fromIndex的不包含toIndex的 |
E.长度
F.修改 | E set(int index E element) |
这里的功能是Collection和ArrayList功能的合集。
8.LinkedList的功能(只讲与List的不同)
A.添加 | void addFirst(E e) //将指定的元素插入列表的开头。当然也有AddLast()但是这样没有意义 |
B.删除 | E removeFirst() E removeLast() |
C.获取 | E getFirst() E getLast() |
1.HashSet的功能(只讲与Collection的不同)
事实上没有,由于HashSet是没有下标的,他的底层是HashMap因此,他没有根据下标获取某个值的方法!
HashSet是通过哈希值来去报唯一性的(比较的逻辑记得背一下),它只能保证字符,数字,字符串的唯一性。如果想保证对象的唯一性,就必须重写HsanCode()和equals()。(可以直接在source进行快捷设置)
2.TreeSet的功能(只讲与Collection的不同)
A.添加
B.删除 | E pushFirst() //获取并移除第一个元素 E pushLast() //获取并移除最后一个元素 |
C.获取 |
E first()
E last()
E lower() //小于给定元素的最大值,没有返回null
E higher() //大于给定元素的最小值
SortedSet<E> headSet(E toElement) //返回小于给定元素的TreeSet的子集合
SortedSet<E> trailSet(E fromElement) //返回大于给定元素的TreeSet的子集合
SortedSet<E> subSet(E fromElement, E toElement) //返回包含fromenElement不包含toElement的TreeSet的子集合
|
TreeSet是基于TreeMap的集合,通过元素的自然排序或者Comparator来实现!也就是说,如果想实现对象排序,就必须重写comparable接口的compareTo方法。
或者通过比较器comparetor比较,comparetor比较是一种接口,要实现重写他的compare方法,推荐使用匿名内部类的方法重写,可以节约内存。
public class Student implements Comparable<Student> {
//成员变量
private String name;
private int age;
//构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
//setget方法
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;
}
//重写compareTo方法
@Override
public int compareTo(Student o) {
//如果返回一个正数,默认每次传入的都是大的
//如果返回0每次都默认两个数相同
//如果返回一个负值,则认为每次都比传入的值小
//这标识让年龄相减,根据正负进行排
//事实上这种比较是有问题的,如果两个学生的年龄相同但姓名不同,能认为是同一个人吗?显然这里是需要再进行判断的
int num = this.age - o.age;
//基本数据类型是可以直接进行compareTo(),因为他们已经实现了compareTo()
int num2 = num==0?this.name.compareTo(o.name):num;
return num2;
}
}
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//声明一个TreeSet
TreeSet<Integer> ts = new TreeSet<Integer>();
TreeSet<Student> ts1 = new TreeSet<Student>();
//在没有设置排序方案时,这个代码是会报类型转换错误的
//给TreeSet赋值
//Student s1 = new Student("杨华彬",23);
// ts.add(new Student("杨华彬",23));
// ts.add(new Student("刘德华",50));
// ts.add(new Student("汪园",20));
// ts.add(new Student("令狐冲",29));
// ts.add(new Student("郭靖",11));
// ts.add(new Student("杨华彬",23));
//ts.add(s1);
//遍历集合
// for (Student student : ts) {
// System.out.println(student.getName()+"*********"+student.getAge());
// }
ts.add(3);
ts.add(4);
//用foreach遍历集合
for (Integer integer : ts) {
System.out.println(integer);
}
//用iterator遍历集合
Iterator<Integer> it = ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
/**
* 使用继承以后的添加并遍历对象
*/
//添加对象
ts1.add(new Student("杨彬",23));
ts1.add(new Student("刘德华",50));
ts1.add(new Student("汪",20));
ts1.add(new Student("令狐冲",29));
ts1.add(new Student("郭靖",11));
ts1.add(new Student("杨彬",23));
ts1.add(new Student("老刘",23));
//遍历集合
for (Student student : ts1) {
System.out.println(student.getName()+"*********"+student.getAge());
}
/**
* 使用比较器comparetor进行比较
*/
//匿名内部类,重写compare方法,如果比较只用一次的话,推荐用匿名内部类来写,这样可以节省很多内存
TreeSet<Student> ts4 = new TreeSet<Student>(new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
int num = o1.getAge() - o2.getAge();
int num2 = num==0?o1.getName().compareTo(o2.getName()):num;
return num2;
}
});
ts4.add(new Student("杨彬",23));
ts4.add(new Student("刘德华",50));
ts4.add(new Student("汪",20));
ts4.add(new Student("令狐冲",29));
ts4.add(new Student("郭靖",11));
ts4.add(new Student("杨彬",23));
ts4.add(new Student("老刘",23));
for (Student student : ts1) {
System.out.println(student.getName()+"*********"+student.getAge());
}
}
}
三.Map
存储的是键值对,通过Hash和Tree来保证他的键的唯一性,故只有HashMap和TreeMap。
记住啦:Map是不能使用Iterator的方法进行遍历的。
1.主要方法
A.添加 | V put(K key,V value) void putAll(Map<? extends K,? extends V> m) |
B.删除 | V remove(Object key) |
C.获取 | Set<k>t keySet() Collection<v> values() |
D.判断 | Boolean containsKey(object key) boolean containsValue(object value) |
E.长度 | int size() |
3.我们不记那么多,用到了就来查API文档吧,只要记住Map的方法即可!
这里的Student类还是上面的Student类!
package Practise;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
public class Demo {
public static void main(String[] args) {
// 实例化一个TreeMap
TreeMap<Student, String> tm = new TreeMap<Student, String>();
// 进行赋值
tm.put(new Student("杨彬", 23), "1");
tm.put(new Student("刘德华", 50), "2");
tm.put(new Student("汪", 20), "3");
tm.put(new Student("令狐冲", 29), "4");
tm.put(new Student("郭靖", 11), "5");
tm.put(new Student("杨彬", 23), "6");
tm.put(new Student("老刘", 23), "7");
// 遍历
// 这里不会报错,因为我已经在Student类中重写了compareTo方法
Set<Student> set = tm.keySet();
for (Student student : set) {
System.out.print("这里的键是:" + student.getName() + student.getAge());
System.out.println("这里的值是:" + tm.get(student));
}
/**
* 这里我将运用匿名内部类的comparetor的方法进行取值
*/
TreeMap<Student, Integer> tm1 = new TreeMap<Student, Integer>(
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num = o1.getAge() - o2.getAge();
int num1 = num == 0 ? o1.getName().compareTo(
o2.getName()) : num;
return num1;
}
});
// 赋值
tm1.put(new Student("杨彬", 23), 1);
tm1.put(new Student("刘德华", 50), 2);
tm1.put(new Student("汪", 20), 3);
tm1.put(new Student("令狐冲", 29), 4);
tm1.put(new Student("郭靖", 11), 5);
tm1.put(new Student("杨彬", 23), 6);
tm1.put(new Student("老刘", 23), 7);
// 取得键值的集合
Set<Student> ss = tm1.keySet();
for (Student student : ss) {
System.out.println("键值是:" + student.getAge() + student.getName());
System.out.println("值是;:" + tm1.get(student));
}
}// main方法的结尾
}