[技术讨论] java技术总结

一、什么是MVC

MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。

MVC的优点:


1.耦合性低

2.重用性高

3.部署快,生命周期成本低

4.可维护性高

5.[服务器型号与双11]

MVC的缺点:

1.完全理解MVC比较复杂。

2.调试困难。

3.不适合小型,中等规模的应用程序

4.增加系统结构和实现的复杂性

5.视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问


二、什么是SSM?

SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层

使用spring MVC负责请求的转发和视图管理

spring实现业务对象管理,mybatis作为数据对象的持久化引擎


三、Mybatis的使用

ORM 对象关系映射 Object Relational Mapping

把持久化对象的保存、修改、删除等操作,转换成对数据库的操作

MyBatis 本来是apache的一个开源项目iBatis,然后改名为Mybatis。

MyBatis 是一款优秀的持久层框架,MyBatis的主要思想是将程序中的大量SQL语句抽出来,配置在文件中,以实现SQL的灵活配置

方法中的参数有多个时:

1.在映射文件中可以使用参数索引arg0,arg1…或者param1,param2…绑定参数

2.可以把多个参数组装成对象,在映射文件中#{属性名称}

3.可以把多个参数组装成map集合,在映射文件中#{map中的key值}

4.可以使用@Param注解进行参数绑定,在映射文件中用#{param注解中绑定的名称}

**#{}和KaTeX parse error: Expected 'EOF', got '#' at position 12: {}的区别?** 1.#̲{}在组装语句时,会替换成? …{}会把数值直接写在SQL语句中,数据上不会添加’’

5.[服务器型号与双11]

不能避免SQL注入

resultType和resultMap的区别

当查到的数据和对象中的属性对应不上时,需要自定义映射规则,使用resultMap其他的时候使用resultType

当数据库中查询出来的数据和属性不对应时:

1.给sql语句中的字段起别名

2.自定义映射规则resultMap

3..[服务器型号与双11]

Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许你选择使用哪一个组件,同时为J2EE应用程序开发提供继承的框架.简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架

Spring的核心

a)IOC:在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。

创建对象的三种方式:

1.根据类中无参构造方法创建对象

2.根据类中的静态工厂方法创建对象

通过静态方法来实例化一个对象,以后可以直接调用方法来实现

3.根据类中的实例化工厂方法创建对象

先创建类对象通过对象来调用创建实例对象的方法

对象的生命周期(单例模式下)

1.init-method初始化方法 在ClassPathXmlApplicationContext被初始化之后,被配置的bean对象也被初始化,然后放到map集合中

2.destroy-method销毁方法ClassPathXmlApplicationContext被销毁后,对应的map集合中的对象也会被销毁。注意,此时只针对单例模式的对象有效

3.如果scope设置成prototype,对象不是由ClassPathXmlApplicationContext来管理,生命周期也不会被管理

b)DI:依赖注入(给对象中的属性赋值),在spring中,a和b对象都是spring初始化并管理的,通过set方法注入或者constructor构造方法注入给b对象的引用

byName和byType:都是使用setter方法进行属性赋值

byName:根据属性名称匹配

在xml中找到和属性名称一样的bean对象,进行赋值

byType: 根据属性类型匹配

在xml中找到和属性类型一样的bean对象,进行赋值

四种注解类型:

@Component–表示一个自动扫描component 是其他三个的父类

@Repository–表示持久化层的DAO component

@Service–表示业务逻辑层的Service component

@Controller–表示表示层的Controller component

@Repository、@Service、@Controller三种注释是为了加强代码的阅读性而创造的,可以在不同的应用层中,用不同的注解

c)AOP:面向切面编程 Aspect-oriented programming通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术在不影响原来功能代码的基础上,使用动态代理加入自己需要的一些功能(比如权限的验证,事物的控制,日志的记录等),移除之后并不影响原来的功能面向切面编程是通过动态代理实现的,是面向对象思想的补充

面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面

1.面向切面编程提供声明式事务管理

2.spring支持用户自定义的切面

面向切面编程(aop)是对面向对象编程(oop)的补充,

面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。

AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,

是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

AOP的通知类型

before:在执行切入的方法之前,执行代码

after running:在执行切入的方法正常执行(没有异常之后)执行代码

after throwing:在执行切入的方法发生异常的时候,执行代码

after:在执行切入的方法无论是否发生异常,都必须最后执行代码

around:相当于before和after returning的组合

双11与服务器

五、SpringMVC的使用

SpringMVC的工作原理

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

Controller中方法的返回值

1.返回值为ModelAndView类型

请求转发的方式实现跳转,界面路径会经过视图解析器进行解析

