发表于: 2018-01-06 15:42:31

2 598


1.maven是什么,和Ant有什么区别?

Ant和Maven都是基于Java的构建(build)工具。理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷。

Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。

Ant特点

›没有一个约定的目录结构

›必须明确让ant做什么,什么时候做,然后编译,打包

›没有生命周期,必须定义目标及其实现的任务序列

›没有集成依赖管理

Maven特点

›拥有约定,知道你的代码在哪里,放到哪里去

›拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程

›只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情

›拥有依赖管理,仓库管理

当你将名字输在自己代码下方的时候,说明这个项目是你的产品,你必须对你的产品质量负责,对自己的良心负责。

2.clean,install,package,deploy分别代表什么含义?

clean:清除项目目录中的生成结果

install:在本地Repository中安装jar

package:根据项目生成的jar

deploy:将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

3.怎么样能让Maven跳过JUnit?

把下面这个写到 pom.xml 的<pluigins>里面

<plugin>

       <groupId>org.apache.maven.plugins</groupId>

       <artifactId>maven-surefire-plugin</artifactId>

       <configuration>

         <skip>true</skip>

       </configuration>

 </plugin>

另外,如果用idea自带集成的Maven的话,打包时不勾选include tests就行:

4.为什么要用Log4j来替代System.out.println?

在初始阶段,我用过很多System.out.println()的方法,将信息打印到控制台。但是当项目变大的时候,有时候一报错信息就是一长串,没有专门的文件来记录根本不知道发生了什么。log4j是用以记录日志的第三方插件,他的作用是将我们的日志保存到一个文件中而长久的存在。

5.为什么DB的设计中要使用Long来替换掉Date类型?

时间戳是系统底层的东西,有统一的标准;Date有好几种类型,而且又因时区、地区习惯而异。为了标准化,减少差错,增强可移植性,我们选用Long,用currentTimeMillis的方法生成Long类型的数据。

6.自增ID有什么坏处?什么样的场景下不使用自增ID?

缺点:举个例子, 在做分布式数据库时,要求数据同步时,这种自增ID就会出现严重的问题,因为你无法用该ID来唯一标识记录。同时在数据库做移植时,也会出现各种问题,总之,对此自增ID有依赖的情况,都有可能出现问题。

7.什么是DB的索引,多大的数据量下建索引会有性能的差别,怎样的情况下该对字段建索引?

转载了下面的这句话:

索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。

一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。

举个例子:

表中有一百万条数据,需要在其中寻找一条特定id的数据。如果顺序查找,平均需要查找50万条数据。而用二分法,至多不超过20次就能找到。二者的效率差了2.5万倍!

一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。

“什么样的情况下该对字段建索引?“当然需要用它搜索的时候就建立索引了,索引还分主索引,唯一索引(和主索引差在优先度上),普通索引等,要根据实际情况灵活使用。

8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了mysql对这个索引的管理工作,这个索引也因此而变得更有效率;二是mysql会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,mysql将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

因为考虑到重名的情况,本次我给name建立了普通索引,而给id创建了唯一索引,使用自增id作为主索引。在Main函数里面可以清楚地看到,我每次插入学员信息之前必须改变name的值,不然无法插入。

9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?

不,数据库可以处理。

10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?

方便在创建(insert)和更新(update)的时候赋值,这两个值的set方法应该要放在service层,不允许开发给外部调用的接口。

11.修真类型应该是直接存储Varchar,还是应该存储int?

1、int表示“基本整型”。 在内存中占4个字节,包含 -2^31 (-2,147,483,648) 到 2^31 - 1(2,147,483,647) 的整型数据

2、对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间

3、如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1

从字段类型的执行效率上,int最高,varchar最低。

int类型更容易建立索引和进行检索,毕竟数字类型是数据库检索的基础,char类型的毕竟需要经过转换,而varchar就更复杂了,其排序不仅需要转换和计算,还需要访问和遵循数据库的排序规则(实际上char也需要排序规则),而消耗的资源也更大。

12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?

字节的定义:字节(byte)是一种计量单位,8个二进制位为一个字节.表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。

字符的定义:字符是指计算机中使用的文字和符号,如:1、2、3、A、B、C、!、#、¥、.....、+、——等这些符号。

