1.J2EE中常用名词

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET直接跟容器中的环境变量接**互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

2. 讲一下redis的主从复制怎么做的?

Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。
下图为级联结构:

全量同步

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

  • 从服务器连接主服务器,发送SYNC命令;
  • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
    完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

增量同步

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

Redis主从同步策略

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

需要注意:如果多个Slave断线了,需重启时,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。

Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝。需要清楚知道Redis主从复制的几点重要内容:

1)Redis使用异步复制。但从Redis 2.8开始,从服务器会周期性的应答从复制流中处理的数据量。
2)一个主服务器可以有多个从服务器。
3)从服务器也可以接受其他从服务器的连接。除了多个从服务器连接到一个主服务器之外,多个从服务器也可以连接到一个从服务器上,形成一个图状结构。
4)Redis主从复制不阻塞主服务器端。也就是说当若干个从服务器在进行初始同步时,主服务器仍然可以处理请求。
5)主从复制也不阻塞从服务器端。当从服务器进行初始同步时,它使用旧版本的数据来应对查询请求,假设你在redis.conf配置文件是这么配置的。否则的话,你可以配置当复制流关闭时让从服务器给客户端返回一个错误。但是当初始同步完成后,需删除旧数据集和加载新的数据集,在这个短暂时间内,从服务器会阻塞连接进来的请求。
6)主从复制可以用来增强扩展性,使用多个从服务器来处理只读的请求(比如,繁重的排序操作可以放到从服务器去做),也可以简单的用来做数据冗余。
7)使用主从复制可以为主服务器免除把数据写入磁盘的消耗:在主服务器的redis.conf文件中配置“避免保存”(注释掉所有“保存“命令),然后连接一个配置为“进行保存”的从服务器即可。但是这个配置要确保主服务器不会自动重启

更多请参考: https://www.cnblogs.com/kevingrace/p/5685332.html

3. 请谈谈你对Javaweb开发中的监听器的理解?

监听器概念

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
监听器其实就是一个实现特定接口的普通Java程序,这个程序专门用于监听另一个Java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。Java中的事件监听机制可用下图来表示:

一道面试题:请描述一下Java事件监听机制

Java的事件监听机制涉及到三个组件:事件源、事件监听器、事件对象;
当事件源上发生操作时,它将会调用事件监听器的一个方法,并在调用这个方法时,会传递事件对象过去;
事件监听器由开发人员编写,开发人员在事件监听器中,通过事件对象可以拿到事件源,从而对事件源上的操作进行处理。

JavaWeb中的监听器

基本概念:
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听Web应用程序中的ServletContext,HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

Servlet监听器的分类:

详细参考: https://blog.csdn.net/yerenyuan_pku/article/details/52468244

4. 按之字形顺序打印二叉树

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例代码:

