![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
爱技术的小小林
这个作者很懒,什么都没留下…
展开
-
Mybatis如何防止SQL注入
什么是SQL注入攻击SQL注入,大家都不陌生,是一种常见的攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。所以,在我们的应用中需要做一些工作,来防备这样的攻击方式。例如攻击者会将passwd的参数输入为“ ’ or ‘1’ = '1 ”;那么直接使用Statement,则打印出来的SQL语句如下:select * from tb_name = '随意' and passwd = '' or '1' = '1转载 2020-09-23 23:50:07 · 2713 阅读 · 0 评论 -
【Session与Cookie的区别与联系】
文章目录Cookie的概念Session的概念两者的区别Cookie的概念有的网站,登陆的时候,会出现一个选项,问你是否要一周内或者一个月内保持登陆状态。如果你选了,那么一周之内,都不需要再输入账号密码。这个功能,就是靠cookie来实现。Cookie是一种浏览器和服务器交互数据的方式。Cookie是由服务器端创建,但是不会保存在服务器。创建好之后,发送给浏览器。浏览器保存在用户本地。下一次访问网站的时候,就会把该Cookie发送给服务器。Session的概念Session对应的中文翻原创 2020-07-13 10:18:36 · 123 阅读 · 0 评论 -
【JSTL使用IDEA的方法】
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>原创 2020-07-12 15:37:48 · 159 阅读 · 0 评论 -
【ArrayList和LinkedList的区别】
ArrayList和LinkedList的区别?1.是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;2.底层数据结构:Arraylist 底层使用的是 Object 数组;LinkedList 底层使用的是 双向链表 (JDK1.6之前为循环链表,JDK1.7取消了循环。)3.插入和删除是否受到位置的影响:(1)ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e) 方法的时候, Arra原创 2020-06-01 11:11:51 · 197 阅读 · 0 评论 -
【Array和ArrayList的区别】
Array和ArrayList的区别1、Array类型的变量在声明的同时必须进行实例化(至少得初花数组的大小),而ArrayList可以只是先声明;2、Array始终是连续存放的;而ArrayList的存放不一定连续;3、Array对象的初始化必须指定大小,且创建后的数组大小是固定的;而ArrayList的大小可以动态指定,空间大小可以任意增加;4、Array不能随意添加、删除;而ArrayList可以在任意位置插入和删除5.Array可以包含基本类型和对象类型,ArrayList只能包含对象类型原创 2020-05-26 11:39:21 · 608 阅读 · 0 评论 -
【Java中HashSet与TreeSet的区别】
HashSet类HashSet有以下特点:1.不能保证元素的排列顺序,顺序有可能发生变化2.线程不安全的3.集合元素可以是null,但只能放入一个null当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等注意,如果转载 2020-05-26 10:37:46 · 203 阅读 · 0 评论 -
【Iterator和ListIterator的区别】
无论使用什么方式对List进行遍历,都不能直接对List变量进行直接修改操作,比如:List<String> strList = new ArrayList<String>(); strList.add("john");strList.add("mark"); strList.add("alen");strList.add("jason"); for(String strElem:strList){ if(strElem.equals("john")){转载 2020-05-26 10:05:50 · 94 阅读 · 0 评论 -
【JAVA高薪之路 面试题精选】Map类面试题
知识结构及题目分析 一般而言,Map 的面试题可分为四类:1、HashMap 的数据结构,面试官考察的是对 Map 内部的存储结构了解;2、HashMap 的增删查改操作,面试官考察的是对 map 内部操作流程的熟悉程度,既要知其然,还要知其所以然;3、HashMap 的的应用,面试官考察的是灵活运用 HashMap 的能力;4、其他 Map 类面试题,面试官考察的是系统掌握 Map 类的能力。典型例题及思路分析问题 1:"那你知道 HashMap 内部的数据结构吗?"参考答案: 各个原创 2020-05-25 16:16:13 · 893 阅读 · 0 评论 -
【HashMap源码分析】
HashMap简介HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间,具体可以参考 tr转载 2020-05-25 10:49:32 · 100 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶13学习总结】红黑树与AVL树的区别
比较红黑树不追求"完全平衡",即不像AVL那样要求节点的左右孩子高度差不超过1,它只要求部分达到平衡,就是要求从根节点到叶子节点的最长路径不大于最短路径的两倍。红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)但在删除节点时导致的失衡,AVL需要维护从被删除节原创 2020-05-24 16:49:14 · 163 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶10学习笔记】并查集
并查集Quick Union这个版本的目的是使用一个数组构建一棵指向父节点的树,首先是将每个元素看做是一个节点,让每个节点指向自己,接下来做union操作这个操作是将3所在集合的根节点指向8所在集合的根节点public class UnionFind2 implements UF { // 我们的第二版Union-Find, 使用一个数组构建一棵指向父节点的树 // parent[i]表示第一个元素所指向的父节点 private int[] parent;原创 2020-05-23 21:12:57 · 144 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶11学习笔记】AVL
平衡二叉树平衡二叉搜索树又被称为AVL树,且具有性质:对于任意一个节点,其左子树和右子树的高度差不能超过1.。节点高度我们要维持树的自平衡结构,就要计算平衡因子,根据平衡因子予以调整,而计算平衡因子就需要标注节点的高度,叶子节点对应的高度为1,对于有左子树和右子树的节点,对应的高度为左右子树中最高的子树高度加一,所以标注节点可以这样写: // 获得节点node的高度 private int getHeight(Node node){ if(node == null)原创 2020-05-23 20:07:25 · 197 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶12学习笔记】红黑树
2-3树二叉查找树中树高会受到输入数据的影响,极端情况下一棵树和一个链表没什么区别,所以我们需要一种树,它的所有叶节点到根节点的距离都是相等的,这种树为平衡树,并且随着数据的加入,这种平衡性会一直保持,它就是2-3查找树,它是一棵绝对平衡的树。如上图,存放一个元素的为2节点,存放两个元素的为3节点,对于2节点,它与二叉查找树特性相同,左链接比节点值小,右链接比节点值大,而对于3节点,它有三个链接,左链接指向的左子树所有元素都小于3节点的两个键,中间链接指向的子树元素大小介于两个键中间,右链接指向的子树原创 2020-05-23 17:50:50 · 177 阅读 · 0 评论 -
【leetcode Day4】【211】【677】字典树
【211】添加与搜索单词–数据结构设计设计一个支持以下两种操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。示例:addWord(“bad”)addWord(“dad”)addWord(“mad”)search(“pad”) -> falsesearch(“bad”) -> truesearch(".ad") ->原创 2020-05-21 16:16:52 · 118 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶9学习笔记】字典树Trie
什么是Trie上图便是一棵字典树,它是一棵多叉树,它通常只用来处理字符串,当数据为单词的时候,把单词以字母为单位一个一个拆开,从根节点开始,一直到叶子节点去遍历,每遍历到一个叶子节点形成一个单词。所以它的时间复杂度为O(w),w为字符串的长度。字典树还有一个问题,就是当一个单词的前缀也为一个单词,如pan为平底锅,是panda的前缀,该如何表示,我们就需要一个标识符,去标识该节点是一个单词的结尾,我们还用到了映射,一个字符对应一个节点,这两部分构成了字典树的基本节点类字典树基础public cla原创 2020-05-21 15:47:51 · 153 阅读 · 0 评论 -
【玩转数据结构 从入门到精通8学习笔记】线段树
线段树(区间树)首先来看我们为什么需要使用线段树,可以来看一个经典问题,区间查询,使用线段树可以优化时间复杂度,使用数组实现为O(n),而使用线段树为O(lgn)。对于查询,查询一个区间的最大值,最小值,或者区间数字和,都可看做是左右两孩子的融合过程,所以在实现上依然可以使用递归由下图可以看出线段树不是完全二叉树,它是一个平衡二叉树,何为平衡二叉树?它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。那么原创 2020-05-21 10:39:32 · 130 阅读 · 0 评论 -
【leetcode Day4】【347】堆与优先队列
【347】前K个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]思路:元素和元素出现频次就可以借助Map结构,将输入数组元素作为KEY,出现频次作为value存入Map中,可以借助优先队列,使队列元素值在K内,然后后续元素可以把优先队列中频次最小的元素替代,import java.util.*;class Solu原创 2020-05-20 18:09:51 · 125 阅读 · 2 评论 -
【玩转数据结构 从入门到进阶7学习笔记】堆与优先队列
优先队列何为优先队列?优先队列:出队顺序与入队顺序无关,和优先级有关为什么要使用优先对列?动态选择优先级最高的任务执行实现优先对列可以有多种底层数据结构,在这里我们使用堆这个数据结构堆二叉堆是一棵完全二叉树,完全二叉树,简单来说,就是把元素顺序排列成树的形状,从左到右一层一层的放,放完为止最大堆–堆中某个节点的值总是不大于其父节点的值,如上图可以使用动态数组来实现堆,其中parent(i)=(i-1)/2, leftchild(i)=2i+1, rightchild(i)=2原创 2020-05-20 17:31:57 · 148 阅读 · 0 评论 -
【leetcode day3】【804】【349】【350】集合与映射
【804】唯一摩尔斯密码词public int uniqueMorseRepresentations(String[] words) { /* 将26个英文字母对应的摩斯字符存到一个数组里 然后将输入字符串遍历for-each循环 将每个单词每个字符读取,转换成摩斯密码,存到字符串中,再将字符串存到TreeSet里,集合会自动去重,所以最后返回集合的大小,就可以获得所有词不同单词翻译的数量 */ Strin原创 2020-05-19 23:05:40 · 133 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶6学习笔记】集合与映射
集合只要实现以下方法就可实现一个简单的集合public interface Set<E> { void add(E e);//不能添加元素 void remove(E e); boolean contains(E e); int getSize(); boolean isEmpty();}可以使用二分搜索树和链表实现集合,首先来看一下二分搜索树的实现,我们这里导入之前创建的BST类,注意这里的泛型要实现Comparable接口,import j原创 2020-05-19 21:31:23 · 173 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶5 学习笔记】二分搜索树
二分搜索树什么是二分搜索树?二分搜索树是二叉树,二分搜索树的,每个节点比左子树的所有节点的值都大,比右子树的所有节点值小,,每一棵子树也是二分搜索树其中,二分搜索树存储的数据具有可比性,所以在定义泛型接口时要注意实现Comparable接口接着来看二叉树的基本结构,它与链表一样,动态数据结构private class Node{ public E e; public Node left,right; public Node(E e){原创 2020-05-18 20:33:42 · 161 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶4学习笔记】
递归递归,本质上是将原来的问题转化为同一更小的问题,比如数组求和 // 计算arr[l...n)这个区间内所有数字的和 private static int sum(int[] arr, int l){ if(l == arr.length) return 0; return arr[l] + sum(arr, l + 1); }链表中的递归public ListNode removeElements(ListNo原创 2020-05-16 17:25:42 · 208 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶3学习笔记】链表
链表这里结点类Node可以作为内部类,放在链表类里基本结构public class LinkedList<E> { private class Node { public E e; public Node next; public Node(E e, Node next) { this.e = e; this.next = next; } publ原创 2020-05-15 22:17:55 · 147 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶2学习笔记】栈和队列
栈可以先来看看栈的应用,上图是程序调用的系统栈,箭头方向指明了程序运行顺序,我们运行到A2时把它压入栈,接着跳到B,执行到B2时再把它压入栈,再执行C,执行完C,我们可以看栈顶,是B2,我们跳回B2继续执行,B执行完后再看栈顶,是A2,跳回A2继续执行,A执行完后,栈空,程序结束,从这可以看出栈在程序调用问题上给出了很好的解决方法。栈的基本实现我们要如何实现一个栈呢,其实很简单,只要实现以下几个方法栈有推入,拿出操作,peek操作是查询并获取栈顶元素,还有获取栈内元素个数和判断是否为空,所以我原创 2020-05-15 16:52:45 · 124 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶1学习笔记】数组
封装属于自己的数组封装一个属于自己的数组,可以进行增删改查等操作,还可以不同的数据类型,以自己的格式输出。下面是数组里的方法一览add方法想要在指定位置添加一个元素,那么这个位置后面的元素必须全部向后移一位,我们可以从最后一个元素开始遍历,每个元素向后移一位,移完后则指定位置空余出来,再将元素添加进去,在此之前,我们还要判断元素是否已经填满数组,还要输入的指定值是否小于0或者大于元素个数,完成这个方法后,我们可以在首尾添加元素时将此方法复用 public void add(int index,E原创 2020-05-14 21:27:05 · 174 阅读 · 0 评论 -
[leetcode]3无重复字符的最长子串
图解Longest Substring Without Repeating Characters题意:找出字符串中没有重复字母的最大长度难度:Medium分类:Hash Table, Two Pointers, String算法:两个指针,记录没有重复字母的子串的首和尾 HashMap<Character,Integer> hm = new HashMap<>(); int max = 0;//记录窗口最大的长度原创 2020-05-10 17:39:32 · 90 阅读 · 0 评论 -
Leetcode Day1
twosum用HashMapimport java.util.HashMap;public class twoSum1 { public static void main(String[] args) { int[]num=new int []{4,2,7,5}; int tag=9; int []a=twoSum(num,tag); for (int each : a) { System.out.println(each); }原创 2020-05-10 12:18:50 · 76 阅读 · 0 评论 -
【Java中级】NIO网络编程
模型三个核心类Buffer 缓冲区,一个可以读写的内存区域– ByteBuffer, CharBuffer, DoubleBuffer, IntBuffer, LongBuffer,ShortBuffer (StringBuffer 不是Buffer缓冲区) • 四个主要属性– capacity 容量, position 读写位置– limit 界限, mark 标记,用于重复一个读/写操作Channel 通道– 全双工的,支持读/写(而Stream流是单向的) – 支持异步读写– 和原创 2020-05-08 22:28:04 · 217 阅读 · 0 评论 -
request和response
request常用方法request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到request.getRemote...原创 2020-05-04 19:49:46 · 92 阅读 · 0 评论 -
Servlet自启动
介绍有的时候会有这样的业务需求:tomcat一启动,就需要执行一些初始化的代码,比如校验数据库的完整性等。但是Servlet的生命周期是在用户访问浏览器对应的路径开始的。如果没有用户的第一次访问,就无法执行相关代码。这个时候,就需要Servlet实现自启动 即,伴随着tomcat的启动,自动启动初始化,在初始化方法init()中,就可以进行一些业务代码的工作了load-on-startu...原创 2020-05-04 18:03:49 · 137 阅读 · 0 评论 -
Servlet跳转
示意图public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) ...原创 2020-05-04 17:50:13 · 112 阅读 · 0 评论 -
Servlet的生命周期
流程图实例化在根据HTML的路径找到对应的Servlet之后,接着就开始调用类的无参构造函数进行实例化,该实例为单例模式,无论访问多少次,都是只执行一次构造方法初始化init()为初始化方法,该初始化方法也是执行一次,在该方法中可以做一些业务的初始化,在执行完构造方法之后执行提供服务接着便到service方法,通过html里的method确定对应的方法,调用doGet()或doPos...原创 2020-05-04 17:34:29 · 85 阅读 · 0 评论 -
Servlet调用流程
流程图login.html首先会访问这个网页,在这个页面中会通过form,以post方法提交数据/login路径然后把页面内的信息提交到action对应的路径,并附带method,找到对应的Servlet然后tomcat接收到请求,通过web.xml配置文件,去寻找对应路径所匹配的Servlet类,Servlet类实例化找到对应的Servlet之后,再自动调用无参的构造函数实例化...原创 2020-05-04 17:20:22 · 94 阅读 · 0 评论 -
Servlet创建
步骤开发一个servlet需要如下几个步骤创建web应用项目编写servlet代码部署到tomcat中创建一个java项目j2eeFile->New->Other->Java->Java Project输入名称j2ee这样就创建一个单纯的基于java的项目导入必须的servlet-api.jar包右键点击项目 -> properties ->...原创 2020-05-04 10:50:15 · 195 阅读 · 0 评论 -
JAVA数据库连接池
享元模式• Connection是Java和数据库两个平行系统的桥梁• 桥梁构建不易,成本很高,单次使用成本昂贵• 运用共享技术来实现数据库连接池(享元模式)—降低系统中数据库连接Connection对象的数量– 降低数据库服务器的连接响应消耗– 提高Connection获取的响应速度第三方数据库连接池有两种,一种是C3P0,另一种是Druid,而配置C3P0连接池有两种方式,...原创 2020-04-21 11:26:34 · 88 阅读 · 0 评论 -
JDBC的高级操作
事务管理作为单个逻辑工作单元执行的一系列操作,要么完全地执 行,要么完全地不执行。事务,必须满足所谓的ACID(原子性、一致性、隔离性 和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务 管理子系统负责事务的处理• connection.setAutoCommit(false); 关闭自动提交,实现多语句同一事务• connection.commit(); 提交事务 ,...原创 2020-04-20 23:12:31 · 120 阅读 · 0 评论 -
深入理解JAVA的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲:一.抽象类二.接口三.抽象类和接口的区别一.抽象类 在了解抽象类之前,先来了解一下抽象方法。抽象方...转载 2020-04-20 22:22:18 · 51 阅读 · 0 评论 -
【java】JDBC操作如此简单
Java操作类库• java.sql., javax.sql.; 这2个包只是接口类• 根据数据库版本和JDBC版本合理选择连接字符串:jdbc:mysql://localhost:3306/mydb,其中localhost为本机IP地址,3306为端口,mydb为数据库名Java连接数据库操作步骤1.注册驱动,这里的驱动类要根据Mysql的版本选择,最新版的驱动类是"com.my...原创 2020-04-20 21:56:24 · 84 阅读 · 0 评论 -
【Java】巧用线程池
线程池每一个线程的启动和结束都是比较消耗时间和占用资源的。如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢。为了解决这个问题,引入线程池这种设计思想。线程池的模式很像生产者消费者模式,消费的对象是一个一个的能够运行的任务设计思路线程池的思路和生产者消费者模型是很接近的。准备一个任务容器一次性启动10个 消费者线程刚开始任务容器是空的,所以线程都w...原创 2020-04-19 17:19:24 · 82 阅读 · 0 评论 -
【Java】关于网络编程的那些事
网络基础知识IP地址:每个网卡都有一个或多个IP地址;而IP地址类型有两种,一种是IPV4,一种是IPV6;通过在命令提示符输入ipconfig可以查询本机的IP地址;本机的保留IP是127.0.0.1;端口(port):相当于服务器的码头,每个客户端连接进来都需要确切的端口;公网和内网网络是按层次划分的,最外层是公网,而底下每一层都是内网,而UDP和TCP通讯协议是在传输层;...原创 2020-04-19 12:30:00 · 82 阅读 · 0 评论