在UTF8编码中,一个英文字符占用一个字节,一个中文字符占用三个字节。

VARCHAR是可以保存长度可变的字符串。如:一个用户名字段不能确定长度,只知道不超过10个字符,就可以选择varchar类型。而另一种CHAR类型是只能保存长度固定的字符。如:六位的邮编、股票代码。

需要注意的是:

mysql数据库的varcahr类型在4.1以下版本中最大长度限制为255字节

mysql5.0以上的版本中varchar数据类型的长度支持到了65535字节。

Text和LongText 也是长度可变的类型

Text的最大长度是可以存储 65535 (2^16 – 1) 个字符

LongText的最大长度是可以存储4294967295 (2^32 – 1) 个字符。

13.怎么进行分页数据的查询,如何判断是否有下一页?

1.先通过SQL语句“select  count(*) from  表名 ” 查询表中的数据总条数z

2.假设每页显示m条数据,那么计算总页数p如下:z/m=y....n(n为余数),

     如果余数n!=0时,总页数p=y+1,如果余数n=0时,总页数p=y

3.在前台获取每一页数据时,控制台会去数据库离获取当页数据。

     这时使用的SQL语句是“select * from apple limit  a,b“查询第a条到第b条数据

4.判断下一页的步骤也省略了,在前面就直接算出来了总页数,我们是知道最后一页是哪一页

14.为什么不可以用Select * from table?

消耗资源太大,而且出来很多东西,要的不要的都有,看不清楚。实际项目中很多做到冷热数据分离,能有效提高效率。

15.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?

领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。贫血模型是指使用的领域对象中只有setter和getter方法(POJO),所有的业务逻辑都不包含在领域对象中而是放在业务逻辑层。

16.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法。

这种开发存在的问题是 new 的类实例不便于统一管理,spring 提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。

依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

spring 配置文件是什么?

Spring 配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用

什么是依赖注入?

依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。

你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

什么是bean装配?

装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

什么是自动装配?

Spring 容器能够自动装配相互合作的bean,这意味着容器不需要 constructor-arg 和 property 配置,能通过Bean工厂自动处理bean之间的协作

17.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?

JAVA只允许一个类只能继承一个抽象类,而一个类却可以继承实现多个接口。

接口与实现不分离,则只能继承一个抽象类,但有时候需要继承多个。

使用面向接口的设计思想,可以使代码更加灵活,耦合度更低。

18.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?

实际中,运行程序会发生各种异常,特别是一些运行中异常(RuntimeExecption)是无法避免的,我们用Try/Catch的方法,来为修复异常提供了一个可能性(虽然很少做得到),最不济也要及时捕获异常,观察异常发生的原因,方便调试。另外,有些异常不方便暴露给用户,应该在发送到客户端之前捕获下来,不然有可能造成隐患(暴露数据库结构什么的....)。

19.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?

--log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

[QC]是log信息的开头,可以为任意字符,一般为项目简称。

--log4j.appender.Console.File=D:\\Tomcat 5.5\\logs\\qc.log

此句为定义名为Console的输出端的文件名为D:\\Tomcat 5.5\\logs\\qc.log可以自行修改。

20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?

单步调试可以看到代码每一步执行的过程,其中包含了我们看不到后台调用。

21.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?

我们一般在本地写代码时,如果程序出现问题了,一般情况下,我们会在程序中打各种log,调试,找出问题,修改,测试,部署到服务器,再测试。但如果在真实项目中的呢,这样做虽然也可以,显然是不方便的。

真实项目中,我们可以通过远程连接的方式,进行调试

远程调试:服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。

1.远程调试适用于哪个阶段?开发?测试?线上?

(个人认为)适用于测试阶段,在线上肯定是不行的。很多人访问,都不知道调试的是哪个。开发阶段的话,一般是分功能模块的,每个人负责自己的模块,分开开发测试。远程调试,一般在于开发完成后的集中测试(功能衔接),这时项目已经部署到测试服务器上了。


明天要做的事情: 开始准备任务二。


今天的收获:对任务一进行了回顾。


返回列表 返回列表
评论

    分享到