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几口的常用方法(父类发发有限,子类方法更丰富),开发过程中一般建议使用子类接口。
二: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
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循环我都创建了一个新的迭代实现,从而一直死循环每个迭代器实例的第一个。
- java集合框架(泛型)
- Java基础集合、泛型
- JAVA集合、泛型
- Java集合框架 泛型
- JAVA 泛型,集合使用方法
- java 集合 泛型
- Java--集合(LinkedList,泛型)
- Java之集合、泛型
- Java 集合框架 泛型
- java笔记-集合框架-泛型、Map集合
- Java-集合框架(上)、泛型
- java 集合框架 泛型--15
- Java--泛型、List、Set集合
- Java集合:集合框架
- java集合---set集合
- JAVA 集合 的 集合
- 【集合】Java集合对比
- JAVA集合-Map集合
- 设计模式-结构型之桥接模式
- AJAX简单应用
- 进程以及进程通信(IPC)类型
- HHDU5411 CRB and Puzzle
- QT 中使用excel
- JAVA集合、泛型
- 键盘键盘损坏 1~4键无法使用,基于i8042 修改驱动使用F1~F4 替换
- 软件测试的七大原则
- OSPF特殊区域之totally nssa
- BestCoder Round #53(hdu 5422&5423&5424)
- php函数
- vjweaozhdmkfsmqq
- 絮叨絮叨看护机房之监控
- 串的内存表示