可以向下一个界面传递参数

2.返回值为String类型

路径直接写文件名,

界面会经过视图解析器进行解析,不可以向下一个界面传递参数

写有redirect:前缀

使用重定向请求,请求路径不会经过视图解析器

springmvc会自动添加上下文路径

写有forward:前缀

转发请求,请求路径不会经过视图解析器

3.没有返回值

如果需要界面跳转,需要写原生代码进行跳转

一般处理下载时会使用

方法中的参数:

1.请求的参数数据名称要和方法的参数名称保持一致

请求的参数数据名称和方法的参数名称不一样时需使用@RequestParam("")注解或@RequestParam(name=“password”,request=true)request=true则必须有参数数据,如果没有传递参数会报异常defaultValue设置参数的默认值

2.多个参数时,可以把参数组装成对象

请求的参数名称和对象的属性名称一致

spring 的优点?

1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦

2.可以使用提供的众多服务,如事务管理,消息服务等

3.容器提供单例模式支持

4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

5.容器提供了众多的辅助类,能加快应用的开发

6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

7.spring属于低侵入式设计,代码的污染极低

8.独立于各种应用服务器

9.spring的DI机制降低了业务对象替换的复杂性

10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部

双11与服务器

六、什么是分布式开发?

分布式应用开发简单的说,是指将用户界面、控制台服务、数据库管理三个层次部署在不同的位置上。其中用户界面是客户端实现的功能,控制台服务是一个专门的服务器,数据管理是在一个专门的数据库服务器上实现的。


七、SpringBoot的使用

Spring Boot让我们的Spring应用变的更轻量化。Spring Boot可以让你更易上手,更简单快捷地构建Spring应用!

优点:

为所有Spring开发者更快的入门

开箱即用,提供各种默认配置来简化项目配置

内嵌式容器简化Web项目

没有冗余代码生成和XML配置的要求

缺点:

缺点是集成度较高,使用过程中不太容易了解底层。


八、SpringCloud的使用

Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

Spring Cloud 的优点:

1:约定优于配置

2:开箱即用、快速启动

3:适用于各种环境

4:轻量级的组件

5:组件支持丰富,功能齐全

spring cloud的组件:

(1)Spring Cloud Eureka(服务的注册与发现)构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者

(2)Spring Cloud Feign(服务消费者(rest+ribbon))

(3)Spring Cloud Hystrix(断路器监控)

(4)Spring Cloud Config(分布式配置中心)

(5)Spring Cloud Zuul(路由网关)

(6)断路由


九、数据库的分类

数据库分为:关系型数据库和非关系型数据库

关系型:mysql oracle sqlserver等

非关系型:redis,memcache,mogodb,hadoop等


十、MySql数据库的使用

请列举几种SQL优化的方法?

1:mysql所在服务器内核 优化;此优化可由系统运维人员完成

2:mysql配置参数优化(my.cnf);此优化需进行压力测试来进行参数调整

3:sql语句及表优化

①、当只要一行数据时使用 LIMIT 1

②、为搜索字段建索引

③、在Join表的时候使用相当类型的列,并将其索引

④、千万不要 ORDER BY RAND()

⑤、避免 SELECT *

⑥、永远为每张表设置一个ID

使用 ENUM 而不是 VARCHAR

⑧、尽可能的使用 NOT NULL

⑨、固定长度的表会更快

垂直分割

拆分大的 DELETE 或 INSERT 语句

越小的列会越快

左连接、右连接和内连接的区别是什么?

假设数据库中有A、B两张表

left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).B表记录不足的地方均为NULL.

Right join以右表(B)为基础的,A表不足的地方用NULL填充.

inner join并不以谁为基础,它只显示符合条件的记录

group by 和having的区别用法

where:数据库中常用的是where关键字,用于在初始表中筛选查询。它是一个约束声明,用于约束数据,在返回结果集之前起作用。如下面这个例子,从user表中查询出userDepartmentId等于2的数据

select * from dbo.user where userDepartmentId=2

group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。

在说group by的时候,我们还需要了解聚合函数,聚合函数是SQL语言中一种特殊的函数。例如:

count():获取数量

sum():求和(这里要注意求和是忽略null值的,null与其他数值相加结果为null,所以可以通过ifnull(xxx,0)将null的值赋为0)

avg():求平均数

max():求最大值

min():求最小值

这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

我们需要注意的是:在使用group by的SQL语句中,select中返回的字段,必须满足以下两个条件之一:

1.包含在group by语句的后面,作为分组的依据;

2.这些字段包含在聚合函数中。

