使用的原因:
1.数组长度是固定的,但需要的长度不固定的时候 2.如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象
集合是接口,所以下面有实现类
List-- 具体类 ->ArrayList LinkedList
Collection----接口-->Set- 具体类 ->HashSet TreeSet
Collection接口存储一组不唯一、无序的对象(可以重复的对象,不会排序)
boolean add(Object o),int size(),boolean contains(Object o),boolean remove (Object o),clear(),isEmpty(),iterator(),toArray()是Collection接口的方法,所以在List和Set中是通用的。
List 接口存储一组不唯一、有序(插入顺序)的对象(可以重复的对象,因为有序,所以可以通过下标找对象)
ArrayList:实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高,删除、插入会影响后面全部的元素,所以删除和插入元素不建议使用此 集合
注意:1、ArrayList中的 get (int index)是获取集合中的下标对象,需要将对象转换成所需的对象,记得一定要转化类型。
2、除了可以使用for去循环遍历元素,也可以使用foreach去遍历,但是接收的是Object类型,记得一定要转化类型
LinkedList:采用链表存储方式。插入、删除元素时效率比较高,因为在上一个元素中有下一个元素的地址,空间不连续,插入、删除元素只影响邻近的两位元素,所以效率高
ArrayList和LinkedList的异同:
相同点:都是以List的父接口
不同点:使用的场景不同,ArrayList适合遍历元素,LinkedList适合添加、删除元素
Set 接口存储一组唯一、无序的对象(对象不重复,没有排序,因为Set中存入对象是存放对象的引用(地址))
Set接口在添加对象的时候,会先判断此对象是否已经存在了(采用Object类的equals()方法比较两个对象是否是相等,也就是去比较两个内存地址是否相等 )
注意:如果添加到Set中的是new String ,值是相同的的,但也是添加了一个,是因为String类重写了Object类中的equals()方法,是对字符串的对比,不是地址的对比,所以只能添加一个。(只有String类的对象比较特殊)
比如:
Set set=new HashSet();
String s1=new String ("java");
String s2=s1;
String s3=new String("java");
set.add(s1);
set.add(s2);
set.add(s3);
set.size(); 长度为1
Set接口不存在get()方法,因为它是无序的,可以使用:
1.增强型for
2.使用迭代器Iterator实现遍历:获取Iterator---使用Collection接口的iterator()方法,所有的集合都有iterator()方法
Iterator的方法:boolean hasNext();判断是否存在另一个可访问的元素
Object next();返回要访问的下一个元素
步骤:1.获得迭代器,通过集合的iterator()方法去获得,返回的类型是Iterator类型
2.通过Iterator类型对象的hasNext()方法去判断集合是否有值,然后通过Iterator类型对象的next()方法得到元素,记得要转换类型。
比如:
NewsList newsList=new NewsList("xiao","刘诗诗和吴厅隆出现机场",1);
NewsList newsList1=new NewsList("xiao","刘诗诗和吴厅隆出现机场",1);
Set set=new HashSet();
set.add(newsList);
set.add(newsList1);
Iterator iter=set.iterator();
while(iter.hasNext()){
NewsList news=(NewsList)iter.next();
System.out.println(news.getName());
}
Map--- 具体类-->HashMap TreeMap(Map不是Collection下的接口,它跟List Set没有关系)
Map 接口存储一组键值对象,提供Key到Value的映射(键Key是唯一的、无序的,值Value可以是重复的),一 一对应的就可以使用此接口
遍历Map的方法:
1:
Map map=new HashMap();
map.put("cn", "中国");
map.put("jp","日本");
map.put("usa", "美国");
//分别为获取Map中的键和值
//方法一:先获取到每个key,然后根据每个key拿到相应的value
Set keys=map.keySet();
for(Object obj:keys){
String key=(String)key;
String value=(String)map.get(key);
System.out.println(key+"-"+value);
}
2:
//方法二:使用Iterator迭代器拿到每个key
Iterator ite=keys.iterator();
while(ite.hasNext()){
String key=(String)ite.next();
String value=(String)map.get(key);
System.out.println(key+"-"+value);
}
3:
//(2)先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值
Set s=map.entrySet();//Map中所有键值对的集合
for(Object obj:s){
Map.Entry mm=(Map.Entry)obj;//Map中的每一个键值对(Map.Entry)
Object key=mm.getKey();//取出每个键值对中的键
Object value=mm.getValue();//取出每个键值对中的值
System.out.println(key+"-"+value);
}
算法类:Collections,提供了对集合进行排序。遍历等多种算法实现
实现一个类的对象之间的比较大小,该类在实现Comparable接口,重写compareTo()方法
集合中不可以存放基本数据类型,就算放了基本数据类型,Java虚拟机会将它装箱成Object类型
泛型:因为上述的集合没有规定类型,所以如果放入的类型不同,那么就会存在数据的混乱,所以才会有泛型的出现,去规定类型,保证类型转换的安全和稳定性
语法如下:
类1或者接口<类型参数> 对象= new 类1<类型实参>();