集合其实是一个非常重要的概念,嗯,非常重要,经常用,现在传点吗数据,不是用对象就是用集合,好吧其实集合本身就是对象,基本上传的是对象,整个数据集合的属性。
1、集合
集合对象是内存中的一个容器对象,用来方便的存贮批量的数据,集合中的数据在没有持久化,程序运行结束后,数据将消失。在java语言中,设计的集合主要为3大类(要掌握)
Set集合:实现Set接口的集合类称为Set集合;
List集合:实现List接口的集合类称为List集合;
Map集合:实现Map接口的集合类称为Map集合
java对集合设计的相关接口与类放在:java.util包中 (在我们使用集合时,需要导入对应的集合类或者接口)
集合中只能放引用类型数据,不能放基本类型的数据(如果要放,请使用基本类型数据的包装类型)
2、Set集合
Set集合特性:不包含重复元素,通过调用元素的equals方法实现判断两个元素是不是同一个元素;
Set extends Collection extends Iterable
Collection:是Set,List,Queue三个集合共同的接口
Iterable接口定义的是迭代器行为规范
Set接口的实现类:HashSet,TreeSet
HashSet : 基于hash算法决定元素在集合中的存放位置,HashSet存、取效率非常高;
熟练Set集合的基本操作API(添加、删除、获取元素、集合大小,清空集合等)
**获取集合元素:**转数据(toArray(),再用数据的方式实现对元素的访问) | 迭代器
迭代器:一个递归获取集合元素的方式 ,需要集合实现Iterable接口(此接口定义了迭代访问集合元素的方法)
迭代器是一个指针对象,默认指向集合第一个元素前,通过调用hashNext方法可以移动迭代器
Iterable
Iterator<T> iterator() :实现此接口的方法,就能得到的一个迭代器对象(Iterator接口的对象)
Iterator接口(迭代器接口)
boolean hasNext() 如果仍有元素可以迭代,则返回 true。
E next() 返回迭代的下一个元素。
void remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
对Set集合,如果放到集合里的对象某一个属性一样或者某2个属性一样或者...属性一样,视为同一个对象,应怎么处理? ,默认是调用对象的equals方法比较,此时,已不能满足我们的业务需要;
解决方法: 根据新的业务重写比较规则 (还要重写hashcode) --- 不需要手写,用eclispe自动生成及可;
迭代器对象是一个实现什么接口的对象(Iterator接口)
TreeSet:Set接口的第2个实现类,TreeSet相对于HashSet,多了一个排序的功能;
排序方法:使用元素的自然顺序对元素进行排序;
什么是元素的自然顺序? :此元素实现Comparable接口;(当将元素放到TreeSet集合中,TreeSet集合就安Comparable接口定义的比较规则来比较元素)
public interface Comparable{
int compareTo(T o)
}
返回值为整型: 0 :表示两个元素相等 , 大于0:元素大于,小于0:表示小于;
如果放到TreeSet集合中的元素没有实现自然排序,则意味会出异常 在JDK中,8种基本数据类型的包装类型和字符串都实现了此接口(Comparable接口) ---- 都提供一个实现比较的compareTo方法
如果在集合中放其它类型的元素,必须手动实现Comparable接口(手动实现接口中定义的compareTo比较方法)
3、内部比较器与外部比较器
在一个类中实现了Comparable接口,称为在类的内部实现比较规则,称为内部比较器; (实现Comparable接口的类定义的是一个内部比较器)
外部比较器: 单独写一个类,实现比较,需要实现一个新的接口:java.util.Comparator; 外部比较器一般在集合的工具类:Collections中使用;
Collections主要服务于Set集合与List集合,Collections工具类中的方法一般为静态方法;
内部比较器与外部比较器有什么不同?
实现Comparable接口定义的是内部比较器,实现Comparator接口定义的是外部比较器
4、List集合
特性 :实现List接口的集合称为List集合,相对Set集合,List集合中的元素是有序的(每一个元素都有一个下标,从0开始),List集合可以放重复数据
List集合的主要实现:ArrayList,Vector,LinkedList; (三个实现类的API基本一样)
public interface List extends Collection extends Iterable{
}
ArrayList与Vector的主要区别:
两者都是List集合,ArrayList是线程非案例的,Vector是线程安全的;
ArrayList与LinkedList主要区别:
ArrayList的内部使用数组来存放数据,LinkedList使用链表来存放数据,对添加、获取、数据来说,ArrayList效率高一些,对删除、修改数据来说,LinkedList效率高;
ArrayList类: 又称为动态数组; ArrayList内部是使用数组来存放数据的;当容器添加满,会自动扩容;
transient Object[] elementData; ArrayList使用数组来存放数据的;
int newCapacity = oldCapacity + (oldCapacity >> 1); 每次扩容是原大小的1.5倍;
5、Map集合
Set集合与List集合都属于单例值的集合,Map集合是双列值的集合(集合中每一个元素是一个key-value对象),根据key可以取出对应键的值;
key -- value 称为Entry对象
Map集合的主要实现:HashMap | TreeMap | Hashtable | Properties(放到IO流章节)
HashMap :集合中的key可以为null,值也可以为null(只能有一个key为null);HashMap不是线程安全的;
Map集合与List与Set集合的主要区别:
Map集合是双列值,List与Set集合是单列值;
如何通过Map.Entry遍历Map集合;
Map<String,String> map = HashMap<String,String>();
for(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() +" - " + entry.getValue());
}
HashMap与TreeMap主要区别:
TreeMap相对HashMap,多了一个排序的功能
HashMap与Hashtable主要区别:
HashMap:集合中的key可以为null,值也可以为null(只能有一个key为null);HashMap不是线程安全的;
Hashtable:Hashtable中的键和值都不能为空的,Hashtable就线程安全的;
Map集合取数据:
获取单个元素:根据key可以得到值;
Map<String,String> map =new HashMap<String,String>();
map.get(key);
获取所有的键;
Set<String> keys = map.keySet();
获取所有的值:
Collection<String> values = map.values();
取Map集合所有数据:先得到所有的key,再根据key获取值;
Set<String> keys = map.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key =it.next();
String val = map.get(key);
System.out.println(key +":" + val);
}
Map集合中的元素为Map.Entry对象,可以直接遍历Map.Entry得到元素;
for(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() +" - " + entry.getValue());
}
6、泛型(Generic Type)
泛型:一个待确定的类型(类型占位符),在设计时用泛型,在使用时,需要给定一个确定的类型(如果不明确指定,默认类型为Object)
集合中用到泛型:泛型集合;
普通的类中用到泛型:泛型类;
方法中用到泛型:泛型方法;
接口中用到泛型:泛型接口
泛型的优点:在使用时,会用语法检查,避免添加错误类型的数据;
7、外部比较器
比较器:在集合排序时用到;
Set集合的TreeSet实现类中用到内部比较器(要求放到TreeSet集合中的元素实现Comparable接口)
内部比较器:实现Comparable接口,在类的内部提供一个compareTo比较方法,称为内部比较器;
外部比较器:实现Comparator接口,可以根据需要任意定义一个比较器称为外部比较器,外部比较器主要在集合的工具类:Collections中使用
例:List集合没有排序功能 ,如果要对List集合中的元素进行排序,只需要用集合工具类Collections并提供一个外部比较器即可;
Collection 与Collections区别
Collection 是List集合与Set集合的父接口;Collections集合的工具类