赞
踩
byte,short,int,long,float,double,char,boolean
jdk是java开发工具包,如果开发java程序必须先安装jdk,包括jre和开发工具
jre是java运行环境,包括jvm
jvm是java虚拟机,不能单独安装
封装、继承、多态
面向对象:看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
这里强调的是问题里的对象,在对象的角度解决问题。
面向过程:看名字它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个个过程),等方法执行完了,事情就搞定了。
这里强调的是问题的步骤,按照什么执行步骤解决问题,和对象无关
继承就是子类继承父类,子类拥有父类非私有化的性质,包括变量、方法、代码块等。
实现就是对类功能的扩展,是类实现一系列的功能,也可以说是这个类实现某个(某几个)接口,遵守某个(某些)规范。
接口的常量修饰符是:public static final 常量类型 常量名
接口的方法修饰符是:public abstract 返回值类型 方法名
String底层是通过char数组实现的,char数组和String这个类都是通过final修饰的,所以不可变。
区别:
关于接收值不一样,可以从默认值解释
==
表示的是两个数值是否相等,当引用数据类型的引用变量存的是地址值,使用 ==
进行比较比较的是地址值是否相等,比较引用对象的值是否相等要使用equals
进行比较
补充:因为equals
方法是属于Object类的,其方法内部是使用的==
实现的,类对象进行比较时要确保这个类重写了equals方法,否则还是使用了==
进行比较
重写是发生在继承上,子类重写父类的方法,当子类需要对父类的方法进行扩展时,进行重写这个方法。重写要求与父类方法的返回值类型,方法名,参数列表完全一致。子类不能重写父类final方法,必须重写abstract方法
重载:在一个类中,方法名相同,参数列表不同(参数列表包括参数个数,参数类型)
equals,String是引用数据类型,比较值使用equals
使用substring方法,第一个参数表示开始截取的索引位置,第二个参数表示截止的位置,字符串索引从0开始,遵守左闭右开的原则。第二个参数不写表示从起始位置截取到字符串最后。
也可以使用split方法,参数表示使用正则表达式,根据正则表达式截取的字符串会返回一个字符数组。
substring(int beginIndex,int endIndex);
substring(int beginIndex);
split(String regex);
SimpleDateFormate
这个类对象的format方法是格式化日期,parse方法是字符串转换为日期
示例:
//日期转换为指定格式的字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String text = sdf.format(date);
//把字符串转换为日期
text = "2068年5月12日 8:28:58";
SimpleDateFormat anotherSdf = new SimpleDateFormat("yyyy年M月dd日 H:mm:ss");
date2 = anotherSdf.parse(text);
ArrayList,LinkList,HashSet
存储特点:有序,可重复。存储顺序与添加顺序一致,可以存储重复的数据
存储特点:无序,不可重复。存储顺序与添加顺序可能不一样;不能存储重复(通过equals()方法来判断)的数据
Map是按<键,值>对的形式存储数据,Map的key不允许重复
容量满时,再add会进行扩容。当容量满时进行扩容。底层是数组,先将原数组复制到一个内存空间更大的数组中,在将新添加的元素添加到新数组中,这个内存空间更大的数组,它的大小是原数组的1.5倍。它的底层扩容方法是grow方法,最关键的一句是 int newCapacity = oldCapacity + (oldCapacity >> 1);
,其中oldCapacity >> 1
表示原来长度的一半,这个等式就是新数组长度是原数组长度的1.5 倍。
HashMap的加载因子是0.75,当键值对的数量 > 容量 * 加载因子 时,扩容,按照2倍大小扩容
当链表容量大于8时,自动转换成红黑树
哈希碰撞就是两个值同时存放到哈希表的同一个位置,这时产生冲突,这就是哈希碰撞。
通过使用链址法。
哈希表本身是一个数组,将数组元素采用链表。当两个元素存放到哈希表的同一位置时,先遍历链表中的节点,如果有节点的key与当前键equals相等,就用新的值覆盖旧的值;如果没有相等的节点,则新创建一个节点插入到链表的尾部。
链址法,开放定址法,再散列法
不是。HashTable,Properties(继承自HashTable),CurrentHashMap。
方法自己调自己。在方法内部添加判断条件,满足则停止,不满足继续调用自己。
首先被volatile修饰的变量有两个特性:
可见性就是在多线程环境中,共享变量的操作对每个线程都是内存可见的,每个线程都可以获取到volatile修饰变量的最新值,每个线程修改volatile修饰的变量会被直接刷新到主存中。
禁止指令重排序:
在P2P项目中,比如在用户投资到期后需要给用户回款,此处我们使用了多线程,加快整个回款的速度,我们先从数据库获取所有待回款的数据,然后创建一个线程池,每个回款是一个线程,将这些回款线程提交到线程池中执行,从而充分利用服务器的CPU资源快速为用户回款;
(前三个要记住)
corePoolSize:核心线程数
queueCapacity:任务队列容量
maxPoolSize:最大线程数
keepAliveTime:线程空闲时间
allowCoreThreadTimeout:允许核心线程超时
rejectedExecutionHandler:任务拒绝处理器
线程池按以下行为执行任务:
四种
继承thread类,重写run方法;
实现runable接口,重写run方法;
callable接口,重写call方法;
使用线程池(有返回值)
(1)Runnable接口无返回值,callable有返回值
(2)Runnable不能抛出异常,callable可以抛出异常
(3)Runnable重写run方法,callable重写call方法
就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
3种阻塞对列:
BlockingQueue<Runnable> workQueue = null;
workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界
workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界
workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界
4种拒绝策略
RejectedExecutionHandler rejected = null;
rejected = new ThreadPoolExecutor.AbortPolicy();//默认,队列满了丢任务抛出异常
rejected = new ThreadPoolExecutor.DiscardPolicy();//队列满了丢任务不异常
rejected = new ThreadPoolExecutor.DiscardOldestPolicy();//将最早进入队列的任务删,之后再尝试加入队列
rejected = new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到线程池失败,那么主线程会自己去执行该任务
5种线程池
ExecutorService threadPool = null;
threadPool = Executors.newCachedThreadPool();//有缓冲的线程池,线程数 JVM 控制
threadPool = Executors.newFixedThreadPool(3);//固定大小的线程池
threadPool = Executors.newScheduledThreadPool(2);//一个能实现定时、周期性任务的线程池
threadPool = Executors.newSingleThreadExecutor();//单线程的线程池,只有一个线程在工作
threadPool = new ThreadPoolExecutor();//默认线程池,可控制参数比较多
高内聚就是说相关度比较高的部分尽可能的集中,不要分散
低耦合就是说两个相关的模块尽可以能把依赖的部分降低到最小,不要让两个系统产生强依赖
耦合是两个事物(对象之间,模块之间)之间的相互作用、相互影响的程度,也是两者之间的依赖关系。
耦合强度,依赖于以下几个因素:
1、一个模块对另一个模块的调用;
2、一个模块向另一个模块传递的数据量;
3、一个模块施加到另一个模块的控制的多少;
4、模块之间接口的复杂程度。
隔离级别四种:读未提交,读已提交,可重复读,串行化
事务隔离级别 | 说明 | 脏读 | 读已提交(不可重复读) | 幻读 |
---|---|---|---|---|
读未提交(read-uncommitted) | 读取数据的事务对象,可以读取到另一个事务对象尚未提交的数据 | 是 | 是 | 是 |
读已提交(read-committed) | 读取数据的事务对象,只能读取另一个事务对象提交过后的数据 | 否 | 是 | 是 |
可重复读(repeatable-read)(默认) | 读取数据的事务对象,在另一个事务对象提交前后读取的内容要保持一致 | 否 | 否 | 是 |
串行化(serializable) | 串行读取 | 否 | 否 | 否 |
脏读:事务A读取事务B更新的数据但未提交的数据,事务B回滚,事务A读取的是脏数据
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
不可重复读:事务A多次重复读取一条数据,事务B在事务A读取过程中对数据进行更新提交,导致事务A多次读取的同一数据时,结果不一样,
总结:不可重复读和幻读容易混淆,不可重复读侧重修改,幻读侧重新增和删除;解决不可重复读只需要锁住满足条件的行,解决幻读需要锁住表。
通过执行计划查看查询语句是否使用了索引
explane sql语句
行级锁:
表级锁:
由于Innodb引擎支持的均为行锁,所以意向锁其实不会阻塞除全表扫描之外的任何请求
存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,减少数据在数据库和应用服务之间的传输,对于提高数据处理的效率是有好处的。
存储过程和函数允许包含DDL语句,也允许使用事务,还可以调用其他的存储过程和函数,但不允许执行 Load Data Infile 语句
存储过程和函数的区别在于 函数必须有返回值,而存储过程没有,存储过程的参数可以使用IN、OUT、INOUT类型,而函数的参数只能是IN类型的。如果有函数从其他类型的数据库迁移到MySQL,可能需要将函数改造成存储过程。
使用Power Designer
来创建表
第一范式:要求有主键,数据库中不会出现重复记录,每个字段是原子性不可再分
第二范式:在第一范式的基础上,非主键字段完全依赖主键字段,没有部分依赖
第三范式:在第二范式的基础上,非主键字段不产生传递依赖
IoC 就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI 依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖 IoC 容器来动态注入对象需要的外部资源。
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为 “切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。AOP 实现的关键在于 代理模式
spring框架使用的di这种技术,实现ioc的功能。 spring底层创建对象,赋值属性使用的是jdk中的反射机制
Sring 的AOP和IoC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。
DispatchServlet
#
:占位符,告诉 mybatis 使用实际的参数值代替。并使用 PreparedStatement 对象执行 sql 语句, #{…}代替sql 语句的“?”。 可以避免SQL注入,这样做更安全,更迅速,通常也是首选做法。
$
:字符串替换, 告诉 mybatis 使用
包
含
的
“
字
符
串
”
替
换
所
在
位
置
。
使
用
S
t
a
t
e
m
e
n
t
把
s
q
l
语
句
和
包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和
包含的“字符串”替换所在位置。使用Statement把sql语句和{…}的内容连接起来(相当于是String字符串中的+号),有SQL注入的风险。主要用在替换表名,列名,不同列排序等操作。
下拉框查询,用户不可更改的数据时可以使用,像下拉框选择
<select id="selectLikeTwo" resultType="com.bjpowernode.domain.Student">
select * from student where name like "%" #{name} "%"
</select>
If,where,foreach标签
Mybatis之动态SQL
自动移除没有选择的and
配置文件,有个配置类,简化配置文件,@bean标识方法,那么类用什么标识?@Configuration
@SpringbootApplication入口类会自动扫描自包。
通过@SpringBootApplication中的子注解@SpringBootConfiguration扫描加载
将前缀修改成:spring.thymeleaf.prefix=classpath:/template2/
相同目录下,application.properties文件的优先级大于application.yml。
不同目录下的配置文件优先级从高到低顺序:(高优先级配置会覆盖低优先级配置,多个配置文件互补)
@SpringBootApplication
子注解:
@SpringBootConfiguration:加载配置
@EnableAutoConfiguration:启动配置
@ComponentScan:扫描组件
string,set,zset,list,map
String:简单的键值对存储,存储短信验证码,配置信息等
哈希:结构化对象,比如存一个对象;一般key存ID或者唯一值,它的value就存放详情信息,比如:商品详情,新闻详情、个人信息详情等
list:列表类型的数据结构,比如粉丝列表、文章评论列表。根据时间排序,存储一些有序且数据相对固定的数据,比如字典表、省市区表等。
zset:去重但可以排序,用于排行榜
set:并集、交集、差集的操作,比如将两人的粉丝列表合并成交集,查找两人的共同好友
java:
redisTemplate.opsForValue().set(String key,value,int timer,TimeUnit.SECONDS);
redis 命令:
set key value time seconds
持久化就是将内存中的数据写入到磁盘中去,防止服务宕机造成数据丢失
redis提供了两种解决范式RDB(默认)和AOF
RDB:就是将一定时间内的内存数据以快照形式保存到硬盘中,生成对应的文件dump.rdb,通过配置文件中的save参数来规定快照的周期
AOF:就是将每一条写指令写入到一个日志文件中,重启redis时会重新加载这个日志文件来恢复数据。这个文件默认叫appendonly.aof
两者比较:
RDB加载速度快,会有数据丢失,适用于数据要求不严谨时
AOF加载速度慢,不会有数据丢失。
了解,redis是非关系型数据库,用来缓存数据,减轻数据库压力,常用于存储数据库中不可变数据或者临时数据。
redis同时使用的定期过期和惰性过期
附赠:redis面试汇总
RabbitMQ
cd cp ps -ef | grep … unzip vim gcc instal mkdir kill
管道就是用“|”连接两个命令,将前面一个命令的输出作为后面命令的输入,用于把管道左边的输出作为右边的输入
top -bn 1 -i -c
kill -9 进程号
ps -ef | grep java
<parent>
标签指明父项目gav坐标。<groupId>/<artifactId>/<version>
)<packaging>
)<properties>
)<dependencies>
)<resources>
)<plugins>
)代码有注解,驼峰命名法
<c:foreach>
<c:if>
<c:set>
<c:where>
jstl常用标签详解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。