------- android培训、java培训、期待与您交流! ----------
泛型、map集合及Collections工具类了解
泛型:JDK1.5版本后出现的新特性,用于解决安全问题。是一个安全机制。。。。
好处:
1、将运行时期出现问题ClassCastException转移到了编译时期。方便于程序员解决问题让运行时解决问题减少,安全
2、避免了强制转换的麻烦
泛型格式:通过尖括号<>来定义操作的引用数据类型。
在使用Java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见。。
只要见到<>就要定义泛型
其实<>就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>即可。
什么时候定义泛型类?
当类中要操作的运用数据类型不确定时,早期通过定义Object来完成扩展,现在用泛型来完成扩展。
早期Object:
Class Tool;
{
private Object obj;
Public void setObj(Object obj)
{
This.obj=obj;
}
Public Object getObj()
{
Return obj;
}
}
调用时:Tool t=new Tool();
t.setObj(new Xxxx());
Xxxx x=(Xxxx)t.getObj();
现在泛型:
Class Tool<xxx>
{
Private xxx y;
Public void setXxx(xxx y)
{
This.y=y;
}
Public xxx getXxxx()
{
Return y;
}
}
调用时:Tool<Xxx> t=new Tool<Xxx>();
t.setXxx(new Xxx());
Xxx x=t.getXxx();
泛型类定义的泛型在整个类中都有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有操作的类型已经固定。为了让不同的方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。。。
泛型还可以定义在接口上。。。
T和?的区别:
?通配符,也可以理解为占位符:泛型的限定 ?Extends E,上限;?Super E,下限。
Map集合(接口)
基本特点:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。
方法:
1、添加:put(K key,V value) 如果添加元素时,相同的键,那么后添加的值会覆盖原有键对 应的值,并put方法返回被覆盖的值
putAll(Map<? extends K,?extends V>m)
2、删除:clear() remove(Object key)
3、判断:containsKey(Object value) containsValue(Object value) isEmptty()
4、获取:get(Object key) size() Collection -values()
Set<Map.Entry<k,v>>entrySte() :将Map集合中的映射关系存入到Set集合中,而这个关系的 数据类型就是Map.Entry
keySet()将map中所有的键存入Set集合中,因为Set具备迭代器,所以可以通过迭代方式 取出所有键值,再根据get方法,获取每个键所对应的值。。。
常见子类
Hashtable:底层是哈希表数据结构,不可以存入null作为建,null作为值得情况。该集合线 程是同步的。Jdk1.0,效率低。。
HashMap:底层是哈希表数据结构,允许使用null键null值,该集合不是同步的。Jdk1.2, 效率高。。
TreeMap:底层是二叉树数据结构。线程不同步,可以用于给map集合中的键值进行排序。 和Set很像,其实Set底层就是调用了map集合。。
Map集合的取出原理:将map集合转化为set集合,然后再使用迭代器将其取出
Map.Entry:获取到关系对象后,就可以通过Map.Entry中的getKey和getValue关系中的键值。Map.Entry也是一个接口,是Map内的一个内部接口。
Collections:是用于对集合操作的工具类
Set不能使用Collections里的sort方法,因为其有TreeSet
Collections
强制反转自然顺序 .reverseOrder()
保证线程同步 .synchronizedList()
指定置换某位置元素 .swap()
对列表位置进行随机置换 .shuffle()
Arrays用于操作数组的工具类,方法都是静态的
asList():将数组数组变成List集合
好处:可以使用集合的思想和方法来操作数组中的元素
注意将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的
如果增删会出现:UnsupportedOperationException异常
如果数组中的元素都是对象变成集合时,,数组中的元素就直接转化成集合中的元素;
如果数组中的元素都是基本类型,那么就该数组就作为集合中的元素存在
集合变数组
集合Collection接口中的toArray()
1、指定类型的数组到底要定义多长?党制定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。当指定类型数组的长度大于了集合的size就不会新创建数组。而是使用传递进来的数组。所以创建一个刚刚好的数组最优。
2、为何要将集合变数组?为了限定对元素的操作。不需要进行修改了。。。
高级for循环
格式:for(数据类型 变量名:被遍历的集合(Collection)或数组)1.5版本以后
底层原理还是迭代器。。。。。
只能对集合中的的元素进行取出,不能进行其它操作
迭代器除了遍历,还可以进行remove集合中元素的动作
如果使用ListIterator还可以进行增删改查的操作
传统for与高级for区别:高级for有局限性,必须有被遍历的目标。。
建议在遍历数组的时候还是希望使用传统for,因为其可以定义角标。。。
1.5版本出现的新特性:数组可变参数 public void array(int...array)
在使用方法的可变参数时,一定要定义在参数列表的最后。。。
------- android培训、java培训、期待与您交流! ----------