import java.util.ArrayList;/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}}
*/
public class Solution {public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {}

思路:
【分析1】首先我们根据题目的描述,能够找到该题的解决模型为二叉树的层次遍历。只不过普通的层次遍历是针对每一层都只是从左到右遍历。这里题目要求奇数层是从左到右遍历,而偶数层则是从右到左遍历的。

【分析2】我们知道二叉树的层次遍历是通过队列来实现的,队列的特点就是先进先出(FIFO),因此能实现在奇数层从左到右遍历访问。既然队列难以实现从左至右遍历,那么栈这种后进先出(LIFO)的结构能够实现从左到右访问呢?答案是肯定的。我们可以使用两个栈来实现,栈S1存放奇数层数据,栈S2存放偶数层数据。S2中的数据好理解,因为只要以先左子树再右子树的顺序进栈后,再出栈的顺序就变成了先右子树出栈,然后左子树出栈了。

【分析3】此时出现了另外一个问题,当奇数层(第一层除外)进栈后,想要实现从左到右的顺序遍历,那么在遍历上一层偶数层的结点的进栈顺序就要发生改变,不能再以默认的先左子树再右子树的顺序进栈,因为栈的特点是后进先出(LIFO)。因此分析到这里我们发现:针对奇数层对应的栈S1来说,出栈后访问结点;如果结点具有左子树,则将该结点的左子树加入到偶数栈S2中;如果结点具有右子树,则将该结点的右子树加入到偶数栈S2中。针对偶数层对应的栈S2来说,出栈后访问结点;如果结点具有右子树,则将该结点的右子树加入到奇数栈S1中;如果结点具有左子树,则将该结点的左子树加入到奇数栈S1中。

【分析4】分析到这里,我们需要解决最后一个问题,就是如何判断当前所处的层是奇数层还是偶数层。因此我们需要设置一个全局变量来记录层数,默认值为1,代表第一层。根据上面的分析,我们可以看出,由于将奇数层与偶数层分开,因此,当栈S1或栈S2为空时,说明这一层遍历完成,将层数加一。

实现代码:

import java.util.*;/*
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/
public class Solution {public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer> > res_list = new ArrayList<>();int layer = 1;//s1存奇数层节点Stack<TreeNode> s1 = new Stack<TreeNode>();s1.push(pRoot);//s2存偶数层节点Stack<TreeNode> s2 = new Stack<TreeNode>();while(!s1.empty() || !s2.empty()){if(layer%2 != 0){ArrayList<Integer> list = new ArrayList<>();while(!s1.empty()){TreeNode t = s1.pop();if(t != null){list.add(t.val);s2.push(t.left);s2.push(t.right);}}if (!list.isEmpty()) {res_list.add(list);layer++;}}else{ArrayList<Integer> list = new ArrayList<>();while(!s2.empty()){TreeNode t = s2.pop();if(t != null){list.add(t.val);s1.push(t.right);s1.push(t.left);}}if (!list.isEmpty()) {res_list.add(list);layer++;}}}return res_list;}}

原文链接:https://blog.csdn.net/weixin_36378917/article/details/80507052

5.内部类大全

java面试(二十六)--(1)J2EE中常用名词(2)讲一下redis的主从复制怎么做的?(3)请谈谈你对Javaweb开发中的监听器的理解?(4)按之字形顺序打印二叉树(5)内部类大全相关推荐

  1. 按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 此道题目可以跟  把二叉树打印成多行:htt ...

  2. 剑指offer——面试题61:按之字形顺序打印二叉树

    剑指offer--面试题61:按之字形顺序打印二叉树 Solution1: 基于上一题的解法,缺点:效率低下! /* struct TreeNode {int val;struct TreeNode ...

  3. 从零开始学java(二十六)--多维数组,多维数组存储表格数据

    从零开始学java(二十六)--多维数组 多维数组 多维数组存储表格数据 多维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(学习 ...

  4. 剑指Offer(Java实现)按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 方法一:利用两个栈的辅助空间分别存 ...

  5. 剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直 ...

  6. (剑指Offer)面试题61:按之字形顺序打印二叉树

    题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路: 按照广度优先遍历来遍历二叉树,但是需要 ...

  7. [剑指Offer] 59.按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. [思路]先按层次遍历存入,通过设立标志位,将 ...

  8. 剑指offer-按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 使用双向链表,先把当前行按顺序打印,再取出当 ...

  9. 打印list_按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路及代码 这题是 LiShun:把二叉 ...

最新文章

  1. Java中的深浅拷贝问题你清楚吗?
  2. C#Swagger使用
  3. 4.3.8 DHCP协议
  4. spring mvc项目中利用freemarker生成自定义标签
  5. PUTTY工具的使用
  6. 对象数组 排序-根据其中一个属性
  7. linux iptables 如何设置允许几个 ip访问,Linux防火墙iptables限制几个特定ip才能访问服务器。...
  8. 使用JDBC获取Oracle连接时报错
  9. python数组plot_Python Matplotlib:动态更新plot-数组长度未知
  10. 随机系列生成算法(随机数生成)
  11. 简单的签到代码_PHP实现一个小小的签到功能,到底用MySQL还是Redis?
  12. 篮球战术谈之1-2-2进攻法
  13. java 线程亲缘性_第7章 线程调度、优先级和亲缘性(1)
  14. JS === 实现通过点击td 跳转相应的图片
  15. 原理图端口符号_接线图和原理图有什么区别,以电气的原理图和接线图来做详细解析...
  16. jvm垃圾回收机制(GC)
  17. 计算机已锁定的时候鼠标不能用,鼠标驱动正常但是不能用怎么回事_电脑鼠标驱动正常但是不能用怎么解决...
  18. Python使用OpenPyXl设置Excel表格中的单元格大小(行高和列宽)
  19. 研究生应当常去的网站
  20. 吉时利keithley2600脉冲信号测试软件,忆阻器测试|半导体测试

热门文章

  1. TwinCat2安装及配置
  2. 纯js完成网页计算器(仅使用JavaScript样式)
  3. 软件测试自学好还是报培训班比较好?
  4. 我国第一天巨型电子计算机,2018年12月22日是什么日子,2018年12月22日是什么节日...
  5. NUC 11构建 ESXi 7.0.3f安装网卡驱动-V2(2022年7月升级版)
  6. python微信库有哪些_GitHub - zwczou/weixin-python: 微信SDK - 包括微信支付,微信公众号,微信登陆,微信消息处理等...
  7. strcpy系列函数
  8. C、C++和C#的关系,以“把大象放进冰箱里”举例
  9. Java设计模式——外观模式【Facade Pattern】
  10. 【Java设计模式 - 创建型模式1】单例模式