集合Collection
由于数组的局限性,引入了集合,例如数组的定长,保存的元素类型一致
集合框架
Collection和Collections的区别
Collection是集合的接口,其内元素无序,不唯一
Collections是包含了集合操作的静态方法的工具类
List接口
有序,不唯一
ArrayList:
特点:存储的对象的地址连续,长度可变,查询效率高,添加和删除的效率较低
LinkedList
特点:链表方式存储,每一个存储的对象都有下一个存储对象的地址信息,查询效率较低,但是删除和插入的效率高
通用方法:
add(Object o) 在列表末尾顺序添加元素
add(int index,Object o) 在索引位置添加元素,插入
size() 返回列表中元素的个数
get(int index) 返回索引位置的元素,但是返回的元素类型为Object
contains(Object o) 判断列表中是否存在指定元素,返回类型为boolean
remove(Object o) 从列表中删除元素
remove(int index) 根据索引删除对应的元素
LinkedList特有方法
addFirst(Object o) 向列表的头部插入元素
addLast(Object o) 向列表的尾部插入元素
getFirst() 返回列表第一个元素
getLast() 返回列表最后一个元素
removeFirst() 删除并返回列表的第一个元素
removeLast() 删除并返回列表的最后一个元素
Set接口
无序,唯一,可用于一些数据的去重操作
Map接口
HashMap 和 TreeMap
无序,以键值对的形式存储信息
查询效率相对最高
常用方法:
put(Key,Value) 添加一个键值对
get(Object Key) 根据键来返回值的内容
remove(Object Key) 删除指定的键映射的键值对
size() 返回元素个数
keySet() 返回键的集合
values() 返回值的集合
containsKey(Object Key) 判断是否存在对应的键映射的键值对,返回boolean类型
迭代器
由于集合没有提供相应的遍历方法,那么就需要迭代器来实现遍历
Collection接口中的iterator()方法返回一个Iterator
next()方法和hasNext()方法ArrayList arr = new ArrayList(); Iterator it = arr.iterator(); //创建迭代器 while(it.hasNext()){ //判断it是否存在下一个元素 ArryList x = it.next(); //返回当前元素 System.out.println(x); }
泛型
在使用集合是,get()方法返回的为Object类型对象,之后需要进行强制类型转换才能使用,以及迭代器中也需要强制类型转换,这样既不方便,数据也不安全。
个人理解泛型类似于规范,在一个集合声明时,使用泛型规范其中元素的类型,使得其存储的元素类型是自己规定的类型,以及调用方法是返回的类型都是自己规定的类型HashMap <String,String> MyMap = new HashMap<String,String>(); //规定了键值对类型都为String类型 MyMap.put("1","柚子"); //存入元素是,只能放入String类型 MyMap.put("2","橘子"); MyMap.put("3","哈密瓜"); MyMap.put("4","火龙果"); System.out.println("1对应的是"+MyMap.get("1"));//免去了强制类型转换 //======================================================= //迭代器中 Iterator<String>it = MyMap.keySet().iterator(); //创建迭代器 while(it.hasNext()){ String x = it.next(); //原返回类型为Object 但是加了泛型返回值为String,免去了强制类型转换 System.out.println(x);//打印所有键 }
泛型类
//定义一个泛型类
public class Pair<T> //T表示其中属性的类型,同时也是参数
{
private T first;
private T second;
public T getFirst() { return first; }
public T getSecond() { return second; }
public void setFirst(T newValue) { first = newValue; }
public void setSecond(T newValue) { second = newValue; }
}
比较器Comparable
java中大部分数据类型都实现了Comparable接口,所以很多数据类型都是可以比较大小的
class ArrayAlg {
/**
*实现Comparable接口,返回值类型为Pair(上面定义的泛型类)
*参数列表为T类型的数组 T待定类型
**/
public static <T extends Comparable> Pair<T> minmax(T[ ] a) {
if (a == null || a.length == 0) {
return null;
}
T min = a[0];T max = a[0];
for (int i = 1; i < a.length; i++) {
if (min.compareTo(a[i]) > 0) {min = a[i];}
if (max.compareTo(a[i]) < 0) { max = a[i];}
}
return new Pair<T>(min, max);
}
}