1.string,stringbuffer,stringbuilder的区别
执行效率:stringbuild>stringbuff>string
String类是不可变类,任何对string的改变都会引发新的string对象的生成
StringBuffer类是可变类,任何对它所指代字符串的改变都不会产生新的对象,线程安全。
StringBuilder类是可变类,线性不安全,不支持并发,不适合多线程,但在但单线程中性能比stringbuffer 好
栈:存放基本类型的变量数据和对象引用
常量池:存放基本类型常量以及字符串常量
对堆:存放所有new出来的对象
String不属于8种基本数据类型,String是一个final类
1.基本数据类型,也称为原始数据类型
Byte,short,char,int,long,float,double,Boolean,用比较的是值
2.复合数据类型
用进行比较的时候,比较的是他们在内存中的地址,
https://blog.csdn.net/a4171175/article/details/80388620
2.ArrayList与Vector的区别
List接口下一共实现了3个类:ArrayList,Vector,LinkedList
LinkedList主要保持数据的插入顺序时使用,采用链表结构
ArrayList,Vector主要区别为以下几点:
(1)Vector是线程安全的,而ArrayList不是,Vector效率低
(2)ArrayList和Vector都采用线性连续存储空间,存储空间不足时,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍
(3)Vector可以设置容量增长参数,而ArrayList不可以
3.HashMap和HashTable的区别
https://blog.csdn.net/wangxing233/article/details/79452946
2、Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。
HashTable出现早,但现在基本上已经弃用。HashTable现已基本被弃用,reason:HashTable是线程安全的,效率低。另一方面HashTable没有遵守驼峰命名法。
3、HashMap和Hashtable不仅作者不同,而且连父类也不一样。HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类,不过它们都同时实现了map、Cloneable、Serializabe三个接口。4、对外提供的接口不同,Hashtable比HashMap多提供了elements()和contains()两个方法。5、Hashtable既不支持Null key也不支持Null value.
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null.当get()方法返回null时,可能是HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap()中不能由get()方法来判断HashMap中是否存在某个键,而用containsKey()方法来判断。
6、Hashtable是线程安全的,每个方法中都加入了同步方法。多线程并发的环境下,直接用HashTable,不需实现同步。HashMap线程不安全,多线程并发下,会产生死锁等,使用时自行增加同步。但是HashMap效率比较好。
7、HashTable、HashMap都使用了Iterator。
8、初始容量大小和每次扩充容量大小的不同
Hashtable默认的初始大小为11,之后每次扩容为原来的2n+1.HashMap初始16,之后每次扩2倍。
给定初始容量,HashTable直接使用,而HashMap扩充为2的幂次方大小。
9、计算hash值的方法不同
根据元素的KEY计算出一个hash值,然后再用这个hash值来计算的到最终的位置。
HashTable直接使用对象的hashCode.hashcode是根据对象的地址或者字符串计算出来的int类型的数值。最后再进行除留余数,进行除法,就比较耗时。
HashMap为了提高计算效率,将哈希表的大小固定为2的幂,这样在取模预算时,不用做除法,,只要位运算。但增加了冲突。
4.java多线程的实现方式
https://blog.csdn.net/king_kgh/article/details/78213576
大体上看实现方式主要有两种,一是继承Thread类,而是实现Runnable类接口
主线程肯定会run,多创建几个线程一起执行就会多线程run.
系统所展现出的线程名都是Thread-数字,那么我们能否用自己的名字呢,可以,只需重写传入名字参数的构造方法即可。
实现Runnable接口
(1)定义一个类实现Runnable接口,作为线程任务类
(2)重写run方法,并实现方法体,方法体的代码就是线程所执行的代码
(3)定义一个可以运行的类并在main方法中创建线程任务
(4)创建Thread类,并将线程任务类作为Thread类的构造方法传入
(5)启动线程
使用内部类
只用一次,不需要新建类
定时器
基于线程的工具类,定时执行某种方式
带返回值的线程实现方式
(1)创建一个类实现Callable接口,实现call方法。
(2)创建一个FutureTask,指定Callable对象,做为线程任务
(3)创建线程,指定线程任务
(4)启动线程
基于线程池的方式以及spring的@Async
Java中的传参问题
Java中没有真正的引用传递,只有值传递!
传引用参数指的还是原来的那个引用。
在java中只有基本类型和按下面这种方式定义的String是按值传递的string str=”1”,其他都是引用传递。
Spring依赖注入原理
Spring依赖注入又称为控制反转。其内涵是,将创建某个bean的控制权力,由原来需要引用这个bean的bean转移(反转)到外部的spring IOC容器,由IOC容器统一创建,并注入到需要引用的bean中去。Spring的本质就是一个工厂,生产我们需要的各种各样的bean,在生产过程中,需要解决bean之间的依赖关系。依赖注入是beanFactory生产bean时为解决bean之间的依赖的一种技术而已。但一般不直接使用BeanFactory,
Spring注入的对象必须可以实例化。
Spring的dao、service、controller、view层
Dao层就是实现与数据库的表之间的对应,service实现接口,service调用定义的接口实现逻辑,view层前端显示。
Java里的拦截器:
Java里的拦截器是动态拦截Action调用的对象,提供一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行。
https://www.cnblogs.com/austinspark-jessylu/p/7453302.html
sql语句:
https://www.cnblogs.com/ss561/p/4620858.html
创建数据库
Create database[if not exists] db_name
删除数据库
Drop database db_name
修改数据库编码
Alter database db_name character set 编码集
切换数据库
Use db_name
创建数据库表(列名 类型(长度),列名 类型(长度))character set编码集
字符串varchar , char对应string,前者是长度可变经常使用,后者长度固定的性能较好。
大数据类型Blob(存放字节文件),TEXT后者存储字符文件
数值型TINYINT、SMALLINT、BIGINT、FLOAT、DOUBLE分别对应byte、short、int、float、double
逻辑型BIT
日期型 DATE、TIME、DATETIME、TIMESTAMP
单表的约束
主键的约束;唯一标识一条记录,主键不能为空不能重复,主键为数字则一般设置主键自动增长auto_increment primary key
唯一约束 该字段内容不允许重复 unique
定义非空约束:值不能为空 not null
数据表修改
Alter table 表名 add 列名 类型(长度) 约束;//增加
Alter table 表名 modify 列名 类型(长度) 约束;//修改
Alter table 表名 drop 列名//删除
修改已有数据表一列的名称
Alter table 表名 change 旧列名 新列名 类型(长度)约束
修改表名 rename table 旧表名 to 新表名
Show tables
CRUD语句
Insert into 表名(列名,列名,……)values(值,值……)
若省略列名则需要按顺序插入
Update语句
Update 表名 set 列名=值,列名=值where 条件语句
Delete语句
Delete from 表名 where 条件语句
删除不能删除某一列的值,只能删除某一行,不加where则删除所有行,不删整张表
表的删除用truncate,将表删除,不可恢复,
Select语句
Select * from 表名查看表中所有的数据
Select 列名 from 表名 查看表中的列数据
Select distinct 列名 from 表名查看表中列的数据,不重复
查询时进行
Select 列名运算表达式 from表名
Select 列名 as 列别名 from 表名
Select语句中的常用运算符
< <= >= = <>不等于
Between …and…
In()在几个固定值中取值
Like 模糊查询结合%通配符和_通配符使用,%表示任意长度字符串,_表示单个字符
查询时进行排序order by 语句
Select * from 表名 where 条件语句 order by 列名 asc|dsc,列名 asc|dsc
Asc是升序,dsc是降序
分组函数----结合查询分组进行数据统计
Count()返回查询结果记录的条数
Select count() from scores where math>90;返回数据成绩大于90的记录共有多少条
Sum(列名) 对一列的数据求和
Avg对列数据求平均值,对于null值是不参与运算的
Max,min对一列数据求最值
分组
分组的目的是为了统计,分组的前提是有重复数据
Group by 语句,where不能与group by语句同时使用
Having关键字,添加分组查询的条件