黑马程序员_集合框架_泛型
来源:互联网 发布:淘宝造物节官网 编辑:程序博客网 时间:2024/06/04 18:39
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
为什么会出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了便于对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
集合和数组的区别:数组是固定长度的而集合长度可变,数组可以存储基本类型数据,而集合只能存储对象,但是集合可以存储不同类的对象
存在多个容器原因是因为对数据的存储方式都有不同,这个存储方式称为数据结构。
collection常用方法:
add方法在集合中添加对象:参数类型是object,以便于接收任意类型的对象。集合中存储的都是对象的引用非实体
size方法:返回集合中对象的个数(集合的长度)
remove方法:删除集合中的元素
clear方法:清空集合中的所有元素
contains方法:判断元素是否存在
isEmpty方法:判断集合是否为空
retainAll方法:取交集举例:调用a1.retainAll(a2)之后a1集合只会保留和a2中相同的元素,a2不变,如果a1和a2没有交集那么a1就为空了
removeAll(a2)方法:删除集合中所有a2集合里有的元素
Iterator it = a1.iterator():获取a1的迭代器it,用于取出集合中的元素,这个迭代器不是用new产生,而是使用a1.iterator()方法获取
迭代器中定义了两个方法:it.hasNext():如果集合中还有元素返回真。it.next():hasNext返回真的情况下返回下一个元素。
迭代器其实就是集合取出元素的方式
List:元素是有序的,元素可以重复。因为该集合体系有索引
Set:元素是无序的,元素不可以重复。
List:下有一些方法:凡是可以操作角标的方法都是该体系特有的方法。
增:add(index,element),addAll(index,Collection);
删:remove(index);
改:set(index,element)
查:get(index); subList(from,to); listIterator();indexOf()
列表迭代器:List集合特有的迭代器。在迭代时,不可以通过集合对象的方法操作集合中的元素。
根据以下代码发现迭代器的缺点而引出列表迭代器:
import java.util.*;class ListDemo {public static void main(String[] args) {//演示列表迭代器ArrayList a1 = new ArrayList();//在列表集合中添加元素a1.add("java01");a1.add("java02");a1.add("java03");//在迭代的过程中,添加或者删除元素Iterator it = a1.iterator();//获取a1的迭代器while(it.hasNext()){Object obj = it.next();if(obj.equals("java02")) //注意:这里会产生错误,因为程序在使用迭代器访问数据的同时又使用集合的方法修改内容会造成不安全因素//a1.add("java008"); //正确的做法:it.remove(); //把当前元素从集合中移除System.out.println("obj=" + obj);}}}//但是迭代器只有获取元素和删除元素的方法,<span style="font-family: Arial, Helvetica, sans-serif;">没有增加元素修改元素等方法所以在迭代器Iterator的子接口ListIterator(列表迭代器)对迭代器进行了扩充</span>
collection
|-------List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:采用的是数组结构,特点是查询数据速度很快,但是增删低效,线程不同步
|--LinkedList:底层使用链表结构,查询很低效,但是增删元素效率很高
|--Vector:底层是数组数据结构,是1.0版本出现的,线程是同步的,效率很低被ArrayList淘汰
|-------Set:元素是无序的,元素不可以重复。Set集合的功能和Collection是一致的。
|--HashSet:底层数据结构是哈希表。HashSet通过元素的两个方法:hashCode和equals来保证元素的唯一性,如果hashCode值相同,才会判断equals是否为true。通常开发中需要用到HashSet集合的时候都会复写这两个方法以提高运行效率。注意:对于判断元素是否存在,以及删除等操作都依赖的方法是元素的hashCode和equals方法。
|--TreeSet:可以对Set集合中的元素进行排序 。注意:排序时,当主要条件相同时,一定要判断次要条件
底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法return 0;
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖comparaTo方法。
这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。定义一个类,实现Comparator接口,覆盖compare方法。
总结:当两种方法都存在时,以容器的比较器为主
TreeSet排序示例:
import java.util.*;class TreeSetTest{public static void main(String[] args) {TreeSet ts = new TreeSet(new StrLenComparator()); //定义TreeSet容器ts并且容器中使用了比较器ts.add("abcd");ts.add("cc");ts.add("cba");ts.add("aaa");ts.add("z");ts.add("hahaha");Iterator it = ts.iterator();//获取ts容器中的迭代器while(it.hasNext())//使用迭代器依次输出容器中的内容{System.out.println(it.next());}}}class StrLenComparator implements Comparator//实现比较器接口{public int compare(Object o1, Object o2){String s1 = (String)o1;String s2 = (String)o2;//按照字符串的长度来进行排序int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); //第二条件,如果长度相同就按照字符串的默认顺序排序if (num == 0){return s1.compareTo(s2);}return num;}}
泛型:JDK1.5版本以后出现的新特性。用于解决安全问题,是一个安全机制。在容器建立之初就强制限制存储的类型,如果类型不一致编译时期就会报错。
优点:1、将运行时期出现的问题转移到了编译时期,方便程序员解决问题,让运行时期问题减少增加程序安全性。
2、避免了强制转换的麻烦
泛型的格式:通过<>来定义要操作的引用数据类型。通常在集合框架中很常见,只要见到<>就要定义泛型。<>就是用来接收类型的,也可以理解为用来限制集合中使用的数据类型,只要将集合中要 存储的数据类型作为参数传递到<>中即可。
泛型类:当类中要操作的引用数据类型不确定的时候,早期定义object来完成扩展。现在定义泛型类来完成扩展。泛型类定义的泛型,在整个类中有效。如果被非法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定。为了让不同的方法可以操作不同的类型,而且类型还不确定,那么可以讲泛型定义在方法上。特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。
泛型限定:
在比较器中泛型限定父类,实现在父类的所有子类下都能调用比较器以增加代码复用性实例代码:?通配符:也可以理解为占位符。泛型限定:
? extends E:可以接受E类型或者E的子类。上限
? super E:可以接受E类型或者E的父类型。下限
import java.util.*;public class personTest{public static void main(String[] args) {//比较器的限定为person类(父类)TreeSet<person> t1 = new TreeSet<person>(new comp());t1.add(new person("abc4--p"));t1.add(new person("abc2--p"));t1.add(new person("abc3--p"));t1.add(new person("abc1--p"));Iterator<person> itp = t1.iterator();while (itp.hasNext()){System.out.println(itp.next().getName());}//注意:子类student使用泛型限定为父类person的比较器TreeSet<person> t2 = new TreeSet<person>(new comp());t2.add(new student("abc4--s"));t2.add(new student("abc2--s"));t2.add(new student("abc3--s"));t2.add(new student("abc1--s"));Iterator<person> its = t2.iterator();while (its.hasNext()){System.out.println(its.next().getName());}//注意:子类worker使用泛型限定为父类person的比较器TreeSet<person> t3 = new TreeSet<person>(new comp());t3.add(new worker("abc4--w"));t3.add(new worker("abc2--w"));t3.add(new worker("abc3--w"));t3.add(new worker("abc1--w"));Iterator<person> itw = t3.iterator();while (itw.hasNext()){System.out.println(itw.next().getName());}}}class person{private String name;person(String name){this.name = name;}String getName(){return name;}}//以下两个类均为person的子类class student extends person{student(String name){super(name);}}class worker extends person{worker(String name){super(name);}}//在comp比较器中泛型限定为person类(父类)class comp implements Comparator<person>{public int compare(person p1, person p2){return p1.getName().compareTo(p2.getName());}}
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将 List 看作是具有数值键的 Map。而实际上,除了 List 和 Map 都在定义 java.util 中外,两者并没有直接的联系。
map集合:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。
1、添加:
put(k key, v value)注意:put方法按对存储元素,如果键不重复(也就是存的是一个新键)方法会返回一个null表示没有替换原集合中的值,如果键重复将会返回原集合中被替换的值,同时修改为新存的值。
putAll(map<? extends k, ? extends v> m)
2、删除:
remove(key);clear()
3、判断:
containsKey(key);containsValue(value);isEmpty()
4、获取
get(Object key) 通过键获取值
size()
values() 获取map集合中所有的值:返回的是一个collection集合
Set<Map.Entry<k,v>> entrySet() :将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry。当得到set集合之后可以使用Map.Entry中的方法getKey和getValue方法获取关系中的键和值。
Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口。
Set<> keySet():返回一个set集合,将map中所有的键存入到set集合,因为set具备迭代器,通过迭代器迭代所有的键,然后再根据get方法获取每一个键对应的值。
Map
|---Hashtable:底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步的。效率低
|---HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。效率高
|---TreeMap:底层是二叉树结构,线程不同步,可以用于给map集合中的键进行排序。
总结:map和Set很像,其实set底层使用了map集合
map扩展知识:
map集合被使用是因为具备映射关系。当需要使用到一对多的关系的时候,可以嵌套的使用map集合,也就是可以把一个相对范围小的map集合作为大的map集合的值来实现一对多的映射关系。
collections:
collections工具类的特点:内部的方法都是静态的,不需要对外创建对象,因为他的对象当中并未封装特有数据,都是共享型数据。是一个专门对集合进行操作的工具类。
- 黑马程序员_集合框架_泛型
- 黑马程序员_集合框架(泛型)
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- 黑马程序员_集合框架
- Android安卓移动开发工程师职业规划图
- android dip px sp
- windows7如何查看端口被占用
- 立志篇——开始阅读源码
- VS2008远程调试
- 黑马程序员_集合框架_泛型
- c/c++中#和##链接符号的用法
- Linux和windows之间资源共享--samba服务器配置
- Address already in use: JVM_Bind<null>:80 解决方案
- C语言 递归拆分数字
- JS获取中文拼音首字母,并通过拼音首字母快速查找页面内的中文内容
- MySQL之锁-1 降低锁竞争,减少MySQL用户等待时间
- apache运行CGI程序的配置
- poj1011(深搜+剪枝)