MySQL基础
MySQL概述什么是数据库数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
基本术语
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表 ...
Java进阶-正则表达式
Java 正则表达式正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
java.util.regex 包主要包括以下三个类:
Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
捕获组捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式 (dog) 创建了单一分组 ...
Java进阶-网络编程
网络编程相关概念网络通信两台设备之间通过网络实现数据传输
网络通信:将数据通过网络从一台设备传输到另一台设备
TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。
Socket基于客户端的网络通信
底层使用的是TCP|IP协议
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
java.net.Soc ...
Java进阶-反射
反射反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能操作对象的属性及方法。反射在设计模式和框架底层都会用到。
加载完类之后,在堆中就产生了一个Class类型的对象,这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以称为反射!
Java反射机制可以完成
在运行时判断任意一个对象所属的类
在运行是构造任意一个类的对象
在运行时得到任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的成员变量和方法
生成动态代理
反射相关的主要类
java.lang.Class代表一个类,Class对象标识某个类加载后在堆中的对象
java.lang.reflect.Method代表类的方法,Method对象标识某个类的方法
java.lang.reflect.Field代表类的成员变量,Field对象表示某个类的成员变量
java.lang.reflect.Constructor代表类的构造方法
示例Cat.java
12345678910111213141516public class Cat & ...
Java进阶-IO流
Java 流概述文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流。Java 中根据流的方向可以分为输入流和输出流。输入流是将文件或其它输入设备的数据加载到内存的过程;输出流恰恰相反,是将内存中的数据保存到文件或其他输出设 备
流:数据在数据源文件和程序内存直接经历的路径
输入流:数据从数据源文件到程序内存的路径
输出流:数据从程序内存到数据源文件的路径
常用文件操作创建文件方法
new File(String pathname) :根据路径构建一个File对象
new File(File parent,Sring child):根据父目录文件+子路径构建
new File(String parent,String child):根据父目录+子路径构建
12345678910111213141516171819202122232425262728293031323334353637383940414243444546public class FileCreate { public static void main(Str ...
Java基础-Junit单元测试
JUnit为什么要使用单元测试
一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中
如果有多个功能代码测试,就需要来回注销,切换很麻烦
如果可以直接运行一个方法,就方便很多,别去可以给出相关信息
基本介绍
JUnit是一个Java语言的单元测试框架
多数Java的开发环境都已经继承了JUnit作为单元测试的工具
每日一题
Java基础部分JDK、JRE、JVM区别
JVM:虚拟机
JRE:运行环境,为 java 的运行提供了所需环境。
JDK:开发工具包,提供了 java 的开发环境和运行环境。
JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。
&和&&的区别相同点:&和&&都可以用作逻辑与的运算符,表示逻辑与(and)。
不同点:
(1)&&具有短路的功能,而&不具备短路功能。
(2)当&运算符两边的表达式的结果都为true时,整个运算结果才为true。而&&运算符第一个表达式为false时,则结果为false,不再计算第二个表达式。
(3)&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如:0x31 & 0x0f的结果为0x01。
静态变量和实例变量的区别在Java中, ...
数据结构|树
树的基本概念树的定义树是n(n>=0)个结点的有限集。当n = 0时,称为空树。在任意一棵非空树中应满足:
有且仅有一个特定的称为根的结点。
当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。
显然,树的定义是递归的,即在树的定义中又用到了自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
树中所有结点可以有零个或多个后继。因此n个结点的树中有n-1条边。
基本术语
考虑结点K。根A到结点K的唯一路径上的任意结点,称为结点K的祖先。如结点B是结点K的祖先,而结点K是结点B的子孙。路径上最接近结点K的结点E称为K的双亲,而K为结点E的孩子。根A是树中唯一没有双亲的结点。有相同双亲的结点称为兄弟,如结点K和结点L有相同的双亲E,即K和L为兄弟。
树中一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度。如结点B的度为2,结点D的度为3,树的度为3。
度大于0的结点 ...
220805-集合
集合概述集合主要分为单列集合、双列集合
Collection接口有两个重要的子接口List、Set,他们实现子类都是单列集合
Map接口的实现子类是双列集合,K-V
List:是一个有序集合,可以放重复的数据,有索引
ArrayList、LinkedList:有序、可重复、有索引
Set:是一个无序集合,不允许放重复的数据,无索引
HashSet:无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
TreeSet:按照大小默认升序排序、不重复、无索引
Map:是一个无序集合,集合中包含一个键对象,一个值对象,键对象不允许重复,值对象可以重复(身份证号—姓名)
数组与集合数组:
长度开始时必须指定,而且一旦指定,不能改变
保存的必须为同一类型的元素
使用数组进行增加元素的代码麻烦
集合:
可以动态保存任意多个对象,使用比较方便
提供了一系列方便的操作对象的方法:add,remove,set,get
使用集合添加、删除新元素,代码简洁
集合和泛型都只支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都是对象
Collection集合 ...
Java中的锁
乐观锁和悲观锁悲观锁一个共享数据加了悲观锁,那线程每次想操作这个数据前都会假设其他线程也可能会操作这个数据,所以每次操作前都会上锁,这样其他线程想操作这个数据拿不到锁只能阻塞了。
乐观锁乐观锁操作数据时不会上锁,在更新的时候会判断一下在此期间是否有其他线程去更新这个数据。
使用场景悲观锁和乐观锁没有孰优孰劣,有其各自适应的场景。
乐观锁适用于写比较少(冲突比较小)的场景,因为不用上锁、释放锁,省去了锁的开销,从而提升了吞吐量。
如果是写多读少的场景,即冲突比较严重,线程间竞争激励,使用乐观锁就是导致线程不断进行重试,这样可能还降低了性能,这种场景下使用悲观锁就比较合适。
独占锁和共享锁独占锁独占锁是指锁一次只能被一个线程所持有。如果一个线程对数据加上排他锁后,那么其他线程不能再对该数据加任何类型的锁。获得独占锁的线程即能读数据又能修改数据。
共享锁共享锁是指锁可被多个线程所持有。如果一个线程对数据加上共享锁后,那么其他线程只能对数据再加共享锁,不能加独占锁。获得共享锁的线程只能读数据,不能修改数据。
公平锁和非公平锁公平锁公平锁是指多个线程按照申请锁的顺序来获取锁,这里类似排队买票,先 ...