一、 Collection与Map继承结构图

Collection继承结构图



实现Collection接口的类只能存储引用类型!所以set.add(10)会有自动装箱的过程,把int 转成 Integer类型。

类:

  • ArrayList 底层数组
  • LinkedList 底层双向链表
  • (Vector 底层与ArrayList相同,但是线程安全的。但由于在多线程效率低,现很少使用,我们也一般不使用自身的机制来保证线程安全。)
  • HashSet 底层是哈希表/散列表
  • TreeSet

Map继承结构图

Java实现链表



二、 Collection接口的方法

1 iterator

关于iterator
  • Java中的iterator完全不同于C++中的iterator:C++中迭代器可以不需要查找操作就进行位置变更,但Java中查找操作和位置变更是紧密相连的,在执行查找操作的同时迭代器的位置随之移动。
  • 因此应该认为Java迭代器是位于两个元素之间。调用next时,迭代器就越过下一个元素,并返回越过的元素的引用。
格式:
Iterator<Integer> it=c.iterator();
//用迭代器遍历
while(it.hasNext()) {
Object elm=it2.next();
System.out.println(elm);
}

2 contains && 放在集合中的类必须要重写equals方法

  • 原因:若不重写equals方法,以下的c.contains(s2)会输出false,contains调equals方法时比较的是两个对象的内存地址。这不符合业务逻辑,所以要在累中重写equals方法。
		Collection<Student> c=new ArrayList<Student>();
Student s=new Student(10,"gaga");
c.add(s);
Student s2=new Student(10,"gaga");
System.out.println(c.contains(s));
System.out.println(c.contains(s2));
  • 重写equals方法格式:
//重写equals方法
public boolean equals(Object ob) {
if(this==ob) {
return true;
}
if(ob instanceof Student) {
Student s=(Student)ob;
if(this.no==s.no&&this.name==s.name) {
return true;
}
}
return false;
}

3 it.remove()

  • 使用迭代器的remove()函数可以边遍历边删除,建议使用;而使用集合的remove()函数会抛异常,不建议使用。
  • 例子
while(it.hasNext()) {
Object sTemp=it.next();
it.remove();
}

三、 List

  • List特有方法get(idx),add(idx,elem)
  • List是有序的,故可以通过下标访问。
  • ArrayList底层是数组,LinkedList底层是双向链表。
  • ArrayList底层默认初始化容量=10,扩容后容量是原容量的1.5倍。

    Vector底层默认初始化容量=10,扩容后容量是原容量的2倍。

    故为了优化ArrayList和Vector,建议在创建集合时指定初始容量,以尽量减少扩容操作,扩容需要数组拷贝,很耗内存。

四、 hashSet

hashSet底层是hashmap,相当于hashmap的key的部分,hashmap是由散列表/哈希表实现。

hashSet和hashMap初始容量是16,默认加载因子是0.75,即元素填满了0.75就开始扩容。

1 【散列表】

  • 散列表是元素是单向链表的数组。查询和插入删除操作的效率都非常高。
  • 每个节点的结构是:
Class Entry{
Object key;
Object value;
final int hash;
Entry next;
}
  • key要求不可重复,
  • final int hash :是key通过【hashCode】方法得到的值再通过【hashfunction】得出的值,代表数组的下标,同一个链表上的节点hash值相同。
  • hashmap有用于查找节点的方法:Object get(Object key)

    用key计算出hash值,在数组对应链表查找元素。
  • hashmap有用于插入节点的方法:void put(Object key,Object value)

    若key对应的hash不在数组中(调用key.hashCode方法计算key对应的hash),则在数组尾部加节点;否则,并且链表中不存在该元素(调用key.equals方法),则插入链表;否则,不插入该节点。

hashSet

放入hashSet和heshMap的类必须重写public int hashCode()方法和public boolean equals()方法。

指导思想:hashCode的返回值要尽量分布均匀。

String类是带hashCode()方法的。

五、SortedSet接口下的TreeSet类

无序不可重复,但可以按照元素大小自动排列。

  • 第一种实现比较器方法:

    **放在TreeSet中的类必须实现java.lang.Compareble接口,实现接口就要实现接口内的全部方法,故要实现public int compareTo(Object o)方法。
  • 第二种实现比较器方法:

    创建TreeSet集合的时候提供一个比较器,SortedSet products=new treeSet(new productsComparator()),其中productsComparator类是自己实现的Comparator接口。

六、Map 中的常用方法。(略,需要的话查)

  • map中的key重复,则value覆盖。

  • map中的key需要重写hashCode 和 equals 方法。

  • HashMap继承Map类

  • HashMap默认初始容量16,加载因子0.75.

七、Properties类 属性类

  • 继承HashTable类
  • HashTable类初始容量11,加载因子0.75。
  • Properties Key和value都必须是字符串类型
  • 有getProperties(key)方法和setProperties(key,value)方法

八、SortedMap

  • 无序不可重复,但存进去的元素按大小自动排列
  • 要实现自动排序:法1:key部分要实现Compareble接口(重写其中的compareTo方法)。或法2:单独写一个比较器,可以结合匿名内部类的方式写。

