Java学习之路-集合与泛型

223 阅读7分钟

集合其实是一个非常重要的概念,嗯,非常重要,经常用,现在传点吗数据,不是用对象就是用集合,好吧其实集合本身就是对象,基本上传的是对象,整个数据集合的属性。

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集合的工具类