JAVA集合、泛型

来源:互联网 发布:淘宝客服没人理怎么办 编辑:程序博客网 时间:2024/06/03 16:28

一:Java集合框架

 Java数组:

int a[]=new a[20];

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

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

Java集合

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

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

3.层次图:

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

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

Collection接口的方法返回类型方法名称描述booleanadd(Object o)在结合末尾添加元素intsize()返回集合列表元素个数Objectget(int index)返回指定索引位置的元素,索引从0开始booleanremoveAll(Collection col)删除集合中的所有元素Objectremove(int idex)从集合中删除指定索引位置的元素booleancontains(Object o)判断集合中是否存在指定的元素booleanremove(Object o)从集合中删除元素voidclear()清除结合中的所有元素Iteratroriterator()为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接口

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

定义:public interface Map<k,v>

1.HashMap

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

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

2.Hashtable

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

hashmap和hashtable的区别NO

hashMap

hashtable

1允许空键空值不允许2线程异步。效率高线程同步。效率低3继承自AbstractMap继承自Dictionary

五:泛型

1.概述:约束数据类型,使用泛型可以提高数据安全性。

2.定义:<T>   

泛型类:

@Repository("menuDao")public class MenuDaoImpl extends BaseDaoImpl<Tmenu> implements MenuDaoI  {}

泛型集合:

List<String> l=new ArrayList<String>();List<Person> pl=new ArrayList<Person>();

3.应用:

@Testpublic void TestCol(){Set set=new HashSet();while(set.iterator().hasNext()){set.iterator().next();}List<String> l=new ArrayList<String>();List<Person> pl=new ArrayList<Person>();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<String, Person> pm=new HashMap<String, Person>();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());};}


注意:在贴代码前发现了一个容易犯的错误点:

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

0 0
原创粉丝点击