九、集合工具类java.utils.Collections (不是Collection接口)

  • sort(List) 函数 :实现排序,若是set可先将set转换成List。
  • synchronizedList(ArrayList)函数:将ArrayList转成线程安全的。

十、其他

泛型

  • 泛型是JDK 5.0新特性,编译期概念。
  • 引入泛型原因:使集合元素类型统一,进而避免遍历时大量类型强制转换。
  • ArrayList list=new ArrayyList ();
  • 自定义泛型
Class MyClass<T>{
public void m(T t){
System.out.println(t);
}
}

增强for循环

  • JDK5.0新特性
for (String name:strs){
System.out.println(name);
}

[Java学习]集合的更多相关文章

  1. Java学习-集合(转)

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  2. Java学习----集合框架总结

    集合框架总结: Collection接口: Set接口: HashSet//对象必须实现hashCode方法,元素没有顺序呢,效率比LinkedHashSet高 LinkedHashSet//是Has ...

  3. java学习——集合框架(Collection,List,Set)

    集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储. 集合特点:1,用于存储对象的容器.2,集合的长度是可变的.3,集合中不可以存储基本数据类型值. ...

  4. Java学习——集合框架【4】

    一.集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实 ...

  5. Java学习----集合函数

    1.List----有序的collection(序列) 与数组的不同:数据类型可以相同可以不同,数组的长度是预先定义好的,集合的长度也是预先定义好的,但是长度会随着元素的增加而增加 ArrayList ...

  6. java学习——集合框架(泛型,Map)

    泛型: ... Map:一次添加一对元素.Collection 一次添加一个元素. Map也称为双列集合,Collection集合称为单列集合. 其实map集合中存储的就是键值对. map集合中必须保 ...

  7. 【转】Java学习---集合框架那些事

    [原文]https://www.toutiao.com/i6593220692525711885/ Arraylist 与 LinkedList 异同 1. 是否保证线程安全: ArrayList 和 ...

  8. JAVA学习第三十六课(经常使用对象API)— Set集合:HashSet集合演示

    随着Java学习的深入,感觉大一时搞了一年的ACM,简直是明智之举,Java里非常多数据结构.算法类的东西,理解起来就轻松多了 Set集合下有两大子类开发经常使用 HashSet集合 .TreeSet ...

  9. Java学习笔记之集合

    集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java -- 面向对象 -- 操作很多对象 -- 存储 -- 容器(数组和StringBuffer) -- 数组而数组的长度固定 ...

随机推荐

  1. jquery 全选操作

    $(function(){ $("#checkedAll").change(function(){ if(this.checked){ $(".checkSingle&q ...

  2. HBASE小结--待续使用

    构建在HDFS之上的分布式,面向列的存储系统,使用zookeeper做协同服务,在需要实时读写和随机访问超大规模数据集的时候使用 缺点:非关系型,不支持SQL,数据类型单一(字符串,无类型),之支持单 ...

  3. c# Type.InvokeMember用法

    函数原型: public object InvokeMember(string, BindingFlags, Binder, object, object[]);string:你所要调用的函数名Bin ...

  4. Mysql(MyISAM和InnoDB)及Btree和索引优化

    MYSQL 一.引擎 mysql:MySQL是一个关系型数据库管理系统,其中有两种引擎最为常见MyISAM和InnoDB MyISAM(非聚集索引)  MySQL 5.0 之前的默认数据库引擎,最为常 ...

  5. img标签在div里上下居中

    方法一:图片尺寸未知,IE8-不支持 CSS部分: <style> .content{ width:500px; height:500px; border:1px solid black; ...

  6. java为什么有些异常throw出去需要在函数头用throws声明,一些就不用。

    Excepiton分两类:checked exception.runtime exception:直接继承自Exception就是checked exception,继承自RuntimeExcepti ...

  7. ArcGIS自定义工具箱-判断字段值是否相等

    ArcGIS自定义工具箱-判断字段值是否相等 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:判断两个字段值是否相等 使用方法: 结果: 联系方式:谢老师,13 ...

  8. Windows Server 2012开启磁盘性能计数器

    Windows Server 2012默认情况下已经禁用了磁盘性能计数器,打开任务管理器后,无法像Win8一样在性能选项卡中看到“磁盘”使用情况,可能是因为微软考虑到安装此服务器系统的硬件都会非常好, ...

  9. arcgis_SDE安装步骤

    弄了将近一个星期的Oracle和ArcSDE终于让我给弄好了!下面把过程跟大家分享一下: 首先是Oracle10gR2的安装,在Oracle的官方网站上可以下到Oracle10gR2的安装程序,安装过 ...

  10. Swift类型转换 和 类型别名的定义(typealias)

    (一)类型转换 类型转化在 Swift 中是比较严格的,不同类型之间可以认为是不能相互转化的,只能重新产生一个对象和值,并拷贝一份. 1.0 整型数值之间的转换. // 不同类型是不能直接相加的,这时 ...