容器
容器的目的就是用来存储数据,数组也是一个容器。
Collection
collection称为容器或者集合
collection下面:
Set:无顺序,不可重复(equals–>false)
Set set = new HashSet();
set.add("2"); set.add("1"); set.add("1");
System.out.println(set);
上面代码运行只输出一个1且1和2的顺序随机
List:有顺序,可重复(equals–>true)
对于List分为LinkedList和ArrayList:
-
LinkedList使用链表的方式进行过存储(不连续成块的内存)
-
ArrayList使用数组的形式进行存储(连续的内存)
使用Collection时往往是父类引用指向子类对象(上转型)
Collection col = new ArrayList();
Collection c=new HashSet();
Collection co=new LinkedList();
这种容器使用方式具有安全性,所new的对象只能使用Collection的抽象方法的实现
容器类对象在调用remove和contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和hashCode方法;
对于自定义的类型,需要重写equals和hashCode以实现自定义的对象相等规则。
注意:相等的对象应该具有相等的hashCode
数据结构选择:
- Array读快改慢
- Linked改快读慢
- Hash 两者之间(Hashtable和Vector内容锁定、效率低、过时啦)
Iterator
- 所有实现了Collection接口的容器类都有一个iterator方法以返回一个实现了Iterator接口的对象。
- Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
- Iterator接口定义了如下方法:
– boolean hasNext();-------判断游标是否有元素
– Object next();---------------返回右标元素并将右标移到下一个位置
– void remove();--------------删除游标的左端的元素执行完next之后该操作只进行一次
Iterator对象的remove()方法是迭代过程中删除元素的唯一的安全方法
使用Iterator遍历:
Iterator<Student> it = list.iterator();
while (it.hasNext()) {
}
List
常用的两个类ArrayList和LinkedList
ArrayList使用连续内存存储;
LinkedList使用链表形式存储;
Map
泛型
Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
使用泛型目的
使用泛型一方面使代码更加简洁高效,另一方面避免了下转型强转的安全问题(不使用泛型的话,读取时就需要对集合中的数据进行强转)
使用泛型在编写集合时声明了类型,增强代码可读性和稳定性。
关于for与泛型
使用泛型后,联系java的增强for循环,可以使用for(:collection)来遍历读取集合中数据,更加方便,但注意:只能读取不能改写(这是for增强语句的特点,局限性强)
泛型类与泛型方法
泛型类形如class Object的声明
看个例子:
class ObjectExample<T> {
private T a;
public T getA() {
return a;
}
public void setA(T a) {
this.obj = a;
}
}
public class Test{
public static void main(String[] args){
ObjectExanple<Integer> a = new ObjectExanple<Integer>();
a.setA(23);
System.out.println(a.getA());
这样我们可以声明对象,可以使用<>规定这个对象的类型,很方便。
当我们使用类时可能仅仅需要一个用泛型的方法,不需要整个类是泛型类
public T show(T t){
System.out.println(t);
}
看着就方便