接口

[四个接口  collection  list  set  map 的区别]
collection   存储不唯一的无序的数据
list      存储有序的不唯一的数据
set        存储无序的唯一的数据
map     以健值对的形式存储数据   以键取值  键不能重复   值可以重复
 
list接口
1.常用方法
①add方法 在列表的最后添加元素
 
②add(index.object)在此列表中的指定位置插入指定的元素。
 
③size() 返回此列表中的元素个数。
 
④get(int index)返回下标为index的元素
如果没有泛型约束,返回object类型,需要强转,如果有泛型约束,直接返回泛型类型,无需强转,
 
⑤clear方法,清除列表中的所有数据
 
⑥contains() 传入一个对象检测列表中是否含有对象
    如果传入的是string和基本数据类型,可以直接对比
    如果传入的是实体对象,则默认只对比两个对象的地址
 
⑦indexof ,传入一个对象,返回此列表该对象的第一次出现的下标,如果此列表不包含元素,则返    回-1。
    lastindexof返回最后一次
 
⑧ remove传入一个下标或一个对象,删除指定元素
如果传入下标,返回被删除的元素对象,如果下标大于   汇报下标越界
如果传入对象,则要求重写equals方法,返回true或者是false表示删除是否成功
 
⑨set  用指定的元素替换此列表中指定位置的元素。 返回被替换掉的元素对象
 
⑩subList  截取一个子列表,返回list类型
   toArray 将列表转为数组,返回一个object[]类型的数组
 
 
 
ArrayList
     实现了一个长度可变的数组,在内存空间中开辟一串连续的空间,与数组的区别在于长度可以随意修改。
这种存储结构,在循环遍历和随机访问元素的速度比较快。
 
LinkedList
使用链表结构存储数据,在插入和删除元素时速度非常快。
 
LinkedList的特有方法:
 
① addFirst(): 开头插入元素
    addLast():  结尾插入元素
 
② removeFirst(): 删除第一个元素,并返回被删除的元素。
     removeLast():  删除最后一个元素,并返回被删除的元素。
 
③ getFirst():  返回列表第一个元素,不会删除
     getLast():  返回列表最后一个元素,不会删除
 
Vector     线程安全
LinkedList   线程不安全

Set接口
常用方法:与List接口基本相同。
但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法。
例如: get(index)  remove(index)   add(index,obj)  ....
 
Set接口的特点: 唯一、 无序;
 
 HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的hashCode进行散列运算,
得到一个散列值后在进行运算,确定元素在序列中存储的位置。
     HashSet如何确定两个对象是否相等?
① 先判断对象的hashCode( ),如果hashCode不同,那肯定不是一个对象。  如果hashCode相同,那继续判断equals( )方法;
② 重写equals( )方法。
 
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
>>>所以,使用HashSet存储实体对象时,必须重写对象的hashCode( ) 和 equals( ) 两个方法!!
 
 LinkedHashSet: 在HashSet的基础上,新增了一个链表。
      用链表来记录HashSet中元素放入的顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读出元素。
 
TreeSet: 将存入的元素,进行排序,然后再输出。
  如果存入的是实体对象,那么实体类必须实现Comparable接口,并重写compareTo()方法;
          或者,也可以在实例化TreeSet的同时,通过构造函数传入一个比较器:
  比较器: 一个实现了Comparator接口,并重写了compare()方法的实现类的对象。
 
   使用匿名内部类,拿到一个比较器对象。
Set<Person>  set = new TreeSet<Person>   (new Comparator( ){
public int compare(Person p1, Person p2){
return p1.getId( ) - p2.getId( );
}
});
自定义一个比较类,实现Comparator 接口。
   Set<Person> set = new TreeSet<Person>(new Compare( ));
class Compare implements Comparator( ){
重写compare方法。
}
【Comparable接口 和 Comparator接口的区别】
1、 Comparable由实体类实现,重写compareTo()方法; 
        实体类实现Comparable接口以后,TreeSet使用空参构造即可。
2、 Comparator需要单独一个比较类进行实现,重写Compare()方法。
        实例化TreeSet的时候,需要传入这个比较类的对象。
 
Map接口
Map接口特点  以健值对的形式存储数据 以及按键取值
键不能重复   值可以重复
 
Map接口常用方法
①put(key ,value)向map的最后添加一个键值对
 
②get(key) 通过键,取到一个值
 
③clear() 删除所有内容
 
④containsValue()  检测是否包含指定的值
    containsKey()      检测是否包含指定的键
 
LinkedHashSmap
可以使用链表, 用链表来记录元素放入的顺序,可以按照放入的顺序依次读出元素。
 TreeMap
根据键的顺序 进行排序后输出
如果存入的是实体对象,那么必须重写比较函数;
 
  HashMap与Hashtable的区别
 
