March 2017

JavaScript数据结构——链表的实现

  前面楼主分别讨论了数据结构栈与队列的实现,当时所用的数据结构都是用的数组来进行实现,但是数组有的时候并不是最佳的数据结构,比如在数组中新增删除元素的时候需要将其他元素进行移动,而在javascript中使用spit()方法不需要访问其他元素。如果你在使用数组的时候发现很慢,就可以考虑使用链表。     链表的概念   链表是一种常见的数据结构。它是动态地进行存储分配的一种结构。链表有一个“头指针”变量,以head表示,它存放一个地址,指向一个元素。每个结点都使用一个对象的引用指标它的后继,指向另一个结点的引用叫做链。        数组元素依靠下标(位置)来进行引用,而链表元素则是靠相互之间的关系来进行引用。因此链表的插入效率很高,下图演示了链表结点d的插入过程:     删除过程:      基于对象的链表   我们定义2个类,Node类与LinkedList类,Node为结点数据,LinkedList保存操作链表的方法。   首先看Node类:   1 function Node(element){ 2 this.element = element; 3 this.next = null; 4 }… Read More »JavaScript数据结构——链表的实现

JavaScript数据结构——队列的实现

  前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现。     队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。   队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。插入操作也叫做入队,删除操作也叫做出队。入队操作在队尾插入新元素,出队操作删除队头的元素。下图演示了这两个操作。     队列的另外一项重要操作是读取队头的元素。这个操作叫做 peek() 。该操作返回队头元素,但不把它从队列中删除。除了读取队头元素,我们还想知道队列中存储了多少元素,可以使用 length 属性满足该需求;要想清空队列中的所有元素,可以使用 clear() 方法来实现。下表定义了队列的一些主要方法:  dataStorage Array 存储数据的底层数据结构 enqueue int 入队 dequeue fucntion 出队 front fucntion 返回队首元素 back… Read More »JavaScript数据结构——队列的实现

JavaScript数据结构——栈的实现

  栈(stack)是一种运算受限的线性表。栈内的元素只允许通过列表的一端访问,这一端被称为栈顶,相对地,把另一端称为栈底。装羽毛球的盒子是现实中常见的栈例子。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。   下图演示了入栈和出栈的过程:      我们知道pop()方法虽然可以访问栈顶元素,但是调用该方法后,栈顶元素被删除,而peek()方法返回栈顶元素,并不改变栈。push(),pop(),peek()是实现栈的三个主要方法,下表定义了栈的主要方法: 主要方法及属性 dataStorage Array 存储数据的底层数据结构 top int 记录栈顶元素位置 push fucntion 入栈方法 pop fucntion 出栈方法 peek fucntion 返回栈顶元素 length     fucntion   返回栈内元素个数 clear function  … Read More »JavaScript数据结构——栈的实现

多线程等待唤醒机制之生产消费者模式

  上篇楼主说明了多线程中死锁产生的原因并抛出问题——死锁的解放方案,那么在本篇文章,楼主将引用一个KFC生产汉堡,顾客购买汉堡的过程来说明死锁解决方案及多线程的等待唤醒机制。 简单地用一幅图来说明KFC生产汉堡,顾客来消费的过程: 场景分析: 资源类:Hamburger    设置汉堡数据:SetThread(生产者) 获取汉堡数据:GetThread(消费者) 测试类:HamburgerTest 不同种类的线程(生产者、消费者)针对同一资源(汉堡)的操作 当汉堡有存货的时候,汉堡师傅不再生产,顾客可消费;反之,汉堡师傅生产,顾客不可消费 是否有线程安全问题?当然。楼主在《线程安全问题》那篇文章给出了判定方式,在该场景全部满足。 代码构建:类里面的i属性是楼主为了效果好一些特意加的,与本文要说明的问题无关;   首先是资源类Hamburger.java,楼主这里为了模拟只简单的构造了3个字段,其中flag用来表示资源是否有数据。 1 package com.jon.hamburger; 2 3 public class Hamburger { 4 private String name;//汉堡名称… Read More »多线程等待唤醒机制之生产消费者模式

多线程之死锁产生

本篇楼主接着上篇多线程的安全问题继续讨论多线程的死锁问题。 我们可以构造这样一种场景:传统(理想)情况下,楼主吃饭必须用两支筷子,而楼主老板(美国人)吃饭必须要用一刀,一叉;现在,楼主手上有一支筷子和一把刀,老板手上有一支筷子和一把叉;当我们都在互相等待对方把餐具给我们时,出现相互等待的现象,都吃不了饭,从而形成死锁。 所以上篇所说到的解决多线程同步的安全问题又衍生出了:如果出现同步嵌套,就容易产生死锁的问题。上面的场景我们先用代码来实现看一看。 构建MyLock类,创建楼主,老板两个锁对象: 1 package com.jon.dielock; 2 3 public class MyLock{ 4 //创建2把所对象 5 public static final Object objA = new Object(); 6 public… Read More »多线程之死锁产生

线程安全问题

本文楼主主要以用户在售票厅购买车票为背景进行多线程的实现。假设A市到B市的车票共50张,共有3个售票窗口在进行售票,使用多线程来模拟理想情况下的用户购票: 实现Runnable的Ticket类: 1 package com.jon.thread; 2 3 public class TicketSell implements Runnable { 4 private int tickets = 50;//设置车票数量 5 @Override 6 public void run()… Read More »线程安全问题

Bean复制

有的时候我们需要将一个bean的属性赋值到另一个bean的属性中,比如用户提交过来的表单bean需要将该bean中的属性值赋值到对应的数据库bean,我们通常会以这样的方式做: 1 User user = new User("1", "Jon_China", "123456", "1992-11-17", "127.0.0.1"); 2 TargetUser target = new TargetUser(); 3 target.setId(user.getId()); 4 target.setUserName(user.getUserName()); 5 target.setPassword(user.getPassword()); 当bean的属性过多时是不是感觉“嘿打脑壳”。不要紧,Apache提供bean的copy工具BeanUtil.  当然是用也是比较简单的,楼主一步一步说明:… Read More »Bean复制