从刚才的那个例子中,我们查询出每个城市,相同年龄的员工数量:

select city, count(),age from dbo.user where departmentID=2 group by city,age

having:用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。

查一张表如果查的慢,如何解决

1、查询如果慢的建立索引可以提升速度

2、避免对索引字段进行计算或类型转化

3、表的设计尤为重要,避免使用LEFT JOIN 或 RIGHT JOIN去联表查询

4、查询字段时不要全部返回,忌讳使用*,最好是用什么字段返回什么字段,也可使得相关业务更加清晰

5.(双11与服务器

十一、Oracle数据库的使用

MySQL和Oracle的主要区别:

Oracle是Oracle公司推出的一款成熟的数据库产品是闭源同时也是收费的。

SQL语法的不同,MySQL较为灵活,Oracle较为严格(具体就是单引号,分页的处理,主键的自动增长)

对于事务的支持。MySQL对于事务默认是不支持的,只有某些存储引擎中如:innodb可以支持。而Oracle对于事务是完全支持,不管是OLTP还是OLAT都是支持的。

MySQL是单进程多线程,Oracle是多进程(在Windows下也是单进程)

数据库和实例以及用户之间的关系。


什么叫视图?游标是什么?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。

触发器的作用?

触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。


十二、Redis缓存数据库的使用

启动后默认端口号 6379

Redis是为了解决在目前的互联网项目中经常面临的3个问题:

1.高并发2.高负载3.高可用

Redis有哪几种数据类型

字符串类型(String)

散列类型(hash)

列表类型(list)

集合类型(set)

有序集合类型(sorted set)

使用场景

缓存(数据查询,新闻,商品信息)(使用最多)

任务队列(秒杀,抢购)

分布式集群的 session分离

启动Redis服务/客户端

在 redis-4.0.1 中输入:src/redis-cli 命令启动 Redis 服务/客户端。

使用 ctrl + c 服务/关闭客户端。


十三、Tomcat的使用

Tomcat服务器优化(内存,并发连接数,缓存)

a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等。

b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.xml中配置,比如修改最小空闲连接线程数,用于提高系统处理性能等等。

c) 优化缓存:打开压缩功能,修改参数,比如压缩的输出内容大小默认为2KB,可以适当的修改。


十四、Nginx的使用

其特点是占有内存少,并发能力强。

功能:

静态HTTP服务器

Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。

反向代理服务器

客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。

负载均衡

将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。

Nginx可以通过反向代理来实现负载均衡。

虚拟主机

将多个网站部署在同一台服务器上,多个域名解析到同一个IP地址,但是用户通过多个域名却可以打开多个完全不同的网站,互相不影响,就像访问多个服务器一样


十五、Ajax的使用

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求

ajax的工作流程是什么

1.客户端产生js的事件

2.创建XMLHttpRequest对象

3.对XMLHttpRequest进行配置

4.通过AJAX引擎发送异步请求

5.服务器端接收请求并且处理请求,返回html或者xml内容

6.XML调用一个callback()处理响应回来的内容

7.页面局部刷新,

Ajax中常用的name数据:

async 布尔值,表示请求是否异步处理。默认是 true。

同步请求:发起请求之后,只能等待请求结束之后,才能做其他操作

异步请求:发起请求之后,不需要等待请求结束,就可以进行其他操作

url 规定发送请求的 URL。默认是当前页面。

type 规定请求的类型(GET 或 POST)。

data 规定要发送到服务器的数据。参数数据

dataType 预期的服务器响应的数据类型。

timeout 设置本地的请求超时时间(以毫秒计)。

success(result,status,xhr) 当请求成功时运行的函数。

error(xhr,status,error) 如果请求失败要运行的函数。

complete(xhr,status) 请求完成时运行的函数(在请求成功或失败之后均调用,即在 success 和 error 函数之后)。


十六、对多线程的理解

进程(Process):

独占资源的程序执行单位,每个独立运行的程序都对应一个进程,进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

线程(Thread):

线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

二者区别

一个程序运行后至少有一个进程,一个进程中可以包含多个线程

有三种方式可以用来创建线程:

继承Thread类

实现Runnable接口

应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

什么是死锁(deadlock)?

死锁概念及产生原理

概念:多个并发进程因争夺系统资源而产生相互等待的现象。

原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。

本质原因:

1)、系统资源有限。

2)、进程推进顺序不合理。

如何确保N个线程可以访问N个资源同时又不导致死锁?

使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

死锁产生的4个必要条件(全部满足才会造成死锁)

1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。

3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

避免死锁的方法

1、死锁预防 ----- 确保系统永远不会进入死锁状态

