数据库连接池
概述数据库连接池是一个存放connection连接对象的池子(容器)。
作用当系统初始化后,容器被创建,容器会申请一些连接对象存放在该容器中,当用户访问数据库的时候,直接从池子中申请,用完后归还到池子中去。
好处
节约资源
用户访问高效
实现接口标准的接口是DataSource,包含方法
获取连接getConnection
归还连接close
具体实现一般是由数据库厂商来实现
C3P0数据库连接池技术
Druid(阿里巴巴提供)
快速使用C3P0数据库连接池技术步骤
导入jar包(注意要导入数据库连接池的jar包,还要导入数据库驱动jar包)
在src(classPath)下定义配置文件,可以配置driverName,user,password,maxSize等
定义一个类文件使用
ds=new ComboPooledDataSource直接new一个连接池
数据库连接池直接getConnection获取连接对象
示例1234567891011121314151617181920212223package cn.itcast.dataSource.c3p0 ...
Java注解
注解所谓注解,跟注释类似,用来对代码中的类、方法、属性进行说明。
作用
编写文档:通过代码里面标识的注解来生成文档javadoc命令
代码分析:可以通过反射机制,得知该类、方法、属性是否有注解。比如可以通过反射,调用getAnnotation函数获取该注解然后进行解析注解中的属性。
编译检查:通过注解能够让编译器自动进行编译检查,比如@overide可以检查是否是重载函数
可以暂时理解为一个可以存放数据(注解的属性)的“特殊对象”。他的作用主要体现在可以解析他的属性值。看完《自定义注解》就明白了。
元注解元注解就是标识注解的注解。也就是系统中定义好的注解,方便我们自定义注解的时候对该自定义注解进行描述。
这里只介绍两种最常用的元注解
@Target这个元注解表示被描述的注解@Anno的适用范围,也就是说@Anno可以作用于类(TYPE)还是属性(FIELD),又或是方法(METHOD)
@RetentionRetention中文维持,表示被描述的注解的保持时间。我们一般设置为RUNTIME,表示时间是从字节码到JVM读取的时间段都能保持。
自定义注解1234567 ...
反射通俗易懂,反射体现在哪里
反射概念反射指的是通过一个类就能知道该类的所有属性和方法(注意这里是类,而不是实例化的对象)。通俗的说,就是给你一个类的名称就可以得到该类的成员变量、构造方法、成员方法的技术。
通过类得到其所有的属性和方法。举个例子,比如有汽车这个类,通过汽车我们能够知道他的组成部分有轮子、方向盘等。将轮子、方向盘视为一个对象,然后通过该对象可以进行一些操作,比如轮子本身具有向前的功能,方向盘具有转弯的功能。这就是反射(内省)机制的形象化理解。
那么问题来了,到底哪里体现了反射的字面意思呢?文末有讲到,建议按照顺序读完。
字节码对象(Class对象)-标识.class文件的对象反射机制中有两个对象的概念对理解反射非常重要,下面介绍字节码对象
我们知道一个java文件,需要编译成.class文件。这个.class文件我们虽然表面上对该文件一无所知,但是java将.class字节码加载进内存时,jvm将产生一个java.lang.Class对象代表该.class字节码文件(这里体现了java中万物皆对象),从该字节码文件中可以获得该类的许多基本信息,这就是反射机制。所以要想完成反射操作,必须先获得 ...
剑指 Offer 62. 圆圈中最后剩下的数字思路推导(约瑟夫环、DP、递归)
一、题目剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫环、DP、递归)题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
示例1:
12输入: n = 5, m = 3输出: 3
示例2:
12输入: n = 10, m = 17输出: 2
二、分析这是一道典型的约瑟夫环问题。n个数字,每次删除第m个数字,求最后剩下的一个数字是多少。
我们用动态规划的思想去做这道题。首先假设 f(n,m)表示剩下的数字(可理解为最后一次删除后,剩下的数)。动态规划的思想就是要找f(n,m)和f(n-1,m)之间的关系,称为状态转换式。
先看f(n,m)中有n个数字,要每次删除m个数字。我们将其一步一步分解,看分解的子过程中有没有可以调用自身函数的小过程(递归思想)。
f(n,m):我们先第一次删除第m个数字即(m-1)后,下一次删除的起始元素是m(序列如下)。由于m可能大于n,所以起始元素表示为m%n。
0 1 2 3 4 5 … m-2 m-1(删除) ...
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(二叉搜索树性质、迭代、递归)
一、题目剑指 Offer 68 - I. 二叉搜索树的最近公共祖先题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
示例1:
12输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6
示例2:
12输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4输出: 2
二、分析这道题是一道leetcode简单题。但是一拿到题的时候有点蒙圈。题目条件限定二叉搜索树,我们就要好好理解到二叉搜索树的概念,左子树小于右子树,更要会灵活应用。
对于此题,我们要思考二叉搜索树中任意两节点p,q的最近公共祖先Ancestor。他们之间有什么特性?
很容易发现 p、q一定是parent的左右子树(将p、q任一等于Ancestor作为特例,先不考虑)。由二叉搜索树中又可以得到左子树<Ancestor<右子树。我们根据此性质来搜索二插树,遍历的每个节点设为root
有下面三种情况:
p,q都小于root,那么p,q一定在root左子树上,A ...
C++字符串和数字相互转换(刷题必备)
C++数字和字符串相互转换C++数字和字符串相互转换,此文详细介绍了两者互相转换的方法。通过内置函数和字符串流(对象)来实现转换。
数字转字符串方法1:to_string()函数12345678#include<iostream>#include<string>using namespace std;int main() { int num = 12345; string num_s = to_string(num);//转换 cout << num_s.at(0);}
方法2:ostringstream对象+str()函数1234567891011#include<iostream>#include<sstream>#include<string>using namespace std;int main() { int num = 12345; ostringstream oss;//字符输出流对象 oss << num;//将数字放入输出流对象中 string ...
剑指 Offer 43. 1~n 整数中 1 出现的次数(纵向求解、组合思想、找规律)
一、题目剑指 Offer 43. 1~n 整数中 1 出现的次数题目描述输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例1:
12输入:n = 12输出:5
示例2:
12输入:n = 13输出:6
二、分析方法1 暴力(横向求法)暴力遍历小于等于n的所有数,针对每一个数字,求其所有位数上1的个数(对每个数字进行横向计数)。但是此方法时间复杂度随着n的增大会变大。时间复杂度过高,导致超时。这种方法不可取。
方法2 纵向求法+数学规律(组合思想)这道题要求1到n中1出现的个数。我们有两种宏观思路。
第一种是从局部,针对每一个数,判断该数所有位数(横向),将该数字中出现1的个数计算完。再去计算下一个数出现的1的个数,直到计算到n。(方法1)
第二种是针对某一位,求取小于等于n所有数字该位为1的个数和(纵向)。再将所有位置1的总和加起来,就是结果了。(方法2)
这道题思路主要介绍纵向求法。下面举例针对n的某一位cur来分析。
举例,cur为index为1上的数。 ...
剑指 Offer 14- I. 剪绳子(C++暴力+动态规划、贪心解)
一、题目剑指 Offer 14- I. 剪绳子题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
示例1:
123输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1
示例2:
123输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
二、分析方法1 暴力+动态规划这道题剪绳子,我们用动态规划的思想去做。
假设动态规划 f(i)表示i长的绳子切割后最大长度 $f(i)=max((i-k)k,f(i-k)k))其中k=[2,i)$,k表示第一段割下来的长度
依次从i长的绳子里面割j长的绳子.剩下的$(i-j)$长绳子可以不再分割:最大乘积就为$(i - j) * j$。
也可以再次分割,最大乘积就为:$j * dp[i - j] ...
剑指 Offer 65. 不用加减乘除做加法(位运算、递归、迭代)
一、题目剑指 Offer 65. 不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例1:
12输入: a = 1, b = 1输出: 2
示例2:
12输入: a = -1, b = -1输出: -2
二、分析这道题不能用加减乘除来做,那么只能用位运算了。我们先考虑a和b为一位二进制数,通过查看a+b来找规律,表格如下:
a
b
sum
carry
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
所以可以得到:$$sum=a \bigoplus b\carry=a&b$$因此$$a+b=sum+(carry<<1)=a \bigoplus b +((a&b)<<1)(1)$$注意这里carry要左移一位,计算机内部最高位为符号位。carry左移1位让它变成符号位。
将a+b转换成$a \bigoplus b +((a&b)<<1) $后,中 ...