在线编程在线课堂在线测评Anycodes在线编程

编程论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

How to use bs4??
本帖最后由 carry0987 于
Double Queue 问题描述 : The new founded Balkan Investment Group Bank (
John 问题描述 : Little John is playing very funny game
linux-command Linux命令大全搜索工具,内容包含Linux命令
Coati 是一款跨平台的代码查看工具,适用于 C/C++ 和 Java。商业软件。特性:1. 索引
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
全平台视频监控,支持安卓苹果以及pcweb,支持海康大华等主流dvr,全部源码以及文档 单聊、群聊、商
如何访问类的私有属性? 下面以 TPathData 为例,
问题:从 XE4 以来,Firemonkey 曲线绘图在移动平台不平滑的问题一直令人诟病,提交到官方的 QC 也是族繁不及备载,官方似乎有意的
操作数据库(RODBC)   odbcConnect(dsn, uid="", p
数据模式:mode函数显示任何对象的模式。常见的单个的
系统可承载海量并发,消息收发确认机制 保障消息必达 系统采用动态智
RabbitMQ与PHP(一) 项
Iease团队扩编预备中,盼望能有Ruby或者java工程师加盟。全职兼职都可以。有爱好的伴侣请与我接洽。 邮件:i
ruby 怎么设置装备摆设GTK2,求教指导下!
#include #include #include #include using namespace std; int main() {
标题如图所示: 有n盏灯,编号1~n。一开端灯都是关着的
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
成熟的消息收发确认机制,支持万人大群 支持开发自定义的消息sdk接口,扩展性超强 支持单/
1. 注意列表和集合的区别 set 列表表现形式: list_1
Ajax   Ajax即“Asynchronous Javascript And
大师好,我比来在做布谷鸟优
分辨提取A和B图像Harris角点,接下来须要对

[精彩分享] Java基础加强之集合篇(模块记忆、精要分析)

[复制链接]
发表于 2016-11-16 20:01:00 | 显示全部楼层 |阅读模式

千里之行,始于足下。把别人的变成自己,再把自己的分享给别人,这也是一次提升的过程。本文的目的是以一篇文章从整体把握集合体系又不失一些细节上的实现,高手路过。
集合的作用与特点

Java是一门面向对象语言,数据多了用对象封装存储(比如,人有姓名、年龄、性别等数据信息,我们就抽象一个Person对象来封装存储),对象多了又用什么来存储呢?集合,集合就是用来存储对象的。

集合的特点就是适用于存储对象而且可以存储不同类型的对象,集合的长度是可变的。

集合框架图

集合既然能存储不同类型的的对象,那么集合体系中肯定有不同类型的容器,集合中主要有List、Set、Map三种容器,每种容器的数据结构都不一样。集合体系的类、接口非常多,方便记忆,我们将下面这个相对简洁的集合框架图分为从5个模块来学习:
1.Collection集合
2.Map集合
3.集合遍历
4.集合比较
5.集合工具类

wps13E.tmp

wps13E.tmp

先对图做一下解析:
l 点线框表示接口
l 实现框表示具体的类
l 带有空心箭头的点线表示一个具体的类实现了一个接口
l 实心箭头表示某一个类可以生成箭头所指向的类
l 常用的容器用黑色粗线表示

Collection集合

Collection接口

Collection是一个接口,是高度抽象出来的集合,包含了集合的基本操作:添加、删除、清空、遍历、是否为空、获取大小等等。定义如下:
  1. public interface Collection<E> extends Iterable<E> {}
复制代码
Collection接口下主要有两个子接口:List和Set
List接口

List是Collection的一个子接口,List中的元素是有序的,可以重复,有索引
定义如下:
  1. public interface List<E> extends Collection<E> {}
复制代码

wps13F.tmp

wps13F.tmp


List是继承于Collection接口,它自然就包含了Collection中的全部函数接口,由于List有自己的特点(素是有序的,可以重复,有索引),因此List也有自己特有的一些操作,如上红色框框中的。List特有的操作主要是带有索引的操作和List自身的迭代器(如上图)。List接口的常用实现类有ArrayList和LinkedList

ArrayList

ArrayList是List接口的一个具体的实现类。ArrayList的底层数据结构是数组结构,相当于一个动态数组。ArrayList的特点是随机查询速度快、增删慢、线程不安全。ArrayList和Vector的区别是:Vector是线程安全的(synchronized实现)。定义如下:
  1. public class ArrayList<E> extends AbstractList<E>
  2.         implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  3. {}
复制代码
l ArrayList 继承AbstractList,AbstractList是对一些公有操作的再次抽象,抽出一些特性操作,如根据索引操作元素,生产迭代器等。
l ArrayList 实现了RandmoAccess接口,即提供了随机访问功能,可以通过元素的索引快速获取元素对象
l ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
l ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。

ArrayList源码分析总结(源码略,建议先整体认识再打开源码对着看):

l 可以通过构造函数指定ArrayList的容量大小,若不指定则默认是10
l 添加新元素时,容量不足以容纳全部元素时,会重新创建一个新的足以容纳全部元素的数组,把旧数组中的元素拷贝到新的数组中并返回新的数组。增量具体看源码。
l 添加的新元素添加到数组末尾。
l 查找、删除元素使用equals方法比较对象
l ArrayList的克隆函数,即是将全部元素克隆到一个数组中。
l ArrayList的序列化,即通过java.io.ObjectOutputStream将ArrayList的长度和每一个元素写到输出流中,或者通过java.io.ObjectInputStream从输入流中读出长度和每一个元素到一个数组中。
LinkedList

LinkedList是List接口的一个具体的实现类。LinkedList底层数据结构是双向的链表结构,可以当成堆栈或者队列来使用。LinkedList的特点是增删速度很快,顺序查询效率较高,随机查询稍慢。定义如下:
  1. public class LinkedList<E>
  2.     extends AbstractSequentialList<E>
  3.     implements List<E>, Deque<E>, Cloneable, java.io.Serializable
  4. {}
复制代码
l LinkedList 是继承AbstractSequentialList,AbstractSequentialList是AbstractList的一个子类。
l LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
l 同ArrayList,LinkedList同样支持克隆和序列化。

LinkedList 源码分析总结(源码略,建议先整体认识再打开源码对着看):

l LinkedList的本质是一个双向链表,各有一个头节点和尾节点,每一个节点都有个数据域、一个指向上一个节点的指针域、一个指向上下一个节点的指针域。
l 添加元素时,将元素添加到双向链表的末端。
l 查找、删除元素时,使用equals方法比较对象
l 根据索引查找元素时,若索引值index < 双向链表长度的1/2,则从表头往后查找,否则从表尾往前找
l LinkedList的克隆和序列化原理同ArrayList
l LinkedList实现了Deque,Deque接口定义了在双端队列两端访问元素的方法,每种方法都存在两种形式:一种是在操作失败时抛出异常,另一种是返回一个特殊值(null 或 false)。
l LinkedList有自己特有的迭代器ListIterator
l LinkedList不存在扩容增量的问题。
List应用举例

LinkedList实现堆栈和队列

LinkedList可以当成堆栈和队列使用,因为实现了Deque接口,Deque接口提供了一些了出栈入栈和出队入队的方法。

Java基础加强之集合篇(模块记忆、精要分析)

Java基础加强之集合篇(模块记忆、精要分析)

Java基础加强之集合篇(模块记忆、精要分析)

Java基础加强之集合篇(模块记忆、精要分析)
  1. class MyQueueStack {

  2.     private LinkedList link;
  3.    
  4.     MyQueueStack() {
  5.         link = new LinkedList();
  6.     }
  7.    
  8.     public void add(Object obj) {
  9.         link.addFirst(obj);
  10.     }
  11.    
  12.     public Object remove() {
  13.         //return link.removeLast();//队列
  14.         return link.removeFirst();//栈
  15.     }
  16.    
  17.     public boolean isNull() {
  18.         if(!link.isEmpty()) {
  19.             return false;
  20.         }
  21.         return true;
  22.     }

  23. }

  24. public class LinkedListQueueStack {
  25.     public static void main(String[] args) {
  26.         MyQueueStack q = new MyQueueStack();
  27.         q.add("001");
  28.         q.add("002");
  29.         q.add("003");
  30.         
  31.         while(!q.isNull())
  32.             System.out.println(q.remove());
  33.     }
  34. }

  35. 队列运行结果:
  36. 001
  37. 002
  38. 003
  39. 栈运行结果:
  40. 003
  41. 002
  42. 001
复制代码
View Code
ArrayList保证唯一性

List中的元素是可以重复的,可以通过重写equals方法实现唯一性。下面是ArrayList实现元素去重(依据equals)的一个例子。

<div class="cnblogs_code" >

Java基础加强之集合篇(模块记忆、精要分析)

Java基础加强之集合篇(模块记忆、精要分析)

Java基础加强之集合篇(模块记忆、精要分析)

Java基础加强之集合篇(模块记忆、精要分析)
<div id="cnblogs_code_open_2e864824-8f1e-49a8-b709-850badd16a55" class="cnblogs_code_hide">[code]class Teacher {    private String name;    private String age;        Teacher(String name,String age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public boolean equals(Object obj) {        if(!(obj instanceof Teacher)) {            return false;        }        Teacher p = (Teacher)obj;        System.out.println("调用equals比较" + p.name + "与" + this.name);        return p.name.equals(this.name) && p.age.equals(this.age);    }}public class ArrayListDuplicate {        public static void main(String[] args) {        ArrayList al = new ArrayList();        al.add(new Teacher("zhangsan","20"));        al.add(new Teacher("lingsi","21"));        al.add(new Teacher("wangwu","22"));        al.add(new Teacher("wangwu","22"));                print("-----------原始ArrayList----------");                Iterator it = al.iterator();        while(it.hasNext()) {            Teacher obj = (Teacher)it.next();            print(obj.getName() + "-" + obj.getAge());        }                print("-----------删除重复元素----------");        ArrayList al2 = removeSameObj(al);                Iterator it2 = al2.iterator();        while(it2.hasNext()) {            Teacher obj = (Teacher)it2.next();            print(obj.getName() + "-" + obj.getAge());        }                print("-----------删除lingsi元素----------");        al2.remove(new Teacher("lingsi","21"));                Iterator it3 = al2.iterator();        while(it3.hasNext()) {            Teacher obj = (Teacher)it3.next();            print(obj.getName() + "-" + obj.getAge());        }            }        public static ArrayList removeSameObj(ArrayList al) {        ArrayList newAl = new ArrayList();        Iterator it = al.iterator();        while(it.hasNext()) {            Object obj = it.next();            if(!newAl.contains(obj)) {                newAl.add(obj);            }        }        return newAl;    }        public static void print(Object obj) {        System.out.println(obj);    }    }运行结果:-----------原始ArrayList----------zhangsan-20lingsi-21wangwu-22



上一篇:深入了解try catch
下一篇:0017 Java学习笔记-集合-集合一般:HashSet和HashMap
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复

使用道具 举报

发表于 2017-3-4 00:04:34 | 显示全部楼层
一言难尽
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-3-8 11:20:33 | 显示全部楼层
。。。。
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-5-14 18:40:01 | 显示全部楼层
楼主加一个好友?
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-8-31 22:36:40 | 显示全部楼层
水水水水
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-9-22 06:01:24 | 显示全部楼层
嘿嘿嘿
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-9-26 05:40:38 | 显示全部楼层
默默看着你们吹牛逼
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-9-27 08:06:00 | 显示全部楼层
。。。。
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-10-12 23:25:29 | 显示全部楼层
顶一下
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发表于 2017-10-19 01:19:17 | 显示全部楼层
有多少新手
在线编程(http://www.anycodes.cn)&编程论坛(http://www.52exe.cn)感谢您的支持!
回复 支持 反对

使用道具 举报

发布主题 上个主题 下个主题 快速回复 返回列表 官方QQ群
在线客服
客 服 中 心
群 机 器 人
网站二维码
收 起 客 服

QQ|Archiver|手机版|小黑屋|Anycodes ( ICP14002806Anycodes在线编程

GMT+8, 2018-11-22 01:06 , Processed in 1.978751 second(s), 96 queries .

Powered by Anycodes

© 2001-2013 吉林市群龙科技有限公司 Inc.

快速回复 返回顶部 返回列表