目录
JavaSE
MySQL数据库
Web前端
JavaWeb
JavaSE
循环语句
while:先判断条件是否满足,是则进入循环,否进行后续语句
do while:先进入循环,后判断条件
for:固定次数用for,必须执行一次用do while,其他用while
跳出循环
- break[break语句]的使用场合主要是switch语句和循环结构。
- 在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句。如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。
- 如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行switch语句中的break语句时,仅退出switch语句,不会退出外面的循环结构。
- continue跳过循环这一轮剩下的语句进行下一轮循环
- 在循环体内执行return,将会结束该方法,循环9直接结束。
- 跳过二次循环 break+标签
自动装包自动解包***
装箱就是自动将基本数据类型转换为包装器类型;
拆箱就是自动将包装器类型转换为基本数据类型。
==和equals的区别***
- ==是运算符
- 对于基本类型, 比较的是值是否相同
- 对于引用类型,比较引用地址是否相同
- equals是object方法
equals方法只能用来比较引用数据类型,在Object类中所定义的equals方法底层也是通过==号比
较对象的地址值。但是如果一个类重写了 equals 方法此时就可以比较内容了。
抽象类和接口的区别
- 抽象类
①抽象类可以定义构造器
②可以有抽象⽅法和具体⽅法
③抽象类中的成员可以是各种类型
④抽象类中可以定义成员变量可以包含静态⽅法
⑤有抽象⽅法的类必须声明为抽象类⽽抽象类未必要有抽象⽅法
⑥ ⼀个类只能继承⼀个抽象类
- 接⼝
①接⼝中不能定义构造器
②⽅法全是抽象⽅法
③接⼝中的成员全是Public的
④接⼝中定义的成员变量实际上都是常量
接⼝中不能有静态⽅法,⼀个类可以实现多个接⼝
深拷贝、浅拷贝***
深拷贝:深拷贝则是拷贝了主对象的所有值而不是地址,所以即使主对象的值发生任何变化时,拷贝对象的值也不会改变。
浅拷贝:浅拷贝只是拷贝了主对象的地址,拷贝对象的值也会随之发生变化。
泛型中<? super T>和<? extends T>的区别***
- <? extends T>:
<? extends T>是get优先,put受限,适用于提取元素为主的场景。
<? extends T>可以赋值给任何T以及T的子类的集合,上界为T,取出的类型带有泛型限制,向上转型为T,除了null以外,任何元素不得添加进<? extends T>集合内。
- <? super T>:
<? super T>是put优先,get受限,适用于存放元素为主的场景。
<? super T>可以赋值给任何T以及T的父类集合,下界为T,取出的类型会泛型丢失,添加时只能添加T或T的子类。
常见的异常
输入输出异常:IOException
空指针异常类:NullPointerException
算术异常类:ArithmeticExecption
数组下标越界异常:ArrayIndexOutOfBoundsException
进程线程
1、电脑打开一个应用程序就是一个进程。
2、进程实现了操作系统的并发性,线程实现了进程的内部并发
3、一个进程包含多个线程,线程在进程的内部
4、进程是资源分配的最小单位,线程是程序执行的最小单位
5、进程有自己的独立地址空间,线程是共享进程中的数据,使用相同的地址空间
6、多个进程同时执行时,如果一个进程崩溃,一般不会影响其他进程,而同一进程内的多个线程之间,如果一个线程崩溃,很可能使得整个进程崩溃。
创建线程的方式***
继承Thread类创建线程
实现Runnable接口
使用Callable接口,有返回值
使用线程池例如用Executor框架
并发并行***
- 并发是指一个处理器同时处理多个任务。允许两个任务彼此干扰,同一时间点只有一个任务运行,交替执行(接力跑)
- 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。时间上重叠,两任务在同一时刻互不干扰同时执行(齐跑)
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
并发就像一个人(CPU)喂两个小孩(程序)吃饭,表面上是两个小孩在吃饭,实际是一个人在喂。
并行就是两个人喂两个小孩子吃饭。
wait()、sleep()、yield()、join()
- wait() -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
- notify() -- 唤醒在此对象监视器上等待的单个线程。
- notifyAll() -- 唤醒在此对象监视器上等待的所有线程。
- sleep()的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。
- yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
- join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。
-
wait() 是Object类 的方法,sleep()是 Thread 类的方法。
-
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
-
sleep不需要被唤醒,wait需要
-
sleep方法没有释放锁,而wait方法释放了锁。
run和start的区别
- run执行的是main线程,他只是thread的一个普通方法的调用而已
- start执行的是thread线程,调用start方法会创建一个新的子线程并启动
死锁
资源竞争,两个或两个以上的进程因争夺资源而造成一种相互等待的现象
两个线程互相持有对方的锁从而造成线程阻塞
加锁方式***
Lock(比synchronized要轻量级)
synchronized方式(重量级锁)
wait() notify() notifyAll()
死锁产生的4个必要条件
1、互斥: 某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
2、占有且等待: 一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
3、不可抢占: 别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
4、循环等待: 存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
如何避免死锁
- 加锁顺序
一个线程如果要获取多个锁,必须按照一定的顺序去获取,比如要获取A B C 三把锁,我们规定,必须获取到了 AB 两把锁,才能去获取 C锁
举个例子 现在有两个线程 都要去获取 ABC 三把锁
然后 1号 线程 获取到了 A 和 B 两把锁
2号 线程获取了 C锁
于是 1号线程在等待 2号线程释放锁C锁
2号线程在等待 1 号线程释放 A 和 B 锁
于是出现了死锁
现在采用加锁队列后,必须先 获取 A 和 B 才能获取C锁,所以 2号线程就没有机会在没有获取 AB 的情况下拿到C锁,就不会出现死锁问题
这个策略的最大问题是,你必须提前知道所有用到的锁,这个有些时候难以预测
- 加锁时限
一个线程尝试去获取锁,如果在指定的时间内获取不到,就放弃等待锁,并释放自己现在所持有的锁,然后随机等待一定时间,再去获取锁
这里要注意的是 ,等待的时间一定要是随机,不然可能出现 两个线程都释放资源,然后等待相同时间,然后再一起去获取锁,于是又死锁,这种现象称为活锁
- 死锁检测
利用数据结构,如 一个map,然后每次线程的上锁,和获取不到锁,都记录在里面,当一个线程获取不到锁的时候,就去便利查看这个map,看一下有没有死锁,有的话就将整个map里所有的锁全部释放,然后各个线程稍作等待,再去竞争锁。
这里还可以优化下,设置优先级,释放所有锁的时候,不释放优先级高的锁,能提高性能。
常见集合list set map
- list:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素
- set :无序,集合属于单列集合,不允许包含重复元素,判断元素是否重复的标准为对象的 equals 方法
- map:集合属于双列Key-value键值对的集合,Key不允许重复,是否允许为 null 根据实现类而定,Value 随意; 2) Map 接口的实现类主要有三种:HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap。
Arraylist和linkedlist的区别
arraylist:基于动态数组,连续内存存储,适合下标访问,扩容时适合使用尾插法,线程不安全
linkedlist:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询,遍历时使用iterator不能使用for,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大,线程安全
HashMap和HashTable的区别
HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;
HashMap允许key和value为null,而HashTable不允许
MySQL数据库
sql语句***
1)select count(*)from 订单 表 where name like “%电脑%” group by name
2)select name birth from student where name like 李% and birth > 2001.1 . 1 limit 10 desc
3)select 学号,sum(成绩)from学生表group by学号 order by sum(成绩)desc
数据库事务***
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。(例子:电子支付)
A:原子性:事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败
C:一致性:在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
I:隔离性:并发执行的事务不会相互影响
D:持久性:事务一旦提交,其对数据库的更新就是持久的
事务用到的场景
对数据库库进行操作的时候,可以进行提交事务,如果不想提交事务,可以用到事务回滚
数据库池
Druid、Tomcat jdbc pool
数据库连接池的作用
连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。
1、资源复用:由于数据库连接得到重用,避免了频繁创建、释放引起的大量性能开销。在减少系统消耗的基础上,在另一方面也增进了系统运行环境的平稳性(减少内存碎片及数据库临时进程/线程的数量)
2、更快的系统响应速度:数据库连接池在初始化过程中,往往已经创建了若干个数据库连接置于池中备用,此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有的可用连接,避免了数据库连接初始化和释放过程的时间,从而缩减了系统整体相应时间。
3、统一的连接管理,避免数据库连接泄露:在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接,从而避免了常规数据库连接操作中可能出现的额资源泄露。
引擎种类,区别
1.MyISAM : 是旧版本mysql的默认引擎,现在默认引擎是InnoDB。MyISAM引擎的主要特点就是快,没有事务处理操作,也不支持外键操作。适合于多读取插入,少更新删除的操作表。存储数据分成三个文件:.frm(存储表定义) .MYD(存储数据) .MYI(存储索引)
用法: engine=myisam default charset=utf-8 ;
2.InnoDB :是新版本mysql的默认引擎,支持事务处理和外键,但是其缺点几就是慢了些。存储方式分为两种:1.共享表空间存储。[.frm(表结构) 和 innodb_data_home(数据)和innodb_data_file_path(索引)] 2.多表空间存储。 [.frm(表结构) 和 .idb(数据) ]。
索引
数据结构
mysql的数据是存储在磁盘上的,满足对日常操作【CRUD】的高效稳定,可以通过提升硬件配置来解决。选用合适的数据结构也很关键,innodb
采用的就是一种名为【B+树】的数据结构。
我们之前学习过的innodb数据是以【行】为单位,存在一个大小为16k【页】中,B+树的作用就是按照一个组织形式,将所有的【页】组织关联起来。
B-树
Balance(平衡),类似一种平衡二叉树。
B-树的特点:
-
所有的键值分步在整棵树中;
-
任何一个关键字出现且只出现在一个结点中
-
搜索有可能在非子结点结束
-
在关键字全集内做一次查找,性能逼近二分查找
B+树
是B-树的变体,是一种多路搜索树。
特点:
-
所有的关键字都存储在子结点
-
为所有的子结点增加了一个双向指针
选择使用B+树的原因:
-
相同的空间,不存放【整行数据】就能存【更多的id】,B+树能使每个结点能检索的【范围更大、更精确、极大的减少了I/O操作,层高较低,通常3到4层就可以支持百万级的数据量】
-
Mysql是关系型数据库,B+树子结点增加了双向指针,加强了区间的方文星,可以在范围内查询。
查询相同的记录,使用【id列】比使用【非主键列】快几百倍!!!
-
使用主键列查找数据时,可以利用B+树的特定,自上向下查询
-
使用非主键列只能从子结点进行【全表扫描】,一个一个的比较。
索引的分类和创建
聚簇索引和非聚簇索引
【主键和数据】共存的索引被称之为【聚簇索引】。
【username和数据】建立的索引【非聚簇索引】。
聚簇索引只有在innodb引擎中才存在,再MyIsam中是不存在的。
Innodb使用的时
聚簇索引
,他会将主键组织到一颗B+树中,而行数据存储在叶子结点上,如果使用的是
where id=1
这样的条件查询主键,按照B+树的检索算法来查找对应的叶子结点,获得行的数据。
如果对username
列进行搜索,并且username列已经建立索引,需要两个步骤:
-
第一步在非聚簇索引中检索username,到达其子结点获取对应的主键
-
第二步使用主键在聚簇索引B+数中再执行一次B+树检索操作,最后达到叶子结点集合获取整行的数据。
MyIsam使用的是非聚簇索引。
普通索引
创建索引:
-- 给username整列添加索引 create index idx_user_name on user(user_name); -- 给email可以截取前几个字符 create index idx_email on user(email(5));
创建索引本身是一个非常耗资源的操作。
创建索引之后,查询效率会显著提升。
删除索引:
drop index idx_user_name on user;
修改索引:
-- 通过修改的方式来添加索引
ALTER table user add index idx_email (email)
-- 在创建表的同时创建索引
CREATE table student (
sid int,
sname varchar(20),
gender varchar(1),
index idx_sid (sid)
);
唯一索引
对列的要求:索引列的值不能重复。
创建唯一索引:
-- 创建唯一索引
create unique index idx_email on user(email);
-- 也可以通过修改的方式添加唯一索引
ALTER table user add unique index idx_email (email)
唯一索引和主键的区别:
唯一索引列允许空值,主键列不能为空
主键列在创建时,已经默认为非空+唯一索引
主键可以被其他表引用为外键,但是唯一索引不能用为外键
一个表只能有一个主键,但是可以创建多个唯一索引
主键更适合不容易更改的标识,如:身份证号,自增
唯一约束和唯一索引的区别:
都可以实现数据的唯一,数据都可以为null
创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束时会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。
创建一个唯一索引,这个索引就是一个独立的索引,是可以单独删除
建议,如果想要让索引和约束单独存在,先建立唯一索引,再建立唯一约束。
使用索引的问题
哪些情况下适合建立索引
-
频繁作为where条件语句查询的字段
-
关联字段需要建立索引
-
分组,排序字段可以建立索引
-
统计字段可以建立索引
哪些情况不适合建立索引
-
频繁更新的字段
-
where条件中用不到的字段
-
表数据可以确定比较少
-
数据重复且发布比较均匀的资源
-
参与列计算
索引失效
-
如果查询条件中有or,除非全部条件都有索引。
-
复合索引不满足最左原则
-
like查询以“%”开头
-
存在列计算
-
如果mysql使用全表扫描比使用索引快:结果量很大。
-
列存在类型转换
Web前端
post和get的区别
GET请求参数是通过URL进行传递的,POST请求的参数包含在请求体当中。
GET请求比POST请求更不安全,因为参数直接暴露在URL中,所以,GET请求不能用来传递敏感信息。
GET请求在url中传递的参数是有长度限制的(在HTTP协议中并没有对URL的长度进行限制,限制是特定的浏览器以及服务器对他的限制,不同浏览器限制的长度不同。),POST对长度没有限制。
GET请求参数会完整的保留在浏览器的历史记录中,POST请求的参数不会保留。
GET请求进行url编码(百分号编码),POST请求支持多种编码方式。
GET请求产生的URL地址是可以被bookmark(添加书签)的,POST请求不可以。
GET请求在浏览器回退的时候是无害的,POST请求会.再次提交数据。
GET请求在浏览器中可以被主动cache(缓存),而POST请求不会,可以手动设置。
双向绑定 城市天气思路
首先需要获取所有省的数组,通过遍历得到省
需要根据省份的adcode值与你选择的省份值进行对比,然后得到所有市的数组,获取市的数组、再进行遍历得到市
最后获取所有(县、镇)的数组,必须根据所在省、所在市才可以得到县、镇
JavaWeb
http状态码
200(成功)服务器已成功处理了请求
400(错误请求)服务器不理解请求的语法
403(禁止)服务器拒绝请求
404(未找到)服务器找不到请求网页
500,(服务器内部错误)服务器遇到错误,无法完成请求
http和https
-
http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。
-
https协议:是具有安 全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。
-
http协议:http的连接很简单,是无状态的。
-
https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
-
http协议:使用的端口是80。
-
https协议:使用的端口是443.
-
http协议:免费申请。
-
https协议:需要到ca申请证书,一般免费证书很少,需要交费。
cookie和session***
Session存在服务器,Cookie可以存储在浏览器
session能够存储任意的java对象,cookie只能存储String类型
Session比cookie更具安全性
session没有大小限制,cookie保存的数据不超过4k,只能服务器内存的大小有关
session占用服务器性能,session过多,增加服务器压力