java学习笔记(基础篇)—集合
一、集合框架的组成,在java.util包中。
1)接口:定义需要实现的抽象方法。
2)实现类:将接口中的方法实现,如ArrayList,Hashtable等
3)算法:存放和操作数据的算法。如哈希算法,红黑树算法…
Collection(顶层接口)
-List(接口)
-ArrayList
-Vector
-LinkedList
-Set(接口)
-HashSet
-SortSet(接口)
-TreeSet
-Map(接口)
-HashMap
-TreeMap
-Treetable
...
二、集合的层次结构
a):保存单值
Collection:定义保存单值的规范
——Set:定义保存不可重复无序单值的规范
———HashSet:哈希算法保存数据,检索效率最高的
———SortedSet:定义在Set基础上进行排序的规范
———TreeSet:实现排序规则
——List:定义保存可重复有序单值的规范
——LinkedList:使用链表实现List接口
——Vector:使用数组实现List接口,线程安全的
——ArrayList:使用数组实现List接口,线程不安全
b)保存键值对(key—value)
Map:定义保存键值对的规范(key不能重复,value可重复)
————HashMap:是线程不安全,效率高,HashMap允许null key和null value,
————HashTable:是线程安全,Hashtable不允许null key和null value,
——SortedMap:定义在Map的基础上进行排序的规范(根据key排序)
————TreeMap:对map进行排序
c)Map类中的方法:HashMap,Hashtable
put(Object key,Object value):添加数据到map集合中
Set keySet():将map中所有的key取出来放在set集合中
Object get(Object key):从map集合中获取数据。
Set entrySet():将map中的key和对应的value重新创建成新的对象(Map.Entry)放在set集合中。
Map.Entry:getKey()
Map.Entry:getValue()
Set values():将map中所有的value取出来放在collection集合中
interface Map{
static interface Entry{
}
}
三、增强for循环
a)之前的for循环
for(初始化变量;循环条件;变量的控制){
循环体
}
b)增强for循环:方便遍历集合和数组
for(type element : array){
循环体
}
type:数组或集合中数据的数据类型
element:临时变量
array:数组或集合的引用
注意:增强for遍历的集合必须是实现Iterable接口。不能明确指出数据的下标(位置)
四、set添加元素的时候,如何判断两个对象是否相等?
1)先比较hashCode的值,如果hashCode的值不相等,
不会比较equals方法,直接返回两个对象不相等。
2)先比较hashCode的值,如果hashCode的值相等,
再比较equals方法,如果equals比较两个对象不相等,
返回这两个对象不相等。
五、如何判断元素应该添加在set集合的那个地方?(hashCode的作用)
1)使用哈希算法可以提高检索的效率。
哈希算法底层有一张哈希表。哈希表相对于数组。
哈希表的长度根据算法自己的计算出来的。
2)底层使用哈希算法决定对象所存放的位置
所放的位置=通过对象的hashCode%哈希表的长度
一个对象默认hashCode值是由对象的地址根据一定算法计算而得出来的。set中添加元素判断对象是否相同需要重写hashCode方法和equals方法。
如何重写hashCode方法:在java.lang.Object中
重写hashCode方法建议:每个不同的对象放在不同的位置将所有会影响判断对象是否相同的属性的hashCode值相加。
public int hashCode(){
//return 1;
return 所有的属性的hashCode值相加;
}
六、TreeSet,TreeMap排序:
1)自然排序:将需要排序的类实现java.lang.Comparable
interface java.util.Comparator{
public int compare(Object o1,Object o2){
..排序规则
}
}
public class Student implements Comparable{
public int compareTo(Object obj){
..排序规则
}
}
2)覆盖排序:创建TreeSet,TreeMap对象指定排序规则。 当该类无法指定自然排序,就只能使用覆盖排序。如final String类不能用自然排序,只能用覆盖排序。
**覆盖排序的优先级高于默认排序
Set set = new TreeSet();
set.add(“b”);
set.add(“a”);
set.add(“d”);
set.add(“c”);
***该代码有没有问题?如果没有问题输出什么内容?