Collection容器学习总结:
1. Collection是所有容器都会实现的一个根接口,他下面又细分了List,Map,Set三大子接口,Collection实现了数组的所有功能,和数组相比,Collection可以动态的改变
大小,其操作元素的方式也更灵活,并且,Collection支持泛型
2.List容器是一个顺序存取容器,arrayList实现了List接口,其内部采用数组的数据结构,数组的初始大小为10,当要存入 的元素数大于数组大小时arrayList会创建一个新的数 组,其大小为原数组的1.5倍,并把原数组中的元素复制到新数组中去。因为arrayList内部采用了数组的数据结构,所以其查询数度快,但插入和删除元素较慢;linkedList也是List的实现类,和arrayList不同,LinkedList采用了链表的数据结构,因链表元素间是逻辑上的顺序排列,所以不必创建数组,没有旧数组向新数组复制元素的操作,其插入和删除操作比arrayList快,但查询数度不比arrayList。
3.Map容器是映射关系类型的容器,它采用键值对的方式,将键映射到值的对象上,以在元素间建立映射关系,一个映射不能包含重复的键,每个键最多只能映射到一个值,可以通过键集,值集或键值映射关系集的形式查看某个映射的内容。HashMap底层采用Hash码方式存储数据,Hash码存储方式可以提供近乎数组方式的查询速度,其插入和删除操作效率和LinkedList相当,因此它是综合性能最好的一种数据存储结构,因采用Hash码,其中的元素是无序的; Map容器不允许其中有重复的健,其中HashMap根据Hashcode()函数和equals()函数来判断健是否重复,可以重写这两个函数来改变健的重复判断标准;TreeMap底层采用红黑树的存储结构,它根据键的自然顺序对元素进行排序,因此他要求存入其中的健本身具备可比较性,让键实现comparable()接口可以使键具备可比性,键需要实现comparable()接口中的compareTo()函数以定义具体的比较规则。
4. Set容器不允许有重复元素,判断重复的规则根据是根据存入其中的元素本身的equals()函数来指定的,可以通过重写这个函数来修改判定规则,Set拥有Collection完全一样的方法,Set底层采用了Map的数据结构,只是Set只使用了Map中的键,没有使用它的值;当Set底层采用了TreeMap数据结构即treeSet时,要求元素实现comparable()接口以具备可比性这和treemap一样,当Set底层采用hashMap数据结构时,要求元素重写equals()和Hashcode();除Map接口类型的容器外,其它类型的容器都实现了Collection接口中的共性方法,因此,可以通过Collection接口中定义的共性方法来操作具体的容器类,常用的共性方法是:add(),remove(),contains(),iterator();
常用的Map接口类型的容器的共性方法是:containskey(),containsValue(),entrySet(),keySet(),put(),remove(),values();
5. 所有的容器都支持泛型,泛型允许抽象的数据类型,即在容器类被实例化之前,可以不必确定容器中可存储的具体对象类型,只在实例化的时候指定就行了,这样可以避免
为不同的数据类型编写不同的容器,以提高代码的复用性;
List类的用法示例:
ArrayList:
创建:arrayList<String> al=new arrayList<String>();尖括号内为用户想要存入的数据类型,这里假设为String类型
插入:al.add("arrayListDemo");在列表末尾插入元素
al.add(2,"indexadd");在列表指定位置插入元素
修改 :al.set(0,"a new element");第一个参数元素索引,第二个参数新的元素
删除:al.remove(0);其参数是待删除的元素索引
查询:al.contains("contain");其参数是被查询的对象
遍历:方法一:iterator i=al.iterator();//这种迭代器只能正向遍历,功能简单,不能执行插入修改操作
while(i.hasNext()){
String s=i.next
System.out.printlns();
}
方法二:listIterator li=al.listIterator();//这个迭代器是列表特有的迭代器,他在iterator的基础上,添加了插入和修改的功能,并且可以逆序遍历
while(li.hasNext()){
String s=li.next();
System.out.println(s);
}
通过listIterator进行插入和修改操作和逆序遍历:
插入操作:li.add("listIterator add");
修改操作:li.set("listIterator set");
逆序遍历:while(li.hasPrevious()){
String s=li.previous();
System.out.println(s);
}
linkedList 的用法和arrayList基本相同,只是底层数据结构不同而已,不再举例;
Map类用法举例:
TreeMap:
创建:treeMap<String,String>mtp =new treeMap<String,String>();Map必须以键值对的形式存在,所以初始化的时候要要指定键和值的类型
插入: mtp.put("zhangshan","30");以键值对的方式插入一个元素,第一个参数为键,第二个参数为值,当待插入的元素中的键在容器中已经存在时,新
插入的值将覆盖容器中原有的值,并将原有的值作为函数返回值返回给调用者
修改:修改操作和插入操作方法一样;
删除:mtp.remove("zhangshan");其参数为待删除元素的键,如果删除成功,返回已删除元素的值,否则返回null
查询:mtp.get("zhangshan");返回被查询键对应的值
判断指定键是否存在:mtp.containsKey("zhangshan");
判断指定值是否存在:mtp.containsValue("30");
当将用户自定义的数据类型作为键存入treeMap集合时,必须让用户自定义数据类型具备可比性,这可以通过实现comparable()接口并定义里面的compareTo()函数来
使用户自定义数据类型具备可比性:
class myclass implements comparable<myclass>{
public int compareTo(myclass p){
//这里面写具体的判断逻辑
} }
或者给treeMap初始化时传入一个比较器comparator():
treeMap<myclass,String> tm= new treeMap<myclass,String>(new comparator(myclass){
public int compare(myclass p,myclass p1){
//判断逻辑代码
}}
经过上面的步骤,就可以将用户自定义数据类型作为键存入treeMap集合了;
hashMap:
hashMap 的用法基本和treeMap相同,当要将用户自定义数据类型作为hashMap中的键时,要求用户自定义数据类型重写其hashCode()和equals()函数:
class myhash{
public int hashCode(){
//用户自己根据需要决定是否重写这个函数
}
public int equals(myhash p){
//这里定义判断用户自定义数据类型相同的逻辑,必须重写
} }
遍历:Map 类的遍历要用到map.entry这个内部类,通过Map的entrySet()函数,这个函数返回map.entry<k,v>的Set集合,再通过entry中的函数,就能遍历
Map集合了:
Set<Map.Entry<String,String>> ms=mtp.entrySet();
iterator<Map.Entry<String,String>> it=ms.iterator():
Map.Entry<String,String> me=null;
while(it.hasNext()){
me=it.next();
System.out.println(me.getKey()+me.getValues());
}
Set类用法示例:
treeSet:底层采用treemap数据结构,因此被插入的元素或者要实现comparable接口,或者重写元素本身的equals()函数,以使元素具备可比性,Set中不包含
重复元素,因此Set中不包含e1.equals(e2)为真 或者e1.compareTo(e2),为真的元素,也可以在实例化时给treeSet传入一个比较器,这和操作treeMap一样;
因set用法和Collection用法相同,不再举例;
HashSet:底层采用Hash表数据结构,其保证元素唯一性的依据是元素的HashCode()和equals()函数,可以通过重写这两个函数来定义用户自定义规则;
其用法和上面的类类似,不再举例。
properties类用法:
properties类是hashtable的子类,它是一个线程安全的类,用来读取或存储配置信息,和Map其它类不同的是其可以操作流:
properties p = new properties();
File f=new File("D:\\my.ini");
p.load(new fileInputstream(f));//从流中读取数据
p.store(new fileOutputstream(f));//将数据保存到流中
p.getProperty(String key)//读取键值用这个函数,也可以用get()推荐用这个
p.setProperty(String key, String value) //设置键值用这个函数,也可以用put(),推荐这个
其它操作和Map其它类相似,不再举例
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com