java开发面试问题

1.类加载进虚拟机的过程

class文件 -加载-效验-准备-解析-初始化
因为class文件说白了jvm获取后只是一串很长的字符串,在内存中根本就没什么变量,执行类初始化话代码等等,所以jvm根据此字符串做出相应的处理,也就是上面的步骤,才会变成用户可用的类。

还有这些步骤的顺序只是表示按顺序开始,但不是一个步骤结束才开始另一个步骤,步骤之间是交错运行的。

加载

完成三件事:
1.获取class文件的二进制流
2.将二进制流转换成相对应的数据结构并保存在方法区中
3.在堆中生成对应的class对象。

判断类是否相等,是由类的加载器和类的全限定名决定的。即使是同一个class文件,由不同的类加载器加载,在虚拟机中加载出来的这2个类都是不相等的。

在这个过程中,获取class文件的二进制流这一步我们有很大的控制权限,任何形式获取class文件二进制流都是可以的,只要我们想得到,例如从网络,磁盘,甚至是自己运行时构造一个class文件再加载进来都是可以的。写好相应的类加载器都是可以的。

校验

这里我们会想为什么需要校验?到底需要校验哪些数据呢?其实class文件不一定是由java代码经过编译而来,
甚至有可能是直接写字节码得来的,class文件里的内容更像是一种底层语言,而java只是让这个语言的语法符合高层语言写法的一种封装,
所以class文件不可信,也是需要通过类似语言的校验,例如语法,文件类型,结构等等每一行的语句都需要通过校验才能保证其正确性。
只有文件正确性保证了,才能保证jvm的安全,代码的正常运行。

准备

准备阶段需要准备什么?这个阶段主要跟类变量相关,为类变量分配内存地址,并且清空分配的内存地址。

解析

把符号引用解析为直接引用。
1.非数组类的符号引用解析
	根据类的全名去加载类,如果有父类继续加载父类,加载成功后查看有没权限,有权限则加载成功。
2.字段引用解析
	先加载字段所属类,然后在类中查找字段,如果找不到继续往父类找,找到并判断字段的权限。
3.类方法解析
	跟字段解析相似。
4.接口方法解析
	先加载字段所属接口,然后在接口中查找对应的方法。

初始化

执行编译生成的init方法和自己编写的静态方法,给字段置初始值

2.Solr中文词库配置

教程地址

3.索引会不会失效

  1. 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
    在这里插入图片描述
    .
  2. 对于使用 like 查询, 查询如果是 ‘%aaa’ 不会使用索引,而 ‘aaa%’ 会使用到索引。
  3. 如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。
    4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    在这里插入图片描述
     5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引 如:表里只有一条数据。

4.springboot

SpringBoot优缺点

