- 博客(52)
- 收藏
- 关注
原创 源码阅读:简单实现ArrayList中的主要方法
ArrayList就是传说中的动态数组,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素、灵活的设置数组的大小两个字段:数组容器与元素的个数size /** * 字段:数组作为容器,与尺寸 */ Object[] elementData; int size;//区分数组中的属性length(容器的容量)构造方法:(指定元素数组初始化容
2017-02-18 22:42:38
302
原创 完全理解递归与分治:3种方法求数组最大值为例子
递归,分治是一种常见迭代方法。在二叉树遍历,线性表中遍历十分常见。递归、分治最核心的思想是 递推。 从外层–》内层,压栈,使得计算规模不断减小。 从内层–》外层,出栈,需要把计算结果传递给外层,做计算。编写代码请问下自己下面几个问题: 1、传入的参数是什么,是作为缓冲来接收吗, 2.、返回的结果是什么,这个结果需要带入到外层递推公式中。 3、外层函数主要包括: 递
2016-11-17 22:44:56
1483
原创 IntelliJ IDEA & Eclipse等web项目的乱码终极解决方法
关于IDE乱码基本上从MyClipse到如今的intellij IDEA都经常遇到。也踩了许多坑。网上各种答案也都尝试,但是都没有一个完全的解决放啊按。最近又遇到到了,于是做以下总结:关于乱码,是编码格式没有统一:在web项目中,主要编码格式改变的地方有:1,虚拟机加载文件编码,2,IDE的保存文件编码3,html文件,xml文件等外部保存的编码,4,web服务器入tomcat的编码现在知
2016-11-08 17:02:39
10037
原创 点赞实现[多对多的redis实现]
点赞实现:思路:每个question对应一个set();调用jedis.sadd(key,value); 由于question–赞userId是多对多的数据表结构,所以set结构扩展:每个文章有不同的标签,也可以用这种数据结构实现:业务层:@Serveice//用户userId,对某个评论或者回答进行了点赞public long like(int userId,int entityType,in
2016-10-18 16:50:58
3423
原创 异步实现消息队列
为什么要使用队列,什么情况下才会使用队列? 那些实时性要求不高,且比较耗时的任务,是队列的最佳应用场景。比如说我在某网站注册一个账号,当我的信息入库注册成功后,网站需要发送一封激活邮件,让我激活账号,而这个发邮件的操作并不是需要实时响应的,没有必要卡在那个注册界面,等待邮件发送成功,再说发送邮件本来就是一个耗时的操作(需要调用第三方smtp服务器),此时,选择消息队列去处理。 就
2016-10-18 16:28:29
827
原创 生产者消费者模式
该模式中含有的类及其相互关系:1、生产物品的类,该应该有自己的标示属性:class SteamBread { int id;//馒头编号 SteamBread(int id) { this.id = id; } public String toString() { return "steamBread:" + id; }}2、放东西的容
2016-10-18 09:07:20
269
原创 java设计模式:适配器模式
基本思想:类A 想要使用 类B中的一些方法。那么就可以用多个继承或者实现。关键步骤:[I]Target target=new Adapter();class Adapter extends Adaptee implements Target;这里Adapter具备了Adaptee和Target两种类的属性由于java是单根继承,所以只能用实现获取两个父类(接口)中的方法。模式中的角色: 1 目
2016-10-17 16:02:17
223
原创 常见SQL语句总结
由于常见的数据库创建,删除数据库;数据表的创建等操作都是可以在workbench中GUI实现,所以这里主要讲数据表的以下操作:1、数据表的查询 SELECT:SELECT column_name,column_nameFROM table_name[WHERE Clause][LIMIT N][OFFSET M ]常见的运用场景:比如:SELECT id,from_id,to_id,con
2016-10-11 16:13:15
277
原创 拦截器实现未登录跳转
下面用实际登陆跳转举例1、写自己的拦截器implements HandlerInterceptor,实现跳转去执行拦截内容并传,执行拦截之后的URI@Componentpublic class LoginRequiredInterceptor implements HandlerInterceptor {@AutowiredHostHolder hostHolder;//目前页面是需要登陆,如
2016-10-09 21:22:58
6758
1
原创 HandlerInterceptor拦截器
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAn
2016-10-09 09:29:44
433
原创 用HandlerInterceptor实现登陆状态确定
主要目的是:确定是用户是否登陆,通过每次请求检测ticket时候存在来实现。基本原理:注册拦截器+实现拦截器+设置线程副本变量一、注册拦截器:extends WebMvcConfigurerAdapter@Componentpublic class WendaWebConfiguration extends WebMvcConfigurerAdapter {@AutowiredPassport
2016-10-09 09:17:34
3253
原创 注册模块
注册模块基本原理:从/reglogin页面中提交username和password,此页面的form表单action–》/reg进入controller中方法,requestMapping(“/reg”),注册,addUser,和response.set(cookie),并model.addAtri(“msg”,msg). 最后跳转到/(主页)。这里设计3个urI,提交前:/reglogin,提交
2016-10-08 16:32:49
770
原创 StringUtil类的常见方法
org.apache.commons.lang.StringUtils中方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理,例如,如果输入为null则返回也是null等,具体可以查看源代码)。 除了构造器,String
2016-10-05 10:31:06
472
原创 velcocity中toolbox中的日期格式化工具
经常会遇到时间在velocity中显示,默认并不是一个规范的时间: Thu Oct 13 20:35:55 CST 2016现在需要格式化成: ‘yyyy-MM-dd HH:mm:ss’需要做以下步骤:1在resource的目录中设置: toolbox.xml:代码如下:<toolbox><tool> <key>date</key> <scope>application</s
2016-10-04 21:32:11
369
原创 显示单元的封装类:ViewOfObject
ViewOfObject常见的运用是在:在网页的显示层中一个显示单元,可能由多个类的属性组成,这里采用ViewOfObject(map<String,Object>):把这些类用Object的map容器封装成一起。这里的Object,可以接受多中类型。这里运用到了父类声明可以接受子类的对象–即多态以下为示例代码:1、对象的定义:public class ViewOfObject { Hash
2016-10-04 21:04:45
269
原创 MVC中三层规范写法示例
经常会在web项目中用到MVC模式的写法C:控制层Controller,负责对请求的url分发到不同的网址,处理请求的入口。 M:规范数据数据成Bean,并负责调用数据库 V:只负责从数据库获取数据,并显示。此三层的设计充分得将数据显示与数据操作很好的分离开了,是一种极佳的面向对象的设计思路。下面把常见的MVC模式的规范写法总结如下:model:public class Question {
2016-10-04 20:54:50
3268
原创 MyBatis中动态SQL语句的书写
官网的动态SQL语句参考 动态SQL语句的书写 这里面的Dao.xml比如和java包中的对应的Dao路径一致:主要的步骤是: 1、在SQLWorkbench中创建SQL语句,并复制到SpringBoot的项目resource目录中DROP TABLE IF EXISTS question;CREATE TABLE `wenda2`.`question` ( `id` INT NOT N
2016-10-04 17:09:43
1974
原创 Junit中的Assert常见方法
在静态类junit.framework.Assert或者静态类org.junit.Assert中存在以下几个方法1.assertEquals(a,b)方法,用来查看对象中存的值是否是期待的值,与字符串比较中使用的equals()方法类似;2.assertFalse()和assertTrue()方法,用来查看变量是是否为false或true,如果assertFalse()查看的变量的值是false则测
2016-10-04 15:53:05
990
原创 【2】SpringBoot的MyBatis配置
SpringBoot的MyBatis配置基本上和JBDC原理一致。 传送门:JDBC的基本原理 下面演示一个例子。1、在pom.xml中加载驱动包:mysql-connector-java和Mybatis包:mybatis-spring-boot-starte此项的目的在于在pom中注册包: <dependency> <groupId>org.mybatis
2016-10-04 15:43:44
324
原创 JDBC连接数据的基本原理
JDBC连接数据的基本原理首先我们来看一下JDBC连接数据的基本原理:(分为7个步骤)1,加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机)2,提供JDBC连接的URL: •连接URL定义了连接数据库时的协议、子协议、数据源标识。 •书写形式:协议:子协议:数据源标识 协议:在JDBC中总是以j
2016-10-04 15:20:26
555
原创 (BFS)广度优先搜索例子:迷宫,寻找连块数
//广度优先搜索主要分成以下几块0、节点node结构体;1、matrix[][],原始矩阵2、增量数组X[],Y[] 实现该坐标的左右上下的更新坐标3、判断时候下一个元素需要入队列的函数4、记录元素坐标时候已经访问的inq[][];//广度优先 BFS//寻找代码块的个数struct Node_B{ int x, y;};Node_B node;int n, m;const int
2016-09-17 15:20:30
508
原创 二路-归并排序归纳
【递归二路划分 + 分割后的2个数组归并】//归并排序:递归二路划分+归并思想==二路,归并排序//函数的参数列表是:a,l,r;这是每次需要循环递归的初始条件 :数组(操作对象),两个端点//不需要初始化端点,端点由函数传入 //1、二分+ 2.两个左右两边的倒叙递归;由里向外void Two_divide_Merge_Sort(int a[],int left ,int righ
2016-09-08 11:43:08
385
原创 算法入门:双指针法
一、双指针法【例子1】 :求一个有序数组中和=8的下标。=====================================设置两个不同的指针 ,或者头,或者尾。在一个递增的序列中,。根据结果分类,说明指针的下一步应该怎么移动。结果分类: a[i]+b[j]==8则i++,j–都相互靠近; a[i]+b[j] < 8 ,需要移动指针i ,i++; a[i]+b[j] > 8
2016-09-08 10:22:26
7149
原创 二分查找模板总结(递归与循环遍历两个版本)
二分查找:思路: 在有序*数组***a[]中查找K 1,不断分割 。2 用中间值去比较。====================尝试比较下面两种,得到递归函数的写法=========【递归版本】 int BinSerch2(int a[], int k ,int left ,int right){ int mid = (left + right) / 2;//1.不断分割 if (
2016-09-06 23:40:51
1048
原创 选择排序初步理解
//选择排序初步理解0,循环n趟。下面1,2是循环体: 1,从没有排序中找出最小值 。 minIndex = i;//待交换的索引:也就是从List[i+1]--List[n-1]处找到最小值索引,并赋值给minIndex 2, 将当前待交换的数(nIndex=i)与min交换void selcetSort(){ int a[6] = { 3,
2016-09-06 10:40:06
254
原创 递归调用理解【含有示例代码】
1 每一级的函数调用都有自己的局部变量.2 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反. 即位于递归函数入口前的语句,由外往里执行; 位于递归函数入口后面的语句,由里往外执行。3 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.4 递归函数中必须包含可以终止递归调用的语句.“` int region(int a[], int cur
2016-09-05 21:57:39
428
原创 PATB1039: 到底买不买
PATB1039: 到底买不买 【经典】【思路】:在集合1中 找出其个数 字符都小的集合M,首先hash s1 记录次数 然后对照 s2如果有,就hash–;if(hash<0)则说明缺少了【参考答案】//这是一道十分典型的 在集合1中 找出其个数 字符都小的集合M//首先hash s1 记录次数 然后对照 s2如果有,就hash--;if(hash<0)则说明缺少了void B1039(){
2016-09-05 20:28:30
257
原创 PATB1047: 输出PATest
PATB1047: 输出PATest【思路】:设置字典为PATEST,同时设置HAsh来记录dict的次数 ,两者是一一对应的;两个数组的遍历 两个for循环即可, for (int i = 0; i < s.size(); i++) { for (int j = 0; j < 6; j++) { if (dict[j] == s
2016-09-05 20:28:02
252
原创 PATB1029: 字符统计
PATB1029: 字符统计【思路】:HASH经常用来求两个集合的交 集 补集等 。去重小能手1首先对目标集合中的元素进行HASH,这里面试大小写不区分,且只需要输出小写,所以统一转换成小写isalpha(s[i])判断是字母吗2然后对元集合进行过滤性输出 求最大值 老方法 还是设置一个maxID ,这里需要注意的是。索引需要换成char类型的输出printf("%c %d", maxId +'a
2016-09-05 20:27:27
337
原创 PATB1033: 旧键盘打字
PATB1029: 旧键盘打字【思路】:HASH经常用来求两个集合的交 集 补集等 。去重小能手1首先对目标集合中的元素进行HASH,这里+ 则 所有的大写字母over ,一个字母则小写一起go die 数字无影响的2然后对元集合进行过滤性输出【知识点】fill(a,a+5,true)isupper()判断字符是大写字母吗【参考答案】//B1033旧键盘打字void B1033(){ st
2016-09-05 20:26:54
467
原创 PATB1029: 旧键盘
PATB1029: 旧键盘【方法二】【思路】:HASH经常用来求两个集合的交 集 补集等 。去重小能手首先对目标集合中的元素进行HASH,这里需要统一大小写‘: b[i] = towupper(b[i]);【知识点】然后在原来的集合中找 没有被HASH化的元素 输出 并HASH此字符,以实现去重,输出的时候需要判断,没有被HASH化才可以被打印 if (hash_T[a[i]]
2016-09-05 20:26:17
330
原创 PAT分类解析专辑说明
这个专辑主要是程序设计刚刚入门时候的做题心得与积累 目前已经完成的是入门模拟 和字符串操作 在PATB中两部分总共占有20道题,(目前总55题),基本分数为 15 ,20分 是简单题目。 后面又是将对每个题目的打上标签 ,以便于针对性练习
2016-09-04 20:25:48
257
原创 PATB1024:科学记数法
PATB1024:科学记数法【思路】: 输出的字符串由几部分组成 通过 i str[i] 来索引输出字符串 每部分 需要满足什么条件 才输出 常用的是 str[i] pos pos-3 表示长度 exp为字符–》转换成数字【知识点】 每部分 需要满足什么条件 才输出 for (int i = 1; i < pos; i++)//也是分成3 部分 思考每部分
2016-09-04 20:04:55
344
原创 PATB1014:福尔摩斯的约会
PATB1014:福尔摩斯的约会【思路】: 输入 四个字符串 ,分别求其第一个满足条件的字符。用Hash输出【知识点】 求第一个满足条件的字符用 for break及时退出循环 一个字符串中分两次不同的的遍历 来判断的不同的条件 用 i 来连接 **for (i = 0; i < size1; i++)** { if (S1[i] == S2
2016-09-04 20:04:13
396
原创 PATB1048:数字加密
PATB1048:数字加密【思路】: 输入 循环 判断,只需要对每个元进行一次操作即可【知识点】 杂类用hash表示char has_z[3] = { 'J', 'Q', 'K' };【知识点】 对于c的字符数组可以用reverse来进行字符数组的反转,本题由于是字符到bit的操作,所以字符反转是常规思路reverse(a, a + strlen(a));reverse(b, b +
2016-09-04 20:03:47
329
原创 PATB1031:查验身份证
PATB1031:查验身份证【思路】: 输入 遍历每个字符 分类 不符合的用flag标记 通过标记输出结果 1、含有X的 2、不含有X 但是验证不通过的 都是用标记flag 3、通过标记输出结果【知识点】 如果中途break j < N ,通过循环变量判断来实现分类> ` for (j = 0; j < 17; j++)//遍历一个字符串完成
2016-09-04 20:03:10
421
原创 PATB1002:写出这个数
PATB1002:写出这个数【思路】: bit[index] 用hash有条件的输出 。思路和上题目基本类似【参考答案】#include <cstdio> #include <cstring> //位--》数字--》位:str[i]-'0',除基取余,bit[num++]保存,然后输出,i=[num-1,0:1],if(i>0) 打印“ ” else打印“\n”char strNum[110];
2016-09-04 20:02:28
711
原创 PATB1021:个位数统计
PATB1021:数 的bit[]统计【思路】: bit[index] 用hash有条件的输出【参考答案】#include <cstdio> #include <cmath> #include <cstring> //count[str[i]]++,索引也是变量,统计1个位数void tongjisuzhu(){ char str[1010]; gets(str); int len
2016-09-04 20:02:06
270
原创 PATB1006:换个格式输出整数
PATB1006:数字转换成bit[ ]的数组【思路】: bit[count++],获取数的每个位 数—数组,count 4 3 2 这样的数组打印需要逆序输出【知识点】 bit[count++],获取数的每个位 数—数组,countwhile (n>0) { bit[count++] = n % 10; n /= 10; }
2016-09-04 20:01:07
226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人