集合的简单介绍
如图 常用集合已使用红框标注
注 : 从JDK1.5开始Collection已不在是超级接口了,变成了java.lang.Iterable这个接口主要是用来增强for循环:"foreach"格式:
for(数据类型 变量名称 : 数组或者集合){
sout(对数据的操作);
}
实际用法:
@Test
public void test3() {
int[] arr = { 12, 2, 3, 5 };
/*
* 原理:int t相当于每次去赋值数组或集合内的每一个索引值
* 第一次:i=12,第二次:i=2;也就是说你在增强for循环内的所有操作都不会改变数组本身的值,可以通过下面例子得知
* for(int t : arr){System.out.println(t+1);} System.out.println(arr[0]);
* 好处:方便遍历
* 弊端:没有索引,不能操作容器内元素
*/
for (int t : arr) {
System.out.println(t);
}
}
1.继承Collection的接口(List,Set),都有其一些基本其一些基本方法:
size(); isEmpty(); contains(Object o); iterator(); toArray(); add(E e); remove(Object o); clear(); ....
2.List接口:元素有序可重复
2.1 ArrayList
>底层数据结构数组
>查询快
>增删慢
>线程不安全
2.2 LinkedList
>底层数据结构链表
>查询慢
>增删块
>实现压栈(push(Object o)) 弹栈(pop())
>线程不安全
2.3 Vector
>底层数据结构数组
>查询快
>增删慢
>线程安全
>很少用,知道就好
3.Set接口:
>元素无序不可重复
>线程不安全可以使用来解决 Collections.synchronizedSet(Set<E>);
3.1 HashSet
>底层数据结构数组
>无序
>元素可以为null
>存储元素前会调用hashCode()两个对象的hashCode值
>>如果hashCode值不同则直接存储,也就是说两个值不一样
>>如果hashCode值相同则会使用equals()方法进行比较,如果为true则视为同一对象,不保存,反之保存
>>hashCode值其实就是地址值,int a=12,b=12,在内存中a的地址值和b的地址值是相同的
3.2 TreeSet
>底层数据结构红黑树(范围查询较快)
>有序也可以使用Comparable<Object o>见 "_3.2.1&_3.2.2",也可以使用Comparator<Object o>接口排序 见"_3.2.3&_3.2.4",两种参数两种排序形式
4. Map
>键值对存储
>Map<K,V>:K键,V值
>有序
>不能迭代,Map从图中可以看出是一个单独的接口,没有继承Iterable接口,但是可以通过entrySet()方法来返回映射关系的 Set 视图见"_4"
>一个映射不能包含重复的键;每个键最多只能映射到一个值
>附上API一句话:
注:将可变对象用作映射键时必须格外小心。当对象是映射中某个键时,
如果以影响 equals 比较的方式更改了对象的值,
则映射的行为将是不确定的。此项禁止的一种特殊情况是不允许某个映射将自身作为一个键包含。
虽然允许某个映射将自身作为值包含,但请格外小心:在这样的映射上 equals 和 hashCode 方法的定义将不再是明确的。
4.1 HashMap
>基于哈希表的 Map 接口的实现
>不保正迭代顺序,并不能保证迭代顺序恒久不变
>允许使用键值为null
>线程不安全
4.2 Hashtable
>线程安全,其他通HashMap
4.3 TreeMap
>基于红黑树实现
>该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序
>线程不安全
集合使用场景:
没要求直接使用ArrayList
增删要求使用LinkedList
需要排序使用TreeSet
去除重复元素使用HashSet
键值对使用HashMap
具体使用那个容器需要根据场景来定
_3.2.1
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
int num = this.age - o.age;
return num == 0 ? this.name.compareTo(o.name) : num;
}
}
_3.2.2
@Test
public void test1() {
Set<Person> s = new TreeSet<Person>();
s.add(new Person("张三", 12));
s.add(new Person("李四", 5));
s.add(new Person("王五", 77));
s.add(new Person("赵六", 2));
for (Person person : s) {
System.out.println(person);
}
}
_3.2.3
import java.util.Comparator;
public class ComparatorDemo implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);//compareTo()是String的方法
}
}
_3.2.4
@Test
public void test2() {
Set<String> s = new TreeSet<String>(new ComparatorDemo());
s.add("张三");
s.add("王五");
s.add("李四");
for (String string : s) {
System.out.println(string);
}
}
_4
@Test
public void test3() {
TreeMap<Integer, Integer> t = new TreeMap<>();
t.put(1, 1);
t.put(2, 21);
t.put(3, 133);
t.put(4, 55);
Set<Entry<Integer, Integer>> entrySet = t.entrySet();//映射关系的 Set 视图
for (Entry<Integer, Integer> entry : entrySet) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}