Java数组:
int a[]=new a[20];
1.定义:一旦创建,其长度不可变;具体的存放个数是未知的。
2.作用:Java数组可以保存一定数量的数据。数组是一组相同数据类型的集合。
Java集合
1.定义:一系列存储数据的接口和类,这些类位于Java.util包中。
2.作用:可以解决复杂数据的存储问题,任何一个集合类都可以存储不同类型的数据并且长度可以动态改变。
3.层次图:
Java集合只要由Collection、Map两个接口组成,下面又有多个子接口组成。集合类的使用都直接或间接地实现了Collection、Map接口或其子接口。
这里简单的提供下Collection几口的常用方法(父类发发有限,子类方法更丰富),开发过程中一般建议使用子类接口。
返回类型 | 方法名称 | 描述 |
boolean | add(Object o) | 在结合末尾添加元素 |
int | size() | 返回集合列表元素个数 |
Object | get(int index) | 返回指定索引位置的元素,索引从0开始 |
boolean | removeAll(Collection col) | 删除集合中的所有元素 |
Object | remove(int idex) | 从集合中删除指定索引位置的元素 |
boolean | contains(Object o) | 判断集合中是否存在指定的元素 |
boolean | remove(Object o) | 从集合中删除元素 |
void | clear() | 清除结合中的所有元素 |
Iteratror | iterator() | 为Iterator接口实例化 |
定义:元素无序、不可重复
1.Hashset
特点:不允许存放重复元素。存储元素的方式是散列存储,即存储是无序的。
这里补充下Iterator(集合迭代器:《接口》):迭代集合的迭代器。主要就2个方法:返回boolean类型的hasNext()方法,解释——判断集合中是否有数据实例。另一个方法时返回object类型的next()方法,解释——通过迭代集合得到集合中的数据实例。
Set set=new HashSet();
while(set.iterator().hasNext()){
set.iterator().next();
}
2.LinkedHashSet
特点:使用链表维护了集合元素中元素的顺序。遍历时是按照先进先出的顺序进行遍历;插入性能略低于Hashset,但是在迭代访问中具有很好的性能。
3.TreeSet
特点:treeSet中添加的元素必须是同一类型(可以看成一个包装类)(详看API);
定义:元素有序,可重复的集合
1.ArrayList
用法:类似数组,但其容量可以按需要动态调整,所以被称为动态数组。当容量需要增长时,默认增长为原来的一半。线程是异步的,性能较低。
2.linkedList
用法:他被称为链表操作类,同时实现了List和Queue接口,存放元素按照先进先出的方式排序。
简单的说下链表:链表就好比链子的每一个链环组成一根铁链。每个链环就是一条数据。链子上的链环是一个接一个,那么链表的数据也是如此。
3.Vector
用法:等同ArrayList,区别在于Vector是线程同步的,当容量需要增长时,默认增长的是原来的一倍。线程同步,性能较低。
4.Stack:继承了Vector且进行了扩展,存储数据的方式是先进后出。(详看API)
经验:涉及到堆栈、队列等操作应考虑Vector,对于快速删除、插入元素的场合应该使用LinkedList,快速随机访问,应该使用ArrayList。
Collection、Set、List接口均属于单值操作,即每次只操作一个对象。而Map的特点在于:他可以单次操作一个对象。其中每个元素使用键值对(key-value)的形式存储于集合中。使用的时候必须同时设置key和value的类型。
定义:public interface Map
1.HashMap
特点:键值对存储数据,存储的元素时无序的。存储的数据中不能出现重复的键,可以出现空值空键。
读取方式通过Itertor集合迭代器读取数据。(你可以迭代键,也可以迭代值)。
2.Hashtable
特点:键值对存储数据,存储元素无序。存储元素不允许重复且不允许空键空值。
NO | hashMap |
hashtable |
1 | 允许空键空值 | 不允许 |
2 | 线程异步。效率高 | 线程同步。效率低 |
3 | 继承自AbstractMap | 继承自Dictionary |
1.概述:约束数据类型,使用泛型可以提高数据安全性。
2.定义:
泛型类:
@Repository("menuDao")
public class MenuDaoImpl extends BaseDaoImpl implements MenuDaoI {
}
泛型集合:
List l=new ArrayList();
List pl=new ArrayList();
3.应用:
@Test
public void TestCol(){
Set set=new HashSet();
while(set.iterator().hasNext()){
set.iterator().next();
}
List l=new ArrayList();
List pl=new ArrayList();
Person p1=new Person();
Person p2=new Person();
Person p3=new Person();
Person p4=new Person();
Person p5=new Person();
pl.add(p1);
pl.add(p2);
pl.add(p3);
pl.add(p4);
pl.add(p5);
//foreach读取
for (Person person : pl) {
System.out.println(person.getAge());
}
Map pm=new HashMap();
p1=new Person("1",1);
p2=new Person("2",2);
p3=new Person("3",3);
p4=new Person("4",4);
p5=new Person("5",5);
pm.put(p1.getName(), p1);
pm.put(p2.getName(), p2);
pm.put(p3.getName(), p3);
pm.put(p4.getName(), p4);
pm.put(p5.getName(), p5);
Object [] os=pm.keySet().toArray();
for (Object o : os) {
System.out.println(o+"\t"+pm.get(o).getAge());
}
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
//itertor读取(这里取值为map的值values(多个person),同理:可以读取map集合的keyset(key集合))
Iterator i=pm.values().iterator();
while(i.hasNext()){
Person p=(Person) i.next();
System.out.println(p.getAge()+"\t"+p.getName());
};
}
注意:在贴代码前发现了一个容易犯的错误点:
//代码1
Iterator i=pm.values().iterator();
while(i.hasNext()){
Person p=(Person) i.next();
System.out.println(p.getAge()+"\t"+p.getName());
};
//代码2(错误)
while(pm.values().iterator().hasNext()){
Person p=(Person) pm.values().iterator().next();
System.out.println(p.getAge()+"\t"+p.getName());
};
问题点:代码一中可以看到iterator的实例只有一个。而错误的代码2中可以看到每次while循环我都创建了一个新的迭代实现,从而一直死循环每个迭代器实例的第一个。