JAVA集合、泛型

一:Java集合框架

 Java数组:

int a[]=new a[20];

1.定义:一旦创建,其长度不可变;具体的存放个数是未知的。

2.作用:Java数组可以保存一定数量的数据。数组是一组相同数据类型的集合。

Java集合

1.定义:一系列存储数据的接口和类,这些类位于Java.util包中。

2.作用:可以解决复杂数据的存储问题,任何一个集合类都可以存储不同类型的数据并且长度可以动态改变。

3.层次图:

JAVA集合、泛型_第1张图片

JAVA集合、泛型_第2张图片

Java集合只要由Collection、Map两个接口组成,下面又有多个子接口组成。集合类的使用都直接或间接地实现了Collection、Map接口或其子接口。

这里简单的提供下Collection几口的常用方法(父类发发有限,子类方法更丰富),开发过程中一般建议使用子类接口。

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接口实例化

二:conllection接口之一:set接口

定义:元素无序、不可重复

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);

三:collection接口之二:list接口

定义:元素有序,可重复的集合

1.ArrayList

用法:类似数组,但其容量可以按需要动态调整,所以被称为动态数组。当容量需要增长时,默认增长为原来的一半。线程是异步的,性能较低。

2.linkedList

用法:他被称为链表操作类,同时实现了List和Queue接口,存放元素按照先进先出的方式排序。

简单的说下链表:链表就好比链子的每一个链环组成一根铁链。每个链环就是一条数据。链子上的链环是一个接一个,那么链表的数据也是如此。

3.Vector

用法:等同ArrayList,区别在于Vector是线程同步的,当容量需要增长时,默认增长的是原来的一倍。线程同步,性能较低。

4.Stack:继承了Vector且进行了扩展,存储数据的方式是先进后出。(详看API)

经验:涉及到堆栈、队列等操作应考虑Vector,对于快速删除、插入元素的场合应该使用LinkedList,快速随机访问,应该使用ArrayList。

四:Map接口

JAVA集合、泛型_第3张图片

Collection、Set、List接口均属于单值操作,即每次只操作一个对象。而Map的特点在于:他可以单次操作一个对象。其中每个元素使用键值对(key-value)的形式存储于集合中。使用的时候必须同时设置key和value的类型。

定义:public interface Map

1.HashMap

特点:键值对存储数据,存储的元素时无序的。存储的数据中不能出现重复的键,可以出现空值空键。

读取方式通过Itertor集合迭代器读取数据。(你可以迭代键,也可以迭代值)。

2.Hashtable

特点:键值对存储数据,存储元素无序。存储元素不允许重复且不允许空键空值。

hashmap和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循环我都创建了一个新的迭代实现,从而一直死循环每个迭代器实例的第一个。

你可能感兴趣的:(JAVA)