一、集合的概念
集合是一种工具,容器,可以存储数量不等的若干对象 。代替数组。
二、Collection集合体系
Collection是一个接口
对于集合的学习都从4个方法:
1、集合的特点
2、集合的常用方法
3、集合的实现类
4、集合的遍历
三、Collection集合
Collection集合是能够存储任意的对象。java.util包
常用方法:
boolean add(Object o); //将o添加到指定的集合中
boolean addAll(Collection c);将 集合c 中的所有元素全部添加到指定集合中
void clear();清空集合中的所有元素
boolean contains(Object o);判断o是否在指定集合中
boolean contains(Collection c);判断指定集合是否包含c集合。
boolean isEmpty();判断此集合是否为空
boolean remove(Object o);将元素o从集合中移除
int size();返回此集合的长度
Collection集合是List|Set集合的父接口,那么Collection集合中的方法在List/Set集合中一定存在。
Collection没有直接的实现类。
四、List集合
a) 特点:可以存储任意类型的元素。元素有序,有下标,元素可以重复。
b) 方法:
除了Collection 集合中的方法之外,添加的都是有下标的方法。
List集合中常见的方法:
void add(int index,Object o);在指定的位置添加元素o。
Object get(int index); 获取指定位置的元素
int indexOf(Object o);返回元素o在集合中第一次出现的下标,如果不存在则返回-1
Object remove(int index);移除指定位置的元素并元素的值返回。
c)List集合的实现类 ArrayList (数组实现)
d)List集合的遍历(重点):
逐一访问集合中所有的元素。
i.下标遍历
ii.forEach()遍历 JDK1.5之后的遍历方式
e)List接集合的其他实现类
i.ArrayList :JDK1.2的类
特点:数组实现 (空间连续) 查询快,增删慢。线程不安全,运行效率高。
ii.LinkedList:
特点:链表实现(可能不连续) 查询慢 增删快。
iii.Vector:
特点:数组实现 JDK1.0 线程是安全,运行效率低。
五、泛型集合
a)类型安全,一旦加上泛型之后,那么集合中只能存储一种类型的元素。
b)编译时自动检验,而不是运行时报错。
c)使用了泛型之后就不需要进行强转。
注意:一种类型的引用只可指向一种类型,不能出现多态。
泛型只能为引用类型。
六、泛型类和泛型接口
七、Collections 工具类**(static修饰的方法)**
java.util.Arrays.sort()---->Array
java.util.Arrays.copyOf();----> Collection
Collections.sort(list);
将给定的集合中的元素进行升序排列(按照自然规则排序)
Collections.reverse(list);将集合中的元素进行倒置。
Collections.shuffle(list);将集合中的元素进行随机排列。
八、Set集合
a) 特点:可以存储任意类型的元素;无序,不下标,元素(内容)不可重复。
b)方法:只有从Collection集合中继承到的方法。
c)实现类:HashSet
d)遍历:
i.forEach遍历 (set集合没有下标,所有不能使用下标遍历的方式)
e)如何保证Set集合中不插入相同内容的对象
i.HashSet
1.保证相同对象返回相同的哈希码值,内容不同的对象尽量返回不同的哈希码值。
覆盖hashCode()
2.覆盖equals方法
覆盖hashCode()
@Override
public int hashCode(){
return name.hashCode()+age;// int [-2147483648~2147483647]
//return 0; 所有对象返回的哈希码值都相同 那么以为都会调用equals()进行判断内容是否一致
//return age;//保证相同对象的哈希码值相同
}
//覆盖equals()
@Override
public boolean equals(Object o){
System.out.println("------------------------------------");
//自反性 比较两者地址是否相同
if(this == o)return true;
//非空性 判断o引用是否为null
if(o == null)return false;
//一致性 判断两个对象的实际类型是否一致
if(this.getClass() != o.getClass())return false;
//强转
Student s = (Student)o;
//判断 逐一判断对象中的内容相同
if(this.name.equals(s.name) && this.age == s.age && this.score == s.score)return true;
else return false;
}
f)Set集合的实现类
i.HashSet
ii.LinkedHashSet:保证被插入的元素顺序不变
iii.TreeSet (SortedSet 的实现类 Set的子接口)
自动的对插入到集合中的元素进行排序。
数字|字母会按照自然排序的规则进行排序。
自定义的对象需要实现Coparable接口,覆盖其中COmparTo()方法,制定排序规则。
package set;
import java.util.TreeSet;
public class TestTreeSet {
public static void main(String[] args) {
TreeSet<Worker> set = new TreeSet<Worker>();
set.add(new Worker("ligs",200.0));
set.add(new Worker("xingy",249.0));
set.add(new Worker("zhangw",249.0));
set.add(new Worker("weisc",199.0));
set.add(new Worker("weisc",199.0));
set.add(new Worker("gaoj",20000.0));
for (Worker w : set) {
System.out.println(w);
}
/*TreeSet<String> set = new TreeSet<String>();
set.add("DB");
set.add("B");
set.add("DE");
set.add("A");
set.add("E");
for (String s: set) {
System.out.print(s+"\t");
}
System.out.println();*/
}
}
class Worker implements Comparable<Worker>{
private String name;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Worker(String name, double salary) {
super();
this.name = name;
this.salary = salary;
}
public Worker() {
super();
}
@Override
public String toString() {
return "Worker [name=" + name + ", salary=" + salary + "]";
}
/*
* 排序规则
* 1、会按照工资进行排序
* 2、如果工资相同 则会按照名字排序
*/
@Override
public int compareTo(Worker o) {
if(this.salary > o.salary)return -1;
else if(this.salary < o.salary)return 1;
else {
if(this.name.compareTo(o.name)>0)return 1;
else if(this.name.compareTo(o.name)<0)return -1;
else return 0;
}
}
}
九、Map集合
Map是一个以键值对存储的接口。
a)特点:键值对 key-value
key:无序、无下标、元素不可重复
value:无序、无下标、元素可以重复
英汉词典:
hello (key) 你好(value)
hi(key) 你好(value)
How are you (key) 你好(value)
How do you do(key) 你好(value)
b)常用方法
i.boolean containsKey(Object key); //是否包含此key
ii.boolean containsValue(Object value);//是否包含此value
iii.Object get(Object key);//通过key找value
iv.Value put(Object key,Object value);//将此键值对插入到集合中
c)Map集合的实现类
i.HashMap:JDK1.2的类,线程不安全,效率高.可以使用null作为key/value。
ii.Hashtable:JDK1.0的类,线程安全,效率低;不可以使用null作key/value。
注意:使用null作为key/value时编译通过,运行报错。
iii.Properties:Hashtable的子类。key=String;value=String;
通常用于配置文件的读入。
iv. TreeMap(SortedMap(Map的子接口) 的实现类)
会根据key对集合中的元素进行自动排序。
d)遍历方式
i. 键遍历
将所有的key看作一个Set集合,通过keySet()返回Set集合。
ii.值遍历
将所有值看作一个Collection集合,通过values()方法返回Collection集合。
iii.键值对遍历