1.什么是java的反射机制?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
2. get和post请求的区别?
URL地址长度不同, GET支持的字符少
GET的密码是明文,安全问题,容易受到黑客攻击
GET只传输文本,不支持文件传输
GET方式通常用来查询,不用来修改数据,是幂等操作,修改数据用POST
IoC的优点是什么?
可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。
3.Interface与abstract类的区别?
abstract class 在Java中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
在abstract class 中可以有自己的数据成员,也可以有非abstarct的方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的方法都是public abstract的。
抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。接口中定义的变量默认是public static final 型,且必须给其赋初值,所以实现类中不能重新定义,也不能改变其值。
abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
abstract class 和 interface 是 Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系。
4.IoC的优点是什么?
可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。
5.springboot的搭建步骤?
1.New Maven project 下一步
2.选中Group Id为org.apache.maven.archetypes,Artifact Id为maven-archetype-quickstart的项 下一步
3.Group Id,填写组织id(公司域名反写,例如com.oracle)
4.Artifact Id,填写模块名称(例如music,news,springboot…) 完成
5.找到pom.xml,删除
junit
junit
3.8.1
test
注意:是dependency,不是dependencies
6.删除src/test/java目录下的java测试文件
-------------------------------------maven工程搭建完成
7.在maven工程当中集成springboot
添加springboot需要的jar包:
7.1 在pom.xml的dependencies前(外)面加入
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
用于设置springboot启动器的版本
7.2 在pom.xml的dependencies里面加入
<!-- Springboot核心jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web开发包:包含Tomcat和Springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 热布署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
-------------------------------------springboot集成完成
添加mybatis需要的jar包:
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
-------------------------------------mybatis集成完成
添加视图需要的jar包(jsp和thymeleaf二选一即可):
<!--集成jsp: tomcat支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- 集成jsp:jstl标签库 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--集成thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
------------------------------------视图集成完成(再次强调jsp和thymeleaf二选一即可)
添加连接数据库需要的jar包(mysql和oracle二选一):
<!--mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
oracle需要注意,oracle官方并未开放授权下载,需要手动下载添加:
步骤:1.打开maven资源库,默认是 windows的用户目录/.m2/repository
以我的为例:C:\Users\闫飞\.m2\repository
2.找到com\oracle\ojdbc6\11.2.0.4.0目录,如果不存在,则新建它们!
3.拷贝ojdbc6.jar到此目录下,并改名为ojdbc6-11.2.0.4.0.jar。其中11.2.0.4.0为版本号。
4.加入依赖:
<!--oracle -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
------------------------------------集成完成(再次强调jsp和thymeleaf二选一即可)
8.创建所需的包
8.1 在src/main/java/Group Id.Artifact Id包下创建controller,entity,model.dao,model.service,util等包
说明:Group Id见第3点,Artifact Id见第4点
8.2 在工程上右键,新建Source Folder,在Source Folder一项填写:src/main/resources
说明:此文件夹用于存放所有的xml,properties等配置文件(也就是以前在src目录下的那些配置文件)
8.3 在工程上右键,新建Source Folder,在Source Folder一项填写:src/main/webapp
说明:此文件夹用于存放所有的视图资源文件,例如jsp,html,js,images....(也就是以前的WebRoot,WebContent目录)
9.配置工程
9.1 在resources目录下新建application.yml文件
9.2 在application.yml文件当中写入(注意空格和缩进必须正确):
server:
port: 80
servlet:
context-path: /boot
#说明: 此项配置可以不配,port默认:8080,context-path默认:/
spring:
datasource:
url: jdbc:oracle:thin:@localhost:1521:orcl
driver-class-name: oracle.jdbc.OracleDriver
username: oracle
password: oracle
#说明: 如不使用数据库连接,此项配置可以不配(注意,不可少spring:前缀)
mvc:
view:
# 页面默认前缀目录
prefix: /jsp/
# 响应页面默认后缀
suffix: .jsp
#说明: 只有当视图选择jsp时才配置此项(注意,不可少spring:前缀)
thymeleaf:
cache: false
#enabled: true
#视图名称前的前缀(默认值:classpath:/templates/)
#prefix: classpath:/templates/
#说明: 只有当视图选择thymeleaf时才配置此项,此项所有参数均有默认值,也就是说这项配置可以全部不配,默认视图就是thymeleaf,此例当中仅仅是改变缓存为false(注意,不可少spring:前缀)
mybatis:
#mapper.xml文件所在地址
mapper-locations: classpath:com/oracle/entity/*Mapper.xml
#entity所在地址
#type-aliases-package: com.oracle.entity
#showSql
logging:
level:
root: info
com:
oracle:
model:
dao: debug
#说明: 此项配置可以不配,如需改变默认日志等级,以及添加mybatis的dao日志跟踪时配置
10.编写起动类(Group Id.Artifact Id.App)
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
6.final,finally,finalize的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
7.throes,throw,try,catch,finally分别代表什么意思?
throws为向上抛异常
throw程序出错时,手工抛出异常
try尝试执行,里面的语句可能出现异常,如出现异常需要处理
catch处理try中出现的异常
finally在try后执行清理操作,用于释放资源
8.JVM加载一个类的过程是什么?
- 查找当前ClassLoader中是否有此class的类对象,有则返回
- 若没有的话,向上递归所有的父ClassLoader中有无此class类对象,有则返回
- 若还没有,查找BootstrapClassLoader中有无此class类对象,有则返回
- 若还没有的话,使用findClass或resolveClass加载类对象
a. 读取class二进制文件
b. 根据字节数组生成Class对象
c. 缓存到当前ClassLoader中
9.String,StringBuffer和StringBuilder的区别?
这两个类都实现了CharSequence接口。
- 类型不同,因为不是一个类,也没有继承关系,做参数时不能共用
- String对象是不可变对象,不能修改值。而StringBuffer是可变对象,能修改值。
- 拼接字符串时,String会产生新对象,而StringBuffer只是增加新字符,不产生新对象,因此效率高。
- String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。
5.StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
10.在比较对象时,“==”运算和equals运算有何区别?
他们的区别主要存在在引用数据类型上
==为比较两侧的对象是否同一对象,是用内存地址来比较的
equals是方法,默认是用内存地址比较,重写后,主要是用来比较两侧的对象的值是否相同,和equals方法中的实现有关
==可以两侧都为null,但equals左侧的引用指向的对象不能空,不然有NullPointerException
除非需要比较两个引用指向的对象是同一对象,一般都使用equals方法进行比较。尤其是String之类的值对象,另外,常量尽量放在比较的左侧
11.a+=b 和a=a+b 的区别
在两个变量的数据类型一样时:a+=b 和a=a+b 是没有区别的。
但是当两个变量的数据类型不同时,就需要考虑一下数据类型自动转换的问题了。
也就是涉及到精度了。
12.3*0.1 == 0.3将会返回什么?True还是false?
false,因为有些浮点数不能完全精确的表示出来
13.float f=3.4;是否正确
不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 或float f = 3.4f
在java里面,没小数点的默认是int,有小数点的默认是 double;
14.short s1 = 1;s1 = s1 +1;有什么错误?
对于short s1 = 1;s1=s1+1; 来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。
15.都用过哪些数据库连接池?主要区别是什么?
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控
2 c3p0
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:c3p0.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,
此外不提供连接池监控。
16.MyIASM和Innodb两种引擎有何区别
MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
- 不支持事务,但是并不代表着有事务操作的项目不能用MyIsam存储引擎, 可以在service层进行根据自己的业务需求进行相应的控制。
- 不支持外键。
- 查询速度很快,如果数据库insert和update的操作比较多的话比较适用。
- 对表进行加锁。
大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题。大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。
17.MySQL中varchar和char的区别
varchar(M),M表示最大列长度,实际占用空间是字符串的实际长度加一。如varchar(50)定义了一个最大长度为50的字符串,
但实际插入的长度只有10个字符,那么存储的实际字符串是10个字符加一个结束字符。varchar在保存和检索时尾部的空格保留。
char(M)为固定长度字符串,当插入的字符串实际长度不足M时,插入空格进行保存。在进行检索时,尾部的空格会被去掉。
char是固定长度,对于存储空间不大,但是在速度上要求比较高的可以使用char,缺点是浪费存储空间。
18.数据库语句优化有哪些
- 程序优化,用PrepareedStatement进行增删改查
- 程序优化,尽量批量处理,避免逐条处理,减小IO数
- 查询结果不要用*来查询所有字段,要明确指明结果字段
- 减少多表连接数,尽量少的表进行连接
- 表连接时,尽量用主键进行连接或用唯一索引
- 表的查询多时,一定建立索引
- 根据查询条件,建立索引,如果查询条件不止一个时,使用组合索引
- 在查询条件表达式的左侧尽量不要使用函数,否则索引失效
- 如果不得不用函数,则建立函数索引
- 使用合适的索引,例如时间索引、哈希索引、聚簇索引
- 如果有like话,尽量避免%xxx%两侧都有%的条件,单侧%可以使用索引,多侧不可以
- 尽量不用数据库,使用缓存
- 可以考虑用nosql数据库提高效率
- SQL的条件表达式,在Oracle中,是按倒序使用索引的
- 如果用DDL改动了数据库表字段,需要重建索引,不然索引失效
- SQL尽量不要有多余的空格和换行
17.使用分布式数据库 - 合理创建表分区表空间
19.建立索引时字段不能有null值
20.使用数据库连接池
21.条件中与null比较索引无效
22.表结构改动时索引全部失效
19.数据库表怎么设计的?数据库范式?设计的过程中需要注意什么?
第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式。
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF):在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被唯一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
第三范式的要求如下:
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
20.死锁产生的条件,以及如何避免死锁,产生死锁后如何解决?
产生死锁的原因:
一.因为系统资源不足。
二.进程运行推进的顺序不合适。
三.资源分配不当。
并发运行的多个线程间彼此等待、都无法运行的状态称为线程死锁。(并发运行的线程分别占有对方需要的资源,但又都不肯首先释放自己占用的资源,这样导致并发的线程无法继续运行下去,而进入阻塞状态)
为避免死锁,在线程进入阻塞状态时应尽量释放其锁定的资源,以为其他的线程提供运行的机会。
public final void wait()
public final void notify() //唤醒一个指定的线程
public final void notifyAll()//唤醒所有等待的线程
死锁的预防
1:按照特定顺序加锁
2:代码双重判断检测死锁
3:给锁对象赋值唯一对象值判断
21.给定一个5位数,判断其是否为一个回文数?
void main()
{
int a;
printf(“请输入一个5位数”);
scanf("%d",&a);
(a/10000a%10&&(a/1000)%10(a/10)%10)?printf(“是回文数\n”):printf(“不是回文数\n”);
}