java基础10道题(第二弹)

11.什么是反射,反射能干嘛?

反射: 简单说,反射机制值得是程序在运行时能够获取自身的信息。在java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。反射的作用其实就是:在运行时能够判断任意一个对象所属的类, 还有就是在运行时构造任意一个类的对象,我们常用的Spring框架也是利用Java反射这一块架构的还有就是 在运行时判断任意一个类所具有的成员变量和方法,还能在在运行时调用任一对象的方法,还有在运行时创建新类对象
看下面的代码是在于理解什么是反射,不用背出来
public class Base {
static int num = 1;
static {
System.out.println(“Base " + num);
}
}public class Main {
public static void main(String[] args) {
// 不会初始化静态块
Class clazz1 = Base.class;
System.out.println(”------");
// 会初始化
Class clazz2 = Class.forName(“zzz.Base”);
}
}

12.jdk1.8 和1.7区别

我了解JDK8的新特性有:就是接口里也可添加普通的方法了,不用非得是抽象方法了,但是必须得用default进行修饰,调用的时候也还是得实现这个接口以后才能调用,还有就是添加了一个Lambda 表达式,让我们遍历集合数据的时候速度更快,我大概就知道这些,我们目前开发也还没用到过这些新特性,对了,还有就是JDK1.8以后的map存储方式是1.7的也有些区别.如果不相等则形成链表结构,jdk1.7后加的在前面,先加的移下,这种情况叫碰撞。这种碰撞的情况应尽量避免,否存一个索引中链表的数据大量时,该索引当再次插入一个对象时equals比较全部影响效率。
因此jdk1.8改善这种碰撞情况的出现,jdk1.8中的HashMap存储结构是由数组、链表、红黑树这三种数据结构形成,红黑树查询删除快新增慢。参考文章https://blog.csdn.net/changhangshi/article/details/82114727

13.Jvm优化?

其实优化这一块我也说不太好,我就照我理解的方式说一下,比如说我们得遵守咱们Java的编码规范,比如说尽量少使用静态变量,循环最好是不要超过三层以上的嵌套,因为后期维护起来比较麻烦,也比较耗费jvm的内存,去掉项目中不必要的jar包,如果感觉jvm内存不够用,如果你的应用是跑到tomcat服务器上的话可以去修改下catalina.bat文件设置下Xms初始化堆的大小,和XXm最大允许分配堆内存,其实这个也是不设置的越大越好,也得经常更改,在我个人理解上如果设置的越大,有可能垃圾回收机制不会及时回收不长用的对象.

14.类的初始化过程

Student s = new Student();在内存中做了哪些事情?
1.加载Student.class文件进内存
2.在栈内存为s开辟空间
3.在堆内存为学生对象开辟空间
4.对学生对象的成员变量进行默认初始化
5.对学生对象的成员变量进行显示初始化
6.通过构造方法对学生对象的成员变量赋值
7.学生对象初始化完毕,把对象地址赋值给s变量

15.说一下你对Spring的理解?

关于Spring的话,我们平时做项目一直都在用,不管是使用ssh还是使用ssm,都可以整合。Spring里面主要的就三点,也就是核心思想,IOC,DI,AOP。
其实spring这个框架也用到了Java里的反射机制.
DI就是依赖注入,把我们需要的类啊,接口啥的注入到spring中去。
IOC控制反转,像我们之前开发,如果想创建一个对象,就new一个,如果想这个对象中定义其他的变量或者对象,就在对象内部创建一个成员变量。但是现在的话,如果想用这个类的对象,咱们可以在spring的配置文件中配置一个bean,指定对应的全路径名称。spring通过配置文件用反射的方式,就可以直接帮我们获取到这个类的对象。还有AOP,就是面向切面编程,它的原理的话,我看过它的底层代码,它实际上就是实现了JDK的动态代理,以前的话用这个做过事务的控制,现在的话我们都用注解来控制事务。
AOP执行过程是一个纵向的过程,把每个方法当作一个点.基于这些点可以进行增强处理.形成了横向的切面,包含了原有方法和增强方法.不改变原有代码结构,还添加了额外的功能.
你了解的AOP的使用场景有哪些?事务管理,日志打印,还有就是在老项目中也有可能用它来做权限管理.
整体来说的话,Spring在使用的时候非常方便,在配置文件中配置要依赖的对象,或者在配置文件中将对象及属性进行注入,当然现在基本都用注解的方式,更方便。
除了这些,我们之前的项目也用过spring的其他产品,像spring boot(简化新Spring应用的初始搭建以及开发过程,用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架),spring cloud微服务框架。比spring更简单,快速,方便。
(然后就可以扯微服务,和spring boot、cloud)。。。

16.Spring常用的注解

我们开发的时候常用的注解也就@service业务逻辑,@Transactionnal事务的注解,有时候需要注入DAO的话还会用到@Repository还有就是springMVC里的注解啦,比如说@Controller对应表现层的注解在spring未来的版本中,@RestController这个控制器返回的都是json格式,还有@RequestMapping进入的URL,@responsebody也是定义该方法返回JSON格式,还有就是@RequestParam获取参数,@RequestBody获取前台的数据是JSON格式的数据,@PathVariable从URL请求路径中获取数据,大概常用的也就这些.

17.简单说一下SpringMVC与Spring是如何整合的?

简单的说 springMVC在ssm中整合 就是 在 web.xml 里边配置springMVC的核心控制器:DispatcherServlet; 它就是对指定后缀进行拦截;然后在springMVC.xml里边配置扫描器,可以扫描到带@controller注解的这些类,现在用springMVC都是基与注解式开发, 像@service,@Repository @Requestmapping,@responsebody 啦这些注解标签 等等 都是开发时用的,每个注解标签都有自己的作用;它还配置一个视图解析器,主要就是对处理之后的跳转进行统一配置 ,大致就是这些,如何使用springMVC获取表单里的数据? 通过形参和表单里的name值保持一致就能获取到

18.详细的说一下springaop的实现原理

它的底层是通过动态代理实现的面向切面编程,主要用在管理事物这一块,我们在配置文件里配置切入点,比如以save/insert/update等开头的方法我们开启事物,配置了一个REQUIRED开头的事物特性,还可以用在日志管理,还有权限方面也可以用aop来实现,但现在基本上没有人去这样控制权限,都用shiro框架来实现权限管理,springaop大概就是这样,咱们公司是用什么来管理事物的,应该使用注解的方式来管理的吧。以下内容在于理解,能说出大概就行
spring AOP 事务的描述:(难点)
在 spring-common.xml 里通过里面先设定一个表达式,
设定对 service 里那些方法 如:对 add* ,delete*,update*等开头的方法
进行事务拦截。我们需要配置事务的传播(propagation=“REQUIRED”)
特性,通常把增,删,改以外的操作需要配置成只读事务(read
only=“true”).只读事务可以提高性能。之后引入 tx:advice,在 tx:advice
引用 transactionManager(事务管理),在事务管理里再引入
sessionFactory,sessionFactory 注入 dataSource,最后通过
引入 txAdvice。
Spring 实现 ioc 控制反转描述:
原来需要我们自己进行 bean 的创建以及注入,而现在交给 spring 容器去
完成 bean 的创建以及注入。所谓的“控制反转”就是 对象控制权的转
移,从程序代码本身转移到了外部容器。

19.Spring中@Autowired和@Resource的区别?

@Autowired默认的是按照类型进行注入, 如果没有类型会按照名称(红色字体)进行注入.
如果想直接按照名称注入需要加入@Qualifier(“gatheringDao”)
@Autowired
@Qualifier(“gatheringDao”)
private GatheringDao gatheringDao;
@Resource默认的会按照名称注入,名称找不着会按照类型来找,如果这里写了名称,就直接按照名称找了不会按类型找@Resource(name = “aaa”)
@Resource
private GatheringDao gatheringDao;

20.事务的传播特性?

1.PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
2.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
4.PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7.PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。

猜你喜欢

转载自blog.csdn.net/zhang_yuanbai/article/details/108701783