1.Hashtable是线程安全的 (线程同步) HashMap是线程不安全的(线程不同步)
 
2.Hashtable的键不能为null  HashMap的键可以为null
 
3.HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口。
 
4.HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
 
5.HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
 
6.两者计算hash的方法不同: 
Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模:
HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸:
 
7.在HashMap 中不能用get()方法来判断HashMap 中是否存在某个键,而应该用containsKey()方法来判断。Hashtable 的键值都不能 为null,所以可以用get()方法来判断是否含有某个键。
 
 
遍历map的方式

第一种

Set<String> keys =map1.keySet();
Iterator<String> iter=keys.iterator();
while (iter1.hasNext()) {
String key=iter.next();
System.out.println(key+"----"+map.get(key));
}

第二种

Collection<String> va=map.values();
Iterator<String> iter=va.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}

第三种

Set<Entry<String,String>> set= map.entrySet();
Iterator<Entry<String, String>> iter=set.iterator();
① while (iter.hasNext()) {
Entry<String, String> entry=iter.next();
//entry是Java给我们提供的一种特殊的数据类型 其实就是一个键值对
//键就是当前这条记录的键,使用getkey()取到
//值就是当前这条记录的值,使用getValue()取到
System.out.println(entry.getKey()+""+entry.getValue());
} ② for(Entry<String, String> y:set){
System.out.println(y.getKey()+"----"+y.getValue());
}
 
 
 
 

Java集合框架的四个接口的更多相关文章

  1. Java 集合框架(一)—— 接口综述

    前言:凡是使用 Java 编程的,几乎肯定会用到集合框架,比如 ArrayList.LinkedList.HashSet.HashMap 等,集合框架的代码绝对是大师级的实现,所以为了更好地使用集合框 ...

  2. Java集合框架(四)—— Queue、LinkedList、PriorityQueue

    Queue接口 Queue用于模拟了队列这种数据结构,队列通常是指“先进先出”(FIFO)的容器.队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素.新元素插入(offer)到 ...

  3. java 集合框架(十四)Queue

    一.概述 Queue一种队列结构集合,用来存储将要进行处理的元素.通常以FIFO的方式排序元素,但这并不是必须的.比如优先度队列就是一个例外,它是以元素的值来排序.但无论怎样,每个Queue的实现都必 ...

  4. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  5. Lambda表达式和Java集合框架

    本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...

  6. Java集合框架总结

    java集合框架主要分为实现了Collection接口的List和Set.映射接口Map. |-- List 有序,元素都有索引,可重复. |-- Set 无序,不可以存储重复的元素. |-- Map ...

  7. Java集合框架(1)

    Collection接口:它是Java集合框架的一个根接口,也是List.Set和Queue接口的父接口.同时它定义了可用于操作List.Set和Queue的方法—增删改查. Map接口:它提供了一种 ...

  8. 详谈java集合框架

    1.为什么使用集合框架 当我们并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架 2.Java集合框架包含的内容 接口:(父类)Collection接口下包含Li ...

  9. Java集合框架(java.util包)

    集合的概念: 是一种工具类,可以存储任意数量.任意类型的对象(所以后面需要用到泛型,以约束集合中元素的类型) 集合的作用: 1.在类的内部对属性进行组织 2.方便快速定位属性位置 3.某些集合接口,提 ...

随机推荐

  1. 【数据库】mysql深入理解乐观锁与悲观锁

    转载:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时 ...

  2. python函数知识点(详解匿名函数)

    Python函数是组织好的.单一的.具有独立功能模块的代码块. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定 ...

  3. SQL注入之Sqli-labs系列第一篇

    在开始接触渗透测试开始,最初玩的最多的就是Sql注入,注入神器阿D.明小子.穿山甲等一切工具风靡至今.当初都是以日站为乐趣,从安全法实施后在没有任何授权的情况下,要想练手只能本地环境进行练手,对于sq ...

  4. 关于js中promise的面试题。

    核心点promise在生命周期内有三种状态,分别是pending,fulfilled或rejected,状体改变只能是 pending-fulfilled,或者pending-rejected.而且状 ...

  5. 一周Maven框架学习随笔

    第一次写博客,可能写得不是很好,但是希望自己持之以恒,以后会更好.也希望通过写博客记录随笔,让自己本身有所收获. 下面是今天的maven总结: maven个人理解中是Maven项目对象模型(POM), ...

  6. java.lang.system 类源码解读

    通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...

  7. 20145237 实验一 逆向与Bof基础

    20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...

  8. 201621123031 《Java程序设计》第5周学习总结

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需 ...

  9. mongodb 高级操作

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

  10. Flask 部署和分发

    到目前为止,启动Flask应用都是通过"app.run()"方法,在开发环境中,这样固然可行,不过到了生产环境上,势必需要采用一个健壮的,功能强大的Web应用服务器来处理各种复杂情 ...