产生死锁需要四个条件,那么,只要这四个条件中至少有一个条件得不到满足,就不可能发生死锁了。由于互斥条件是非共享资源所必须的,不仅不能改变,还应加以保证,所以,主要是破坏产生死锁的其他三个条件。

A、破坏“占有且等待”条件

B、破坏“不可抢占”条件

C、破坏“循环等待”条件

2、避免死锁 ----- 在使用前进行判断,只允许不会产生死锁的进程申请资源

死锁避免是利用额外的检验信息,在分配资源时判断是否会出现死锁,只在不会出现死锁的情况下才分配资源。

两种避免办法:

1、如果一个进程的请求会导致死锁,则不启动该进程

2、如果一个进程的增加资源请求会导致死锁 ,则拒绝该申请。

避免死锁的具体实现通常利用银行家算法

死锁避免的优点:

不需要死锁预防中的抢占和重新运行进程,并且比死锁预防的限制要少。

死锁避免的限制:

必须事先声明每个进程请求的最大资源量

考虑的进程必须无关的,也就是说,它们执行的顺序必须没有任何同步要求的限制

分配的资源数目必须是固定的。

在占有资源时,进程不能退出

死锁的解除

1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。

2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。

a、终止所有的死锁进程。这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程前功尽弃。

b、逐个终止进程,直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。

线程调度的两种方式

线程调度是指按照特定机制为多个线程分配CPU的使用权.

分时调度

所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

抢占式调度

优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),java虚拟机采用抢占式调度模型。

线程生命周期

即线程在JVM中运行经历的过程,经历五个阶段:创建、就绪、运行、阻塞、终止。


Sleep() 和wait() 有什么区别?


sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。


什么是线程池

线程池 ,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

Sleep() 和wait() 有什么区别?

sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。


十七、对泛型的理解

什么是泛型?为什么要使用泛型?

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。参数化类型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,

操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

Java 泛型的参数只可以代表类,不能代表个别对象。由于 Java 泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型。Java 编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。Java 允许对个别泛型的类型参数进行约束,包括以下两种形式(假设 T 是泛型的类型参数,C 是一般类、泛类,或是泛型的类型参数):T 实现接口 I 。T 是 C ,或继承自 C 。一个泛型类不能实现Throwable接口。


十八、对集合的理解

集合与数组及字符串缓冲区的区别:字符串缓冲区的内存中只能存储字符串

数组和集合的区别:

1)长度区别:

数组长度固定

集合长度可变

2)内容的区别

数组可以存储同一种类型的元素

集合可以存储多种类型的元素

3)存储类型的区别

数组:可以存储基本类型,也可以存储引用类型

集合:只能存储引用类型

List、set、map的区别是什么

Collection集合有两个子集合List和set

HashMap和Hashtable都是Map接口的典型实现类

List:

1.list集合中的数据能重复(重复输出)

2.有顺序(存进去和取出来的顺序一样)

3.有索引

Set:

1.set集合中的数据不能重复(重复不输出)

2.没有顺序(存进去和取出来的顺序不一样)

3.没有索引

Map:(容器类)以键值对的形式存放数据

1.map中key值不能重复,重复时数据会进行覆盖

2.Map中数据是无序的

3.没有索引

ArrayList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口,他们有以下的不同点:

ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

相对于ArrayList,LinkedList的**,添加,删除操作速度更快,查找时速度慢。因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

HashMap和Hashtable有什么区别?

HashMap和Hashtable都是实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:

HashMap允许键和值是null,而Hashtable不允许键或者值是null。

Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。

一般认为Hashtable是一个遗留的类。


十九、对IO的理解

什么是流,按照传输的单位,分成哪两种流

字节流:InputStream OutputStream

字符流:Reader Writer

什么是比特(Bit),什么是字节(Byte),什么是字符(Char),它们长度是多少,各有什么区别

Bit最小的二进制单位 ,是计算机的操作部分 取值0或者1

Byte是计算机操作数据的最小单位由8位bit组成 取值(-128-127)

Char是用户的可读写的最小单位,在Java里面由16位bit组成 取值(0-65535)

什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作

对象序列化,将对象以二进制的形式保存在硬盘上

反序列化;将二进制的文件转化为对象读取

实现serializable接口(不想让字段放在硬盘上就加transient)


二十、Maven的使用

优点如下:

简化了项目依赖管理:

易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作

便于与持续集成工具(jenkins)整合

便于项目升级,无论是项目本身升级还是项目使用的依赖升级。

有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。

maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等

缺点如下:

maven是一个庞大的构建系统,学习难度大

maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。