SpringBoot优缺点
优点:
1、快速构建项目。
2、对主流开发框架的无配置集成。
3、项目可独立运行,无须外部依赖Servlet容器。
4、提供运行时的应用监控。
5、极大的提高了开发、部署效率。
6、与云计算的天然集成。
缺点:
1、如果你不认同spring框架,也许这就是缺点。
SpringBoot几个常用的注解
1@RestController@Controller指定一个类,作为控制器的注解 
(2@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉 
(3@EnableAutoConfiguration@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器
(4@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。
(5@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上 
(6@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource@Configuration来标识这个文件资源的类。 
(7@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean
(8@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。
springboot自动配置的原理
在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration

会自动去maven中读取每个starter中的spring.factories文件  该文件里配置了所有需要被创建spring容器中的bean

5.sql优化的

	从用`explain`关键字分析SQL语句开始

在这里插入图片描述
含义详解地址

6.Freemarker静态化页面实现流程

众所周知,随着网站的访问量增加,如何给用户以良好的访问体验就显得尤为重要。提升网站性能便成为一些网站面临的一大难题,像hao123这样的导航网站要提升网站的性能只要部署的web服务器数量足够就可以承载超大规模的访问量,如果是一个动态的网站呢?例如像凤凰新闻、网易新闻这样的CMS系统,淘宝、京东这样的大型购物网站由于这些网站都使用到了数据库这也就很难做到单纯的通过增加web服务器数量的方式来有效的提升网站的性能,但是这些网站并没有出现或者说极少出现因为访问量过大而造成页面响应缓慢的问题。这其中有什么样的技术手段使得这些大型的动态网站能够有如此高的性能呢?目前提升网站性能的方法通常有HTML静态化、图片服务器分离、数据库集群、负载均衡、代码优化、压缩JS和CSS文件等等。其中HTML静态化的目的其实就是降低HTTP请求个数从而降低数据库的操作从而达到提高网站运行速度,这也是一个最有效的提升网站性能的方法之一。本文将通过具体案例讲解如何采用FreeMarker将动态网页静态化从而达到提升网站性能的目的。

1,动态网页和静态网页差异?

1)静态网页:

	a、静态网页的内容稳定,页面加载速度快。

  b、静态网页的没有数据库支持,在网站制作和维护方面的工作量较大。

  c、静态网页的交互性差,有很大的局限性。

2)动态网页:

  a、交互性好。

  b、动态网页的信息都需要从数据库中读取,每打开一个一面就需要去获取一次数据库,如果访问人数很多,
  也就会对服务器增加很大的荷载,从而影响这个网站的运行速度。

  通过上面的比较我们不难看出,要提升网站的性能,我们只要把动态网页做成静态网页就会在运行速度方面有显著的提升,
  但是问题出来了,如果将所有页面都做成静态页面显然是不切实际的。有什么办法能让我们的网站即能有动态网页的交互性,
  又有静态网页的加载速度呢?FreeMarker便能实现这样的需求:实现动态网页静态化。
Freemarker 页面静态化技术使用入门案例

在访问 新闻、活动、商品 详情页面时, 路径可以是 xx【id】.html, 服务器端根据请求 id, 动态生成 html 网页,下次访问数据时,无需再查询数据,直接将 html 静态页面返回。这样一来就减 少 数 据 库 交 互 , 从而提高查询性能。
Struts2 默认使用 freemarker 实现 自定义标签模板,项目导入 struts2 就已经导入了freemarker jar 包。
使用Freemarker步骤:
1、 安装 freemarker eclipse 编辑插件。
将 “freemarker_eclipseplugin” 复制 eclipse 的 dropins 文件夹 ,重启开发工具。
2、 编辑 freemarker 的模板文件。
通常模板文件 放在 WEB-INF 下 或者 classes 下。
${变量} , 需要在程序中指定变量,合并到模板文件 一同输出。

hello.ftl模板文件代码:

<html>
    <title>
        ${title}
    </title>
    <body>
        ${msg}
    </body>
</html>

Java测试类FreemarkerTest代码:

public class FreemarkerTest {
    @Test
    public void testOutput() throws IOException, TemplateException {
        // 配置对象, 配置模板位置
        Configuration configuration = new Configuration(
                Configuration.VERSION_2_3_22);
        configuration.setDirectoryForTemplateLoading(new File(
                "src/main/webapp/WEB-INF/templates"));

        // 获取模板对象
        Template template = configuration.getTemplate("hello.ftl");

        // 动态数据对象
        Map<String, Object> paramterMap = new HashMap<String, Object>();
        paramterMap.put("title", "你我他学习吧");
        paramterMap.put("msg", "你好,这是第一个Freemarker案例!");

        // 合并输出
        template.process(paramterMap, new PrintWriter(System.out));
    }
}

7.商品模块多少个表

分类表:
(商品分类编号, 分类名称, 父分类编号)
(1, 男装, 0)
(2, 裤子, 1)
(3, 外套, 1)
(4, 内裤, 1)
(5, 袜子, 1)
商品表:
(商品编号, 商品名称, 商品分类编号, 卖家编号, SPU销量, 评论数)
(1, '裤子名', 2, 1, 0)
(2, '外套名', 3, 1, 0)
(3, '内裤名', 4, 1, 0)
(4, '袜子名', 5, 1, 0)
(库存表):
(编号, 商品编号, SKU属性, 价格, 库存, SKU销量)
(1, 1, [1:1,2:3], 99, 400, 0) 其中 [1:1,2:3] 表示 "颜色为黑色,尺码为X"
(2, 1, [1:1,2:4], 99, 200, 0) 其中 [1:1,2:4] 表示 "颜色为黑色,尺码为XL"
(3, 1, [1:2,2:3], 99, 300, 0) 其中 [1:2,2:3] 表示 "颜色为白色,尺码为X"
(4, 1, [1:2,2:4], 99, 100, 0) 其中 [1:2,2:4] 表示 "颜色为白色,尺码为XL"
上面只列出商品1这个分类的4个SKU.

8.购物车模块多少张表

1.订单表
2.商品记录表
3.购物车记录表
4.收藏记录表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章