自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

FREEDOM

hello world

  • 博客(36)
  • 资源 (29)
  • 收藏
  • 关注

原创 关于spring bean 生命周期代码详解-产生到消亡

bean生命周期顺序关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作第二种是:通过 在xml中定义init-method 和 destory-method方法第三种是: 通过bean实现InitializingBean和 DisposableBean接口初始化顺序:value–>postConstruct–>Initializing...

2020-06-27 10:41:14 659

原创 spring 启动之全过程 源码解析

主类代码public class BeanLifeCycle { public static void main(String[] args) { System.out.println("现在开始初始化容器"); ApplicationContext factory = new ClassPathXmlApplicationContext("test/beans.xml"); System.out.println("容器初始化成功"...

2020-06-27 10:34:43 669

原创 mybatis 初始化,与生命周期,mapper映射创建,代理创建,curd执行过程,拦截器原理

mybatis 核心对象从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个:Configuration 初始化基础配置,比如MyBatis的别名等,一些重要的类型对象,如,插件拦截器,mapper方法元数据,映射器,ObjectFactory和typeHandler对象,MyBatis所有的配置信息都维持在Configuration对象之中SqlSessionFactorySqlSession工厂SqlSession 作为MyBatis工作的主要顶层API,表示和数..

2020-06-25 20:36:14 599

原创 有向无环图调度任务框架airflow安装部署测试

安装最新版pip3 install apache-airflow==1.10.10先初始化airflow initdb此时会在当前用户的根目录下生成一个airflow目录,如root用户下的 /root/airflow可以使用find / -name airflow.cfg查询位置。此时使用的sqllite数据库修改为使用mysql库Airflow的配置文件airflow.cfg配置再次初始化airflow initdb可看到...

2020-06-19 08:56:08 610

转载 关于BIO同步阻塞,NIO同步非阻塞,AIO异步非阻塞,多路复用

前言使用异步,非阻塞。是为了减少线程的开销(因为正常情况下一个IO如一个socket客户端的连接,server需要单独开一个线程,传统的socket是同步阻塞的)(1)同步/异步 :内核缓冲区 向用户缓冲区 态写数据的过程,如果这个过程 中, 用户线程不阻塞就是异步,阻塞就是同步。(2)阻塞/非阻塞 : 用户线程 是否一直等待内核缓冲区有数据,有数据才会返回的为阻塞。不管有没有数据都返回的叫做非阻塞。1.1. JavaIO读写原理无论是Socket的读写还是文件的读写,在Ja....

2020-06-16 16:05:13 919

原创 kafka 实现原理分析,包括:名词解释,与zookeeper关系、controller选举、leader选举、消息日志文件,消息查询定位

名词解释 1.brokerKafka单个节点称为broker,一个Kafka服务就是一个broker,多个broker可以组成一个Kafka集群. 2.topic (主题)数据存储在(log.dir配置的目录下) topic相当于传统消息系统MQ中的一个队列queue,producer端发送的message必须指定是发送到哪个topic上.在一个大型的应用系统中, 可以根据功能的不同,区分不同的topic(订单的topic,登录的topic,金额的topic等等) 3.par..

2020-06-15 15:58:05 753

原创 mysql 分库分表分区总结

Mysql目录结构一个库一个目录MyISAM引擎InnoDB引擎分库分表分区总结对于分区分表都可以进行横向(按表字段分),纵向分(按数据行分),此文暂时值考虑横向分。对于分库:分库分区说明分区和分表类似,把原本的一个数据量很大的表,根据规则分成很多块。这些块可以跨磁盘分布。突破单磁盘IO的限制。好处分区为了突破IO瓶颈,可以把索引及数据文件放在不同磁盘。 可以根据自定义的分区方式 优化查询,比如根据分区列查询,就会定位到某个分...

2020-06-14 16:06:40 2970

原创 mysql 索引,以及sql优化总结

sql问题where执行顺序多个表联合查询时where的顺序是从左到右,对于单个表的条件,mysql会根据sql条件进行优化,比如先查询索引的条件。join的问题小表驱动大表,减少遍历次数小表(筛选条件后) left join 大表(筛选条件后)。count的问题count(1),count(*) 统计所有行,包含值为null的count(字段) 值统计不为null的。具体来说 count(1)和count(*) 没有太大区别。如果表没有主键,那么count.

2020-06-14 12:34:26 827 1

原创 mysql 7种日志及相关配置

MySQL中有以下日志文件,分别是:  1:重做日志(redo log)  2:回滚日志(undo log)  3:二进制日志(binlog)  4:错误日志(errorlog)  5:慢查询日志(slow query log)  6:一般查询日志(general log)  7:中继日志(relay log)。其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。一、重做日志(redo

2020-06-14 11:09:09 1585 2

转载 java的对象物理结构,以及对象头中MarkWord与锁的关系

关于锁升级可参看https://blog.csdn.net/u013378306/article/details/106538659java 对象头我们都知道,Java对象存储在堆(Heap)内存。那么一个Java对象到底包含什么呢?概括起来分为对象头、对象体和对齐字节。如下图所示:对象的几个部分的作用:1.对象头中的Mark Word(标记字)主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode;2.Klass Word是一个指向方法区中Class信.

2020-06-13 17:24:37 2319 1

原创 zookeeper 集群 和 kafka集群 配置简述

前言使用官网下载下来的kafka.tgz包,里面包含zookeeper解压后复制三分kafka,注意目录不要太深否则会报错。也是搞笑了啊。。。。。zookeeper集群在zookeeper_data/data下创建三个目录,zk1,zk2,zk3。并分别在里面创建对应文件myid。内容分别是1,2,3。用于给zookeeper设置唯一serveId。分别创建日志目录,zk1,zk2,zk3修改 zookeeper.properties配置文件#数据存放

2020-06-12 18:56:16 1255

原创 zookeeper 半数选举过程

前言在讲解流程之前,先说明一下选举流程中涉及到的角色,以及涉及到的关键类和变量(源码参考版本:3.4.9):要半数以上的机器投票自己,自己才能是leader。若是4台则必须 是3台投自己。怎么算机器总数,是在配置文件中配置的节点数(即使其中某几个没有启动)角色:1.LOOKING:竞选2.OBSERVING:观察3.FOLLOWING:跟随者4.LEADER:领导者投票信息:1.log...

2020-06-12 18:21:44 1546

转载 mysql 物理存储 数据页

MySQL Innodb 数据页结构分析页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位。常见的页类型有数据页、Undo 页、系统页、事务数据页等,本文主要分析的是数据页。默认的页大小为 16KB,每个页中至少存储有 2 条或以上的行记录,本文主要分析的是页与行记录的数据结构,有关索引和 B-tree 的部分在后续文章中介绍。下图是 Innodb 逻辑存储结构图,从上往下依次为:Tablespace、Segment、Extent、Page 以及 Row。本文关注的重点是 Page

2020-06-12 10:59:57 872

原创 mysql redolog undolog binlog

innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。1.redo

2020-06-12 10:58:36 2215 1

原创 AQS、ReentrantLock、ReentrantReadWriteLock.共享/独占 公平/非公平

前提一、AQSAbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步组建的基础框架。该类主要包括:1、模式,分为共享和独占。2、volatile intstate,用来表示锁的状态。3、FIFO双向队列,用来维护等待获取锁的线程。AQS部分代码及说明如下:public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSync...

2020-06-11 16:35:46 610

原创 原码反码补码 与 位移运算总结(Java)

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理以下代码基于javajava 中数字做位运算时,都会补全32位(Short也是),如果强转为Long类型则会用64位。以下以-4,4为例 ,长度以32位为准。关于:原码,反码,补码(有符号位)java 输出-4或4的补码。正数4的原码=0(28个0)100正数的 原码=反码=补码负数注意:转换过程中:最高位符号位始终位置不变值也不变。反.

2020-06-10 11:18:22 403

转载 Java8 之 Stream

相信Java8的Stream 大家都已听说过了,但是可能大家不会用或者用的不熟,笔者将在《玩转Java8Stream》系列文章中带大家从零开始使用,循序渐进,带你走向Stream的巅峰。操作符什么是操作符呢?操作符就是对数据进行的一种处理工作,一道加工程序;就好像工厂的工人对流水线上的产品进行一道加工程序一样。image-20190124191452884Stream的操作符大体上分为两种:中间操作符和终止操作符中间操作符对于数据流来说,中间操作符在执行制定处理程序后,数据流依然

2020-06-05 11:09:15 264

转载 Java8之Consumer、Supplier、Predicate和Function

今天我们还讲讲Consumer、Supplier、Predicate、Function这几个接口的用法,在 Java8 的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声的。为什么这么说呢?这几个接口都在java.util.function包下的,分别是Consumer(消费型)、supplier(供给型)、predicate(谓词型)、function(功能性),相信有了后面的解释,你应该非常清楚这个接口的功能了。那么,下面,我们从具体的应用场景来讲讲这个接口的用法!1 C..

2020-06-05 10:10:26 649

转载 算法-8种排序算法

排序算法总结排序算法 平均时间复杂度 冒泡排序 O(n2) 选择排序 O(n2) 插入排序 O(n2) 希尔排序 O(n1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*logN) 基数排序 O(d(n+r)) 一. 冒泡排序(BubbleSort) 基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。 过程: 比较相邻的两个数据,如果第二个数小,就交换位

2020-06-05 09:42:47 335

原创 mysql 种隔离级别 以及每种级别对应的问题

mysql 4种隔离级别(1)未提交读(2)提交读(3)可重复读(4)串行化(1)幻读:t1查询出两天记录,此时t2插入一条id=3的记录然后commit,t1此时插入id=3的记录 报主键错误,对与delete和insert。(2)不可重复读:t1查出id=1的记录name=a,此时t2修改id=1的name=b并commit。此时t1再次查询出id=1的name=b,导致两次查询出的数据不同。(3)脏读:脏读就是指当事务A对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务B也访

2020-06-04 10:00:27 345

转载 布隆过滤器

布隆过滤器。选择多个哈希函数 对一个字符串xxx进行映射到数组的不同位置。如果这些位置下标都有值(不为空),则说明这个字符串在数组中存在的几率越大。如果用这个几个哈希函数算出的位置 其中有一个为空,则一定能说明此字符串肯定不存在什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,.

2020-06-04 10:00:13 377

原创 java锁的到底是锁的什么??

锁作用的对象类代码块锁对多个线程使用的多个此类A的代码加锁,即使多个线程多个对象也 会只有一个线程进入到此代码块,与对象个数,线程个数无关。实现方式(1)类代码块 synchronized(A.class){}(2)静态lock对象 static Lock lock=new ReetrantLock();类对象锁对多个线程使用的同一个类A对象加锁,与线程个数无关,多个线程中必须使用同一个类A对象,才会同步线程。实现方式(1)对象代码块 synchronized(this.

2020-06-04 10:00:00 1978

转载 java 锁的类型

1. Java锁的种类  在笔者面试过程时,经常会被问到各种各样的锁,如乐观锁、读写锁等等,非常繁多,在此做一个总结。介绍的内容如下:乐观锁/悲观锁 独享锁/共享锁 互斥锁/读写锁 可重入锁 公平锁/非公平锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁  以上是一些锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。1.1 乐观锁/悲观锁  乐观锁与悲观锁并不是特指某两种类型的锁,是人们定义出来的概念或思想,主

2020-06-04 09:59:37 221

转载 java 多线程 CountDownLatch、CyclicBarrier、Semaphore

 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。  以下是本文目录大纲:  一.CountDownLatch用法  二.CyclicBarrier用法  三.Semaphore用法  若有不正之处请多多谅解,并欢迎批评指正。  请尊重作者劳动成果,转载请标明原文链接:  http://www.cnblogs.com/dolphin05

2020-06-04 09:59:26 221

转载 Java并发之AQS与自旋锁(利用CAS实现)

一、概述  谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!  类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。  以下是本文的目录大纲: 概述 框架 源码详解 简单应用   若有不正之处,请谅解和批评指正,不胜感激。 

2020-06-04 09:59:08 2393 2

原创 java synchronized原理与 为何锁升级及过程

关于锁升级java1.6之前Syntronized 没有锁升级概念,只有重量锁:即用户态和内核态的上下文切换 会比较浪费时间。java1.6之后,Syntronized关键字 开始有锁升级的概念,即偏向锁,轻量级锁,重量级锁。注意CAS不是自旋锁,(CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。)自旋锁是利用CAS做多次循环判断。所谓的锁升级,其实就是从偏向锁à轻量级锁(自旋锁)à重量级锁,之前一..

2020-06-04 09:57:17 1301

原创 linux 文件系统与磁盘

总结文件系统(1)磁道(2)扇区:一个磁道上分多个扇区,目前有 512bytes 和 4k 两种格式(3)分区:把多个扇区组合 做分区,每种分区类型下的分区表决定最大支持的磁盘容量,如MBR,GPT分区(4)文件系统:对每个分区格式化成不同的文件系统,如EXT2(5)inode /block/superblock:文件系统通常将文件数据和文件属性 这两部分数据放置到不同的区块,权限与属性放置到 inode 中,实际数据放置到 data block 区块中。有一块超级区块(superblock)会记录整个

2020-06-03 15:14:24 332

原创 mysql数据库为什么使用B+树

首先要了解mysql的io过程前面提到了访问磁盘,那么这里先简单介绍一下磁盘IO和预读,磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为寻道时间、旋转延迟、传输时间三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2 = 4.17ms;传输时间指的是从磁盘读出或将数据写入磁盘的时间,一般在零点几毫秒,相对于前两个时间可以...

2020-06-03 15:02:43 286

转载 tcp三次握手及四次挥手

一、TCP connection客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西;由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,http请求是在这个连接的基础上发送的;在一个TCP连接上是可以发送多个http请求的,不同的版本这个模式不一样。在HTTP/1.0中这个TCP连接是在http请求创建的时候同步创建的,http请求发送到

2020-06-03 14:46:35 211

原创 二叉搜索树、平衡二叉树、B树、B+树、B*树

二叉查找树二叉查找树,由于不平衡,如果连续插入的数据是有顺序的、会导致如下图B的所示,此时搜索会退化到O(N)  二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 任意节点的左、右子树也分别为二叉查找树;(4) 没有键值相等的节点。  如上图所示,是不同形态的二叉查

2020-06-03 14:40:05 372

转载 一致性哈希原理与应用

分布式系统中对象与节点的映射关系,传统方案是使用对象的哈希值,对节点个数取模,再映射到相应编号的节点,这种方案在节点个数变动时,绝大多数对象的映射关系会失效而需要迁移;而一致性哈希算法中,当节点个数变动时,映射关系失效的对象非常少,迁移成本也非常小。本文总结了一致性哈希的算法原理和Java实现,并列举了其应用。作者:王克锋出处:https://kefeng.wang/2018/08/10/consistent-hashing/版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。1 概述1

2020-06-03 14:28:36 455

转载 Mysql的四个隔离级别 与mvcc(2)

一、Mysql的四个隔离级别预备工作:先创建一个test数据库及account表,create database test;use test;create table account(id int not null,balance float not null, PRIMARY KEY ( id))向account中插入两条测试数据INSERT INTO table(id,balance)VALUES (1,1000);INSERT INTO table(i..

2020-06-03 14:23:31 246

原创 mysql隔离级别与mvcc 关系的理解

MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。主要通过以下两个方式组合 来实现隔离级别的版本链:用于存储历史已经完成的事务版本。readview:主要就是有个列表来存储我们系统中当前活跃着的读写事务,也就是begin了还未提交的事务在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔

2020-06-03 14:20:55 507

转载 Redis的五大数据类型的底层实现

1、简介Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。redisObject结构typedef struct redisObject .

2020-06-03 14:08:49 185

原创 mysql索引底层实现,MyISAM ,InnoDB

目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B+Tree(B+树)作为索引结构。B+Tree是数据库系统实现索引的首选数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。MyISAM索引实现MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:image.png这里设表一共有三列,假设我 在 My...

2020-06-03 14:06:37 343

原创 Java分布式锁的几种实现

无论你身处一个什么样的公司,最开始的工作可能都需要从最简单的做起。不要提阿里和腾讯的业务场景 qps 如何大,因为在这样的大场景中你未必能亲自参与项目,亲自参与项目未必能是核心的设计者,是核心的设计者未必能独自设计。希望大家能根据自己公司业务场景,选择适合自己项目的方案。

2020-06-03 14:03:05 1215

S3 java sdk 文档-使用手册.pdf

AmazonS3 sdk中文文档

2021-11-03

图像标注-labelImg_windows_v1.7

图像标注-labelImg_windows_v1.7 图像标注-labelImg_windows_v1.7 图像标注-labelImg_windows_v1.7

2020-10-25

xgboost.pmml

sklearn 鸢尾花训练后的pmml模型文件 ,sklearn 鸢尾花训练后的pmml模型文件

2020-10-23

iris.csv

iris.csv

2020-10-23

汉语 词频 标注 语料

汉语 词频 标注 语料 汉语 词频 标注 语料 汉语 词频 标注 语料

2018-07-20

centos win7双系统安装,在win7已经安装的基础上

centos win7双系统安装,在win7已经安装的基础上。

2018-07-20

nlp工具 word2vec nltk textblob crf++ 机器人 中文翻译 繁体转简体 关键词 主题 命名体识别 分词 聚类 词性标注 词向量

本资源属于代码类,是一些nlp工具的使用 nlp 工具 word2vec nltk textblob crf++ (1)机器人 (2)中文翻译,及繁体转简体 (3)关键词提取,主题提取,摘要提取 (4)命名体识别 (5)分词 (6)情感分析,正负类分析 (7)近义词,同义词,句子相似性 (8)聚类,监督,无监督 (9)词性标注 (10)词向量提取

2018-07-20

pcm 静默分析

pcm 静默分析pcm 静默分析pcm 静默分析pcm 静默分析pcm 静默分析pcm 静默分析pcm 静默分析

2017-12-27

nltk python 中文版 pdf

nltk python 中文版 pdf

2017-02-17

CRF++ 训练中文分词

CRF++ 训练中文分词,文件后缀有3标示3列的语料,文件后缀有2,表示2列的语料训练

2017-02-08

springboot

springboot-mybatis demo

2017-01-23

CRF++ 0.58.tar.gz源文件for linux和.zip for windows

CRF++ 目前最新版,包括CRF++ 0.58.tar.gz源文件for linux和.zip for windows 另外,包括一个介绍使用的下载网页文件。

2017-01-18

angular 路由,传值,http

angular 路由,传值,http

2016-11-03

opencv 人脸识别 代码

opencv 人脸识别

2016-10-18

qt 页面切换 与传值

qt 页面切换 与传值

2016-09-05

Qt 子窗口父窗口切换,窗口间传值

Qt 子窗口父窗口切换,窗口间传值

2016-09-04

spring-mvc-jasperReports

spring-mvc-jasperReports

2016-09-03

jasperReports spring mvc 整合代码

2016-09-02

python2.7.6+python for eclipse

python2.7.6+python for eclipse

2016-01-03

MyBatis Generator.

MyBatis Generator

2015-12-20

hibernate3-log4j-slf4j所有包

hibernate3 日志配置所需的三个包 log4j-slf4j

2015-10-07

jstl包

jstl包

2015-09-10

mina2 cs 客户端服务器通信 已经实现完整通信代码

mina2 cs 客户端服务器通信 已经实现完整通信代码

2015-05-31

网页,html5,canvas,js 动态绘制柱形图

网页,html5,canvas,js 动态绘制柱形图

2015-05-31

微信网站模板

微信网站模板

2015-03-04

java二维码制作源码

二维码二维码二维码erweima

2015-03-04

phpmyadmin修改密码

phpmyadmin修改密码,自己总结的,很好用

2014-03-31

俄罗斯方块

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; import javax.swing.Timer; public class Tetris extends JFrame { public Tetris() { Tetrisblok a = new Tetrisblok(); addKeyListener(a); add(a); } public static void main(String[] args) { Tetris frame = new Tetris(); JMenuBar menu = new JMenuBar(); frame.setJMenuBar(menu); JMenu game = new JMenu("游戏"); JMenuItem newgame = game.add("新游戏"); JMenuItem pause = game.add("暂停"); JMenuItem goon = game.add("继续"); JMenuItem exit = game.add("退出"); JMenu help = new JMenu("帮助"); JMenuItem about = help.add("关于"); menu.add(game); menu.add(help); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(220, 275); frame.setTitle("Tetris内测版"); // frame.setUndecorated(true); frame.setVisible(true); frame.setResizable(false); } } // 创建一个俄罗斯方块类 class Tetrisblok extends JPanel implements KeyListener { // blockType 代表方块类型 // turnState代表方块状态 private int blockType; private int score = 0; private int turnState; private int x; private int y; private int i = 0; int j = 0; int flag = 0; // 定义已经放下的方块x=0-11,y=0-21; int[][] map = new int[13][23]; // 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三四组为 方块矩阵 private final int shapes[][][] = new int[][][] { // i { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } }, // s { { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }, // z { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } }, // j { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // o { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // l { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // t { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } }; // 生成新方块的方法 public void newblock() { blockType = (int) (Math.random() * 1000) % 7; turnState = (int) (Math.random() * 1000) % 4; x = 4; y = 0; if (gameover(x, y) == 1) { newmap(); drawwall(); score = 0; JOptionPane.showMessageDialog(null, "GAME OVER"); } } // 画围墙 public void drawwall() { for (i = 0; i < 12; i++) { map[i][21] = 2; } for (j = 0; j < 22; j++) { map[11][j] = 2; map[0][j] = 2; } } // 初始化地图 public void newmap() { for (i = 0; i < 12; i++) { for (j = 0; j < 22; j++) { map[i][j] = 0; } } } // 初始化构造方法 Tetrisblok() { newblock(); newmap(); drawwall(); Timer timer = new Timer(1000, new TimerListener()); timer.start(); } // 旋转的方法 public void turn() { int tempturnState = turnState; turnState = (turnState + 1) % 4; if (blow(x, y, blockType, turnState) == 1) { } if (blow(x, y, blockType, turnState) == 0) { turnState = tempturnState; } repaint(); } // 左移的方法 public void left() { if (blow(x - 1, y, blockType, turnState) == 1) { x = x - 1; } ; repaint(); } // 右移的方法 public void right() { if (blow(x + 1, y, blockType, turnState) == 1) { x = x + 1; } ; repaint(); } // 下落的方法 public void down() { if (blow(x, y + 1, blockType, turnState) == 1) { y = y + 1; delline(); } ; if (blow(x, y + 1, blockType, turnState) == 0) { add(x, y, blockType, turnState); newblock(); delline(); } ; repaint(); } // 是否合法的方法 public int blow(int x, int y, int blockType, int turnState) { for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { if (((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x + b + 1][y + a] == 1)) || ((shapes[blockType][turnState][a * 4 + b] == 1) && (map[x + b + 1][y + a] == 2))) { return 0; } } } return 1; } // 消行的方法 public void delline() { int c = 0; for (int b = 0; b < 22; b++) { for (int a = 0; a < 12; a++) { if (map[a][b] == 1) { c = c + 1; if (c == 10) { score += 10; for (int d = b; d > 0; d--) { for (int e = 0; e < 11; e++) { map[e][d] = map[e][d - 1]; } } } } } c = 0; } } // 判断你挂的方法 public int gameover(int x, int y) { if (blow(x, y, blockType, turnState) == 0) { return 1; } return 0; } // 把当前添加map public void add(int x, int y, int blockType, int turnState) { int j = 0; for (int a = 0; a < 4; a++) { for (int b = 0; b < 4; b++) { if (map[x + b + 1][y + a] == 0) { map[x + b + 1][y + a] = shapes[blockType][turnState][j]; } ; j++; } } } // 画方块的的方法 public void paintComponent(Graphics g) { super.paintComponent(g); // 画当前方块 for (j = 0; j < 16; j++) { if (shapes[blockType][turnState][j] == 1) { g.fillRect((j % 4 + x + 1) * 10, (j / 4 + y) * 10, 10, 10); } } // 画已经固定的方块 for (j = 0; j < 22; j++) { for (i = 0; i < 12; i++) { if (map[i][j] == 1) { g.fillRect(i * 10, j * 10, 10, 10); } if (map[i][j] == 2) { g.drawRect(i * 10, j * 10, 10, 10); } } } g.drawString("score=" + score, 125, 10); g.drawString("抵制不良游戏,", 125, 50); g.drawString("拒绝盗版游戏。", 125, 70); g.drawString("注意自我保护,", 125, 90); g.drawString("谨防受骗上当。", 125, 110); g.drawString("适度游戏益脑,", 125, 130); g.drawString("沉迷游戏伤身。", 125, 150); g.drawString("合理安排时间,", 125, 170); g.drawString("享受健康生活。", 125, 190); } // 键盘监听 public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_DOWN: down(); break; case KeyEvent.VK_UP: turn(); break; case KeyEvent.VK_RIGHT: right(); break; case KeyEvent.VK_LEFT: left(); break; } } // 无用 public void keyReleased(KeyEvent e) { } // 无用 public void keyTyped(KeyEvent e) { } // 定时器监听 class TimerListener implements ActionListener { public void actionPerformed(ActionEvent e) { repaint(); if (blow(x, y + 1, blockType, turnState) == 1) { y = y + 1; delline(); } ; if (blow(x, y + 1, blockType, turnState) == 0) { if (flag == 1) { add(x, y, blockType, turnState); delline(); newblock(); flag = 0; } flag = 1; } ; } } }

2014-01-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除