当依赖很多时,m2eclipse 老是搞得Eclipse很卡。

中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。

Maven常用命令:

mvn –version/mvn -v显示maven安装版本信息

mvn clean清理项目打包文件,即项目下的target目录

mvn compile编译项目下的src/main/Java目录源代码

mvn package项目打包,在项目target目录下生成编译后的jar或war等文件

mvn install项目打包并发布到本地仓库

mvn deploy项目打包并发布到远程仓库

mvn test单元测试命令,执行src/test/java/下的junit的单元测试用例

mvn site生成项目相关信息的网站

m:eclipse将项目转化evn eclipseclipse项目

mvn dependency:tree打印出项目的整个依赖关系树

mvn archetype:generate创建一个maven普通java项目

mvn tomcat:run在tomcat容器中运行web应用,需要在pom文件中配置tomcat插件

mvn jetty:run在jetty容器中运行web应用,需要在pom文件中配置jetty插件


二十一、怎么进行数据库优化

① SQL语句及索引的优化

② 数据库表结构的优化

③ 系统配置的优化

④ 硬件的优化


二十二、如何理解三个范式?

1.对属性的原子性约束,要求属性具有原子性,不可再分解;

2.对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

3.对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。


二十三、什么情况下设置了索引但无法使用?

① 以“%”开头的LIKE语句,模糊匹配

② OR语句前后没有同时使用索引

③ 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)


二十四、网络协议有哪几个?

http 和https

HTTPS和HTTP的区别:

https协议需要到ca申请证书,一般免费证书很少,需要交费。

http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

http的连接很简单,是无状态的。

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。


二十五、事务

1.什么是事务

一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败就是将n个组成单元放到一个事务中

2.事务的特性

1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。

3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

3.隔离级别

1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决

2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的

3)repeatable read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的

4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表

4.事务的7种传播级别:

1) PROPAGATION_REQUIRED(propagation_required) ,默认的spring事务传播级别,使用该级别的特点是,如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。所以这个级别通常能满足处理大多数的业务场景。

2)PROPAGATION_SUPPORTS (supports),从字面意思就知道,supports,支持,该传播级别的特点是,如果上下文存在事务,则支持事务加入事务,如果没有事务,则使用非事务的方式执行。所以说,并非所有的包在transactionTemplate.execute中的代码都会有事务支持。这个通常是用来处理那些并非原子性的非核心业务逻辑操作。应用场景较少。

3)PROPAGATION_MANDATORY (mandatory), 该级别的事务要求上下文中必须要存在事务,否则就会抛出异常!配置该方式的传播级别是有效的控制上下文调用代码遗漏添加事务控制的保证手段。比如一段代码不能单独被调用执行,但是一旦被调用,就必须有事务包含的情况,就可以使用这个传播级别。

4)PROPAGATION_REQUIRES_NEW (requires_new),从字面即可知道,new,每次都要一个新事务,该传播级别的特点是,每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行。

这是一个很有用的传播级别,举一个应用场景:现在有一个发送100个红包的操作,在发送之前,要做一些系统的初始化、验证、数据记录操作,然后发送100封红包,然后再记录发送日志,发送日志要求100%的准确,如果日志不准确,那么整个父事务逻辑需要回滚。

怎么处理整个业务需求呢?就是通过这个PROPAGATION_REQUIRES_NEW 级别的事务传播控制就可以完成。发送红包的子事务不会直接影响到父事务的提交和回滚。

5)PROPAGATION_NOT_SUPPORTED (not_supported),这个也可以从字面得知,not supported ,不支持,当前级别的特点就是上下文中存在事务,则挂起事务,执行当前逻辑,结束后恢复上下文的事务。

这个级别有什么好处?可以帮助你将事务极可能的缩小。我们知道一个事务越大,它存在的风险也就越多。所以在处理事务的过程中,要保证尽可能的缩小范围。比如一段代码,是每次逻辑操作都必须调用的,比如循环1000次的某个非核心业务逻辑操作。这样的代码如果包在事务中,势必造成事务太大,导致出现一些难以考虑周全的异常情况。所以这个事务这个级别的传播级别就派上用场了。用当前级别的事务模板抱起来就可以了。

6)PROPAGATION_NEVER (never),该事务更严格,上面一个事务传播级别只是不支持而已,有事务就挂起,而PROPAGATION_NEVER传播级别要求上下文中不能存在事务,一旦有事务,就抛出runtime异常,强制停止执行!这个级别上辈子跟事务有仇。

7)PROPAGATION_NESTED (nested),字面也可知道,nested,嵌套级别事务。该传播级别特征是,如果上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务。