精华内容
下载资源
问答
  • SQL 与 JAVA 实现逻辑的优缺点

    千次阅读 2019-01-02 10:02:39
    先说结论,我支持将逻辑写在Java等应用系统中! 背景: 今天只讨论一种应用模式,就是最普遍的,前端实时调用后端Web服务,服务端经过DB的增删改查作出响应的应用。至于离线数据分析,在线规则引擎模板执行,流式...

     

    这里写图片描述 
    来源 | 公众号 | 一名叫大蕉的程序员 | 作者 | 杨钊

    原文地址:https://mp.weixin.qq.com/s/62fTZoAU_ThqA50v9iY1TQ


    先说结论,我支持将逻辑写在Java等应用系统中!

    背景:

    今天只讨论一种应用模式,就是最普遍的,前端实时调用后端Web服务,服务端经过DB的增删改查作出响应的应用。至于离线数据分析,在线规则引擎模板执行,流式计算等不在本次讨论范畴。

    一、重SQL还是重Java的开发场景演示

    先看一个例子吧,需求是:查询出每个学生所在的城市名以及分数展示到前端。用经典的Controller、Service、DAO开发模式描述,设计数据库表如下:

    这里写图片描述

    (1)重SQL模式示例代码:

    这里写图片描述

    (2)重Java模式示例代码:

    这里写图片描述 
    这里写图片描述 
    这里写图片描述

    可以看到,使用重SQL的模式来进行开发确实很快很快,只需要把SQL开发出来基本就完事了,但是看着用重 Java 的模式开发,需要写一堆的代码,这么看来好像是 SQL 胜利一筹。

    好,PD突然说了,我要把城市名为 “大蕉” 的,分数乘于2展示出来。握草,这个怎么搞??

    (1)重SQL模式示例代码:

    这里写图片描述

    好了。。这个SQL已经变得很复杂了基本没法看了。。

    (2)重 Java 模式示例代码:

    这里写图片描述

    咦好像改动也不多嘛。

    这时候PD又来了我要把城市名为 “大蕉” ,并且城市Code小于10086的,分数乘于2展示出来。握草,完蛋了,之前全是SQL,这个需求要怎么搞??继续叠加上去继续 CASE WHEN?

    还没想清楚呢,突然 DBA 电话飞过来了,兄dei你的SQL太慢了,现在把整个库拖垮了,你是不是没有加索引?

    我:索引加了啊。。。难道是没走到?那是先解决慢SQL还是先开发需求呢?拆库是不可能了,逻辑这么死鬼复杂拆库完全没法跑啊,加CPU加内存啊 DBA大佬!!!

    [DBA日报] 慢SQL 180+,已解决10。

    又上了一个版本

    [DBA日报] 慢SQL 200+,已解决15。

    又上了一个版本

    [DBA日报] 慢SQL 250+,已解决30。

    慢慢的,开发和运营和DBA每天都疲劳于监控这些SQL。。。。

    二、上述示例的思考

    观察了一下,传统企业以及绝大部分转型中的企业的 Java 应用中,很神奇的是,他们的开发人员包括我自己以前,大家都非常非常希望使用一个 SQL 来完成所有的逻辑的编写,非常多企业更是把数据库的存储过程和数据库自定义函数来完成。

    这些关于逻辑应该写在哪里的争论从来没有停止过,不仅仅发生在后端和数据库端,连前后端都经常会发生这种争论,现在只讨论后端和数据库端的纠结。

    我将从这五个方面分别对比一下两种模式的异同:

    • 出现场景

    • 开发效率

    • 缺陷排查

    • 架构升级

    • 系统维护

    三、出现场景

    1、SQL

    我们绝大多数的历史代码都是用存储过程来实现的啊,如果有新需求不往上面做的话,很难兼容原来的逻辑啊啊。

    前面的人呢是这样写的,我来了看大家都这样写就这样写了。

    2、Java

    新应用嘛,我想怎么样写就怎样写。

    监控和埋点写起来简单吖,排查问题可方便了。

    前面的人呢是这样写的,我来了看大家都这样写就这样写了。

    四、开发效率

    1、SQL

    这样写起来很快啊,而且写 Java 代码多难受啊,写 SQL 我自己在数据库开发环境跑一下结果正确我就直接丢到代码中提交了,多爽啊。

    老实说,这样子确实会提高开发的效率,因为不用写那么多查库聚合的操作,一切都在 SQL 中搞定了。另一方面来看,这确实会让 Java 代码看起来很鸡肋,好像只是把数据从 web 层到数据层的一个管道而已,一切 if else 能写在 SQL 中的都写在 SQL 中了。

    但是新需求来或者需求变更的时候,我经常要重新写SQL,如果变动不多我可能要改动到原来的 SQL,但是我又不敢改,所以只好 copy 重新写一个,改 SQL 的风险好大,一报错又要重启好难受。

    2、Java

    一次要写N个类,有点烦。

    新需求来或者需求变更的时候,如果逻辑比较复杂,我直接抽成方法或者改成一些设计模式,维护起来效率还是可以接受的。

    五、缺陷排查

    1、SQL

    开发排查问题的时候,除了看日志,直接把SQL和参数丢到 PL/SQL 或者 其他工具里跑一下,基本就能知道数据问题出现在哪了。测试同学在进行测试的时候,如果发现有不对的东西,直接跟开发同学一样的思路,把SQL 跑一下,问题基本就定位得七七八八了。

    但是呢,一旦遇到跑 SQL 无法一眼看出问题的 bug 或者 SQL 实在是太长太长了的的时候,就蒙圈了。我曾经就维护了一个几千行的存储过程,一旦发生问题,排查问题的过程巨艰难。但是呢直接用一个数据库一个功能搞定所有功能未尝不是一件很爽的事情,因为关系型数据库实在是实在是太太太稳定了,一次编写永久运行。

    2、Java

    看日志看监控。

    根据报错的代码位置 check 一下代码逻辑。

    一些入参分支肉眼 check 不出来,只能远程 debug 慢慢看数据流向。

    测试的同学基本无法帮忙 check 缺陷,只能靠程序的表现来判断。

    六、架构升级

    1、SQL

    SQL 慢没关系,它稳定啊,慢就把机器垂直扩展一下好啦,加cpu,加内存,换SSD,加加加绝对可以解决事情的。

    SQL 有各种索引和优化策略,说不定跑起来比我们自己写逻辑还快呢。

    加加加,加内存加cpu垂直升级。也没有其他招数了,除了前置缓存,但是如果查询都很个性化SQL很复杂,前置缓存也基本没啥乱用。。。

    如果你的逻辑全部写在 SQL 中,那完蛋了,你这个表基本就没法分表了,因为你的业务逻辑跟数据库的数据完整性是强耦合的,需要一切数据基本都在一个数据库中,这是一件很难受很难受的事情,不信你去问问那些所有业务逻辑全写在 SQL 中的小伙。

    数据库中非常复杂的表关联会极大程度拖慢数据库处理每条 SQL 的平均时间,极大程度拖慢数据库 RT,降低了数据库的 RT ,如果逻辑都写在 SQL 中,那么只能进行垂直升级。因为一旦进行水平扩展,那么多机器的非常复杂的分布式表关联,RT 基本不是一个高并发的业务应用的能容忍的。

    2、Java

    如果是数据库瓶颈,加数据库机器,分库分表一下,应用层基本不用改,在DAO层进行路由一下。

    如果是服务器cpu瓶颈,多加几台机器就好了。

    如果还有瓶颈,增加一下查询缓存。

    在应用快速发展的过程中一般都会分库分表的拆分或者自动水平扩展,这时候其实只需要数据库层面做好自己的数据迁移和同步就好了,对于业务层来说是完全无感知的。即使业务非常非常复杂,需要拆应用,其实也非常简单,只需要把对应的 DAO 层的操作拆分出去,换成 RPC 或者其他方式的调用就好了。

    七、系统维护

    1、SQL

    旧SQL完全不敢动,来一个需求加一个 SQL。

    慢SQL日益增加,应对疲乏。

    2、Java

    SQL写完一次基本不用动,来一个需求加一个方法聚合一下数据操作即可。

    应用维护比较简单,只要监控做好了,定位到问题基本都能很快解决。

    逻辑越来越复杂,没有好的开发框架的话,代码维护起来也是挺要命,因为完全不知道跑哪个分支去了。但是现在已经有很多优秀的开源框架来更好地维护代码了,比如 Spring 的全家桶。

    八、怎么破!

    旧的重 SQL 逻辑暂时不要动,新的逻辑都基于 Java 模式开发,先保证慢 SQL 不增加,旧的 SQL 稳定运行,毕竟业务稳定是第一要素。

    如果业务初期需要非常非常快速开发,那么使用重 SQL 模式也是可以理解的,但是还是要抽时间重构成 Java 模式。

    九、结论

    我支持将逻辑写在 Java 等应用系统中。其实原因在上面基本描述完了,第一就是复杂 SQL 的表关联其实跟个人的能力有非常大的关系,如果一个 SQL 写得不好,那是极慢极慢的非常容易把整个数据库拖慢的。第二就是维护这些 SQL 也是一件很难受的事情,因为你完全不知道这个 SQL 背后的数据流转是怎样的,你只能根据自己的猜测去查看 SQL 中的 bug,Java 应用好歹还能 debug 一下还有打点看看数据不是?如果逻辑写在 Java 中那么其实你的 DAO 层只需要编写一次,但是可以永久使用,基本不会在这一层浪费很多的时间(用过 ibatis 的都知道改了 SQL 需要重启应用吧?)。第三就是逻辑都写在 SQL ,中对于分库分表和应用拆分来说是一件非常难受的事情,真的难受。

    展开全文
  • 微信小程序支付JAVA后台逻辑步骤

    千次阅读 2018-01-15 16:02:17
    其实微信支付并没有想象中那么复杂, 你只需要花点时间看下我这篇文章,相信你可以很快学会,废话少说,跟我来吧!

    其实微信支付并没有想象中那么复杂, 你只需要花点时间看下我这篇文章,相信你可以很快学会,废话少说,跟我来吧!

    ①小程序前端会通过调用wx.login接口获取得到登陆凭据code。这个code获取之后5分钟内如果再次调用wx.login获取code并传递给②就会报错,code非法,这个需要注意下。

    ② 小程序将code登陆凭据和orderId订单编号穿给后台服务端,服务端调用https://api.weixin.qq.com/sns/jscode2session接口,获取session_key和openId。

    ③ 服务端拿到openId以后,调用统一下单接口https://api.mch.weixin.qq.com/pay/unifiedorder,并将返回的xml转化为map,得到其中的一些支付需要的参数进行二次签名,并返回给小程序。

     

    @Override
    public JSONObject getSecondSign(Map<String, String> map) throws Exception {
    	String return_code = map.get("return_code");//返回状态码
            String return_msg = map.get("return_msg");//返回信息
            logger.debug("return_code:"+return_code+"------return_msg:" + return_msg);
            JSONObject JsonObject=new JSONObject() ;
            // 业务结果
            if("SUCCESS".equals(return_code)){
                String prepay_id = map.get("prepay_id");//返回的预付单信息
                String nonceStr = RandomUtil.get32RandomStr();
                JsonObject.put("nonceStr", nonceStr);
                JsonObject.put("package", "prepay_id="+prepay_id);
                Long timeStamp= System.currentTimeMillis()/1000;
                JsonObject.put("timeStamp", timeStamp+"");
                //再次签名
                String appid = PayConstant.WX_APPID;
                String stringSignTemp = "appId=" + appid
                						+ "&nonceStr=" + nonceStr
                						+ "&package=prepay_id=" + prepay_id
                						+ "&signType=MD5&timeStamp=" + timeStamp;
                stringSignTemp = stringSignTemp + "&key=" + PayConstant.WX_MCHKEY;
                String paySign = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
                JsonObject.put("paySign", paySign);
            }
    		return JsonObject;
    	}
    	String return_code = map.get("return_code");//返回状态码
            String return_msg = map.get("return_msg");//返回信息
            logger.debug("return_code:"+return_code+"------return_msg:" + return_msg);
            JSONObject JsonObject=new JSONObject() ;
            // 业务结果
            if("SUCCESS".equals(return_code)){
                String prepay_id = map.get("prepay_id");//返回的预付单信息
                String nonceStr = RandomUtil.get32RandomStr();
                JsonObject.put("nonceStr", nonceStr);
                JsonObject.put("package", "prepay_id="+prepay_id);
                Long timeStamp= System.currentTimeMillis()/1000;
                JsonObject.put("timeStamp", timeStamp+"");
                //再次签名
                String appid = PayConstant.WX_APPID;
                String stringSignTemp = "appId=" + appid
                						+ "&nonceStr=" + nonceStr
                						+ "&package=prepay_id=" + prepay_id
                						+ "&signType=MD5&timeStamp=" + timeStamp;
                stringSignTemp = stringSignTemp + "&key=" + PayConstant.WX_MCHKEY;
                String paySign = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
                JsonObject.put("paySign", paySign);
            }
    		return JsonObject;
    	}

      ④ 小程序拿到上述的支付参数后,调用wx.requestpayment就可以调起支付了,用户完成付款后,小程序会回调我们设置的notify_url方便我们进行更新订单状态等后续操作。

     

    附上日志打印:

    以上为简单整理的四步逻辑,具体接口的参数可以参考微信支付API文档。https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.html
     

     

    展开全文
  • -- JSP/Servlet Java面试逻辑题 --  很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HTML服务器端的技术 规范,JSP是一种动态页面生成的技术,...
    --   JSP/Servlet  Java面试逻辑题   --


        很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HTML服务器端的技术 规范,JSP是一种动态页面生成的技术,标签库的应用很广泛,面试遇到的几率也很大,而且对于比较复杂的页面,使用JSP来编写,更容易编写和维护。

        本章主要分析 : 简单的 JSP/Servlet 方式和内容 、  Java面试逻辑题

        每天学一点,日积月累,四个月后的今天,你一定会有很大的收获!

        全程将为大家剖析几大部分内容,由于学习经验有限,望大家谅解并接受宝贵的意见

        基础概念部分     ★★   : 常出现的高频率单词的区别理解(异常、静态、抽象、接口、集合等);

        深入理解部分     ★★★★: 重点掌握的面向对象的理论知识(对象、排序、字节字符流);

        线程编程部分     ★★★★★:单独讲解线程概念、同异步实现方法及关系、线程锁等;

        数据库理论归纳   ★★★★: 总结PL/SQL语句,使用方法,归纳基本公式,深层次内容有待开发。

        JDBC和XML部分   ★★★  : 重点分析XML的技术构成、应用方面的形式和区别。

        Servlet   部分   ★★★★★重点掌握生命周期和会话跟踪技术的知识点和一般的实现方法。

        J S P    部分   ★★★★ : 对象、动作的分类和区别,跳转方法以及动静态include的区别。

        JAVA笔试逻辑题  ★★    : 逻辑题目的考验,目前企业应用也比较广泛,稍微了解下。



    Servlet方面:


    1、说一说Servlet的生命周期★★★★★

    :

    servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。

    这个生存期由javax.servlet.Servlet接口的init,servicedestroy方法表达。 


    2servlet的生命周期
    答:

    web容器加载servlet,生命周期开始。通过调用servletinit()方法进行servlet的初始化。

    通过调用service()方法实现,根据请求的不同调用不同的do***()方法。

    结束服务,web容器调用servletdestroy()方法。


    3Servlet的基本架构 
    public class ServletName extends HttpServlet { 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 

    throws 
    ServletException, IOException { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 

    throws 
    ServletException, IOException { 


    4、什么情况下调用doGet()doPost()
    答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()


    5、如何现实servlet的单线程模式★★
    答:<%@page isThreadSafe="false"%>  面试中会遇到!


    6、页面间对象传递的方法
    答:requestsessionapplicationcookie


    7JSPServlet有哪些相同点和不同点,他们之间的联系是什么? 
    答:JSPServlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"servlet"ServletJSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是JavaHTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。


    8、四种会话跟踪技术(重要考点)★★★★★
    答:会话作用域ServletsJSP 页面描述
    page是代表与一个页面相关的对象和属性。

    一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。

    这既包括 servlet 又包括被编译成 servlet  JSP 页面
    request是代表与 Web 客户机发出的一个请求相关的对象和属性。

    一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)
    session是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求
    application是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。


    9Servlet执行时一般实现哪几个方法?★★★★★
    答:
    public void init(ServletConfig config)
    public ServletConfig getServletConfig()
    public String getServletInfo()
    public void service(ServletRequest request,ServletResponse response)
    public void destroy() 




    JSP方面:

    1jsp是如何执行的
    答:阶段一:容器要将JSP文件转换成一个对应的servlet类        

        html(css,javascript)--> service方法里,用 out.write输出(write方法会将null转换为" ")。

         <% Java代码 %> jsp代码片段 --> 把service方法里的内容,照搬过来。

         <%= Java表达式 %>也会放到service方法里,使用out.print输出。

    <%!   %>给Servlet添加新的属性或者新的方法(转成.java文件后,声明内的部分添加在service方法之外)。

    这样就把一个JSP变成了一个Servlet容器

    注意事项:out.writer方法只能输出简单的字符串,对象是没法输出的。优点是把null自动转换成空字符串输出。

    如: <% out.println(new Date()); %> 不能用writer

        阶段二:容器会将servlet编译、实例化、初始化、然后执行service方法。(实例化、初始化、就绪、销毁)


    2指令

    1)指令是什么

    通知容器,在将.jsp文件转换成.java文件时,作一些额外的处理,比如导包。

    2)指令的语法

    <%@ 指令名称 属性名=属性值 %>

    3)page指令

    import属性:导包。

        例如:<%@page import="java.util.*"%> <!-- 注意:没有分号!-->

        如: <%@page import="java.util.*, java.text.*" %>  <!-- 多个包以逗号隔开!都在一个双引号里-->

        contentType属性:设置response.setCharacterEncoding()的内容。

        pageEncoding属性:告诉容器JSP文件的编码格式。

        如: <%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>

    4)如何转发

    step1:绑定数据到requset:request里有个HashMap。

      request.setAttribute(String name,Object obj);//name:绑定名。obj:绑定值。

      另一个方法获取绑定值:

      Object request.getAttribute(String name);//如果绑定对象的值不存在,会返回null

    step2:获得一个转发器:url:要转发给哪一个Web组件

      RequestDispatcher rd=request.getRequsetDispatcher(String url);

    step3:转发

      rd.forward(request,response);//JSP和Servlet会共享相同的请求和响应对象

    step4:在转发的目的地,可以使用request.getAttribute方法获得绑定的数据,然后进行处理。



    3jsp有哪些隐含对象?作用分别是什么★★★
    :JSP共有以下9种基本内置组件(可与ASP6种内部组件相对应): 
    request 用户端请求,此请求会包含来自GET/POST请求的参数 
    response 网页传回用户端的回应 
    pageContext 网页的属性是在这里管理 
    session 与请求有关的会话期 
    application servlet 正在执行的内容 
    out 用来传送回应的输出 
    config servlet的构架部件 
    page JSP网页本身 

    exception 针对错误网页,未捕捉的例外 

    技术拓展:

    JavaScript有11种内置对象:

    Array、String、Date、Math、Boolean、Number、Function、Global、Error、RegExp、Object。


    4jsp有哪些动作?作用分别是什么★★★★★
    :JSP共有以下6种基本动作 
    jsp:include:在页面被请求的时候引入一个文件。 
    jsp:useBean:寻找或者实例化一个JavaBean。 
    jsp:setProperty:设置JavaBean的属性。 
    jsp:getProperty:输出某个JavaBean的属性。 
    jsp:forward:把请求转到一个新的页面。 
    jsp:plugin:根据浏览器类型为Java插件生成OBJECTEMBED标记 

    5JSP中动态INCLUDE与静态INCLUDE的区别? 
    答:动态INCLUDEjsp:include动作实现 
    <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 
    静态INCLUDEinclude伪码实现,定不会检查所含文件的变化,适用于包含静态页面 
    <%@ include file="included.htm" %> 

    6、两种跳转方式分别是什么?有什么区别★★★★★
    答:有两种,分别为: 
    <jsp:include page="included.jsp" flush="true"> 
    <jsp:forward page= "nextpage.jsp"/> 
    前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。 




    Java笔试逻辑题:


    1.一个11L的杯子一个7L的杯子怎么量出2L的水?

    解析:

    11L装满,往7L的倒,把7L倒满,剩4L,吧7L的倒空;
    4L倒进7L里,11L装满再往7L倒,倒满,剩8L;
    7L清空,8L倒进去,得到1L;
    1L和7L得到6L;
    6L和11L得到5L;
    5L和7L得到2L。

    反过来 在 7L里装满 往 11L里倒 , 道理是一样的!


    同类题比较:

        假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。

        问题是如何只用这2个水壶从池塘里取得3升的水。


    2.飞机问题

    每架飞机只有一个油箱,一箱油可以飞地球半圈。飞机间可以相互加油,所有飞机从同一个机场起飞。

    要想使一架飞机安全飞地球一圈,回到起飞的机场。需要至少出动几架飞机。

    解析:

    6架足矣。
    3架飞机A、B、C同时起飞,同向而行。
    飞至1/8航程(绕地球一周)处,正好耗去1/4燃油,其中1架飞机A将2×1/4油箱燃油分加至的飞机B、C油箱中,然后带1/4燃油正好能安全返航。
    此时飞机B、C油箱是满的。
    剩下2架飞机继续飞行1/8航程,也就是1/4航程处,此时飞机B、C还有3/4油箱的燃油。飞机B将1/4油箱的燃油加至飞机C,飞机B剩下1/2油箱燃油返航,
    飞机C为满油箱,继续做环球飞行,能飞至3/4航程处。
    飞机C飞至1/2航程处,由同一机场同时起飞3架飞机D、E、F,与飞机A、B、C反方向飞行。
    飞机D、E、F逆向飞行1/8航程时,飞机D将2×1/4油箱燃油分加至飞机E、F中返航,飞机E、F为满油箱,再向前1/8航程,
    也就是逆向的1/4航程、正向的3/4航程处,正好与做环球飞行的飞机C汇合,飞机C燃油已耗尽,飞机E、F都还有3/4油箱燃油,
    两飞机分别将1/4油箱燃油加给飞机C,并同飞机C一起返回机场,此时飞机C、E、F同为1/2油箱燃油,正好能飞完剩下的1/4航程。
    如果飞机D、E、F不同时起飞,还可以节约一些燃油,但起飞飞机架次一样。


    3.几段不规则的绳子,每个绳子燃烧时间都是60S,怎么计算15S。

    解析:

    一根绳从两头同时点着 燃烧完时间是30秒

    过程如下:将一根绳子两端记为a b 另一根两端记为c d
    同时点着a b c,第一根烧完的时候时间过去了30秒,此时将第二根熄灭。
    这样剩下的半根绳子就是30秒
    要得到15秒只需将剩下这一半的两端点着,烧完的时间就是15秒


    4.一群人参加聚会,每人头上戴一顶帽子,只能看见别人的帽子,看不见自己的帽子,帽子只有黑、白两种颜色。

    黑帽子不少于1顶,主持人说。我们玩个游戏,一会儿我关灯,认为自己头上戴的是黑帽子的,扇自己一巴掌。

    第一次关灯,没有声音。第二次,还是没声音。第三次关灯,才有噼里啪啦的声音。问有多少人参加聚会。

    解析:

    第一次关灯没人拍手说明不是黑帽子不止一个.如果只有一个,那戴黑帽子就会拍手,因为他看到的都是戴白帽子的。
    
    如果是两个那么第二次关灯的时候。戴黑帽子A只会看到戴黑帽子B一个戴黑色的帽子,这带黑帽子A确定自己也是戴黑帽子。
    但是他们看到的不只只有一个戴黑帽子的.
    
    第三次关灯有人拍手说明只有三个人戴黑帽子。因为戴黑帽子的只看到两个人戴黑帽子,而如果只有两个人戴黑帽子,那么第二次关灯就应该拍手了。
    
    所以只有三个人戴黑帽子。


    同类题比较:


    一个教授逻辑学的教授,有三个学生,而且三个学生均非常聪明!

     一天教授给他们出了一个题,教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个!(每个人可以看见另两个数,但看不见自己的)

     教授问第一个学生:你能猜出自己的数吗?回答:不能,问第二个,不能,第三个,不能,再问第一个,不能,第二个,不能,第三个:我猜出来了,是144!教授很满意的笑了。请问您能猜出另外两个人的数吗?


    解析:

    前两个 一个是48  一个是96  第三个是144
    
    1 每个人虽然猜不出自己的数字 但是心里会有两个答案 自己的数字是这两个答案中的一个(心里的两个数字是另外两人的数字之和与数字之差) 
    
    2 如果在教授第一轮询问三个人 三个人都猜不到的情况下 由此说明 三个数字各不相同 因为假如有两个是相同的话 
    就会有人能猜出自己的数字(三个数字都是正整数,不会是0,所以如果有两个相同的数,
    除了两个相同的数字以外的第三个人肯定知道自己的数字不是另外两数之差,是两数之和)
    
    3 第二轮询问中 第三个说猜出了自己的数字是144  由此说明他排除了心中两个答案之一 确定了剩下的一个是正确数字  
    那么  排除自己心中两个答案中错误的一个 肯定是因为他知道了自己的数字只能是另外两个数之和 并不是另外两数之差  
    否定了两数之差的可能性是根据 “2”
    那么前两数之差肯定是和前两数中的一个相等  那么由此可知  前两数和为144  并且一个是另一个的二倍  
    
    4  列出方程x+y=144  x=2y  得知 x=96  y=48 。
    
     
    
        如果各位同学有任何建议或比较好的想法,欢迎加入JAVA开发项目讨论群:214404624。
    发挥你聪智的大脑,挖掘更新鲜更充满活力的好点子,我们共同探讨技术层面的研究和可实施性。
                                                                                            JSD1307  Teny_Lu
                                                                                            欢迎有志之士共勉!       
                                                                                            QQ:261799155  http://teny32.blog.51cto.com
    

    展开全文
  • java异步执行业务逻辑

    千次阅读 2018-12-07 10:53:23
    java异步执行业务逻辑 1、创建线程池: Java通过Executors提供四种线程池: a、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 b、...

    java异步执行业务逻辑

    1、创建线程池:

    Java通过Executors提供四种线程池:
    a、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    b、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    c、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
    d、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
    这里采用单一线程池。

    异步执行的业务,理论上应该是和主线程或其他线程互不影响的业务。我们这里只是到不同的数据源获取了全国省市的数据信息。

    @Override
    public List<User> dataSource3() {
    
        long startTime = System.currentTimeMillis();    //获取开始时间
    	//线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();
    
        Task task = new Task();
        executorService.submit(task);
        executorService.shutdown();
    
        List<Province> provinces = baseRegionAMapper.getProvince();
    
        long endTime = System.currentTimeMillis();    //获取结束时间
        log.info("程序运行时间:" + (endTime - startTime) + "ms");
        return provinces;
    }
    

    另一个线程:
    这里只是sleep了一下,可以通过控制台清楚的看出并不会影响主线程的执行,即使出现异常,主线程也会正常执行并返回。

    private class Task implements Runnable {
        @Override
        public void run() {
            try {
                Thread.sleep(6000);
                baseRegionBMapper.getProvince();
                //int i = 10/0
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    展开全文
  • Java逻辑思维训练题

    万次阅读 热门讨论 2018-04-21 21:48:32
    时间写代码,思维容易固化,有时候需要换换脑子,我这边整理了几个有趣的逻辑思维训练小问题,以供大家休息时看看。 两柱香问题 题目:有两柱不均匀的香,每柱香燃烧完需要1个小时,问:怎样用两柱香切出一个15...
  • java逻辑表达式计算与判断

    千次阅读 2018-11-30 10:27:21
    import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.script.ScriptEngine; import javax.script.ScriptEngine...
  • Java】【逻辑漏洞】| Chat · 预告

    千次阅读 2017-12-20 00:00:00
    1Java 工程师如何得到一个好 Offer作者简介:张振华,曾经先后在驴妈妈,携程,要买车公司担任过Java高级工程师、架构师、开发主管、技术经理等职务。在电商公司工作期间,负责过PC站和后端服务的平台架构、实现和...
  • [MBean{sign_in_start_time='2018-10-26 08:00:00', sign_in_end_time='2018-10-26 10:00:00', sign_out_start_time='2018-10-26 11:00:00', sign_out_end_...请问这种逻辑应该怎么实现,我想的都不完美。求大佬帮帮忙
  • Java学习的正确打开方式

    万次阅读 多人点赞 2019-10-20 18:34:06
    在博主认为,对于入门级学习...上天是公平的,只要不辜负时间时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
  • Java计算时间差、日期差总结

    万次阅读 多人点赞 2018-03-13 18:59:00
    Java计算时间差、日期差总结 最近工作中遇到需要计算时间差,搜索了几种计算时间差的方法,这里总结一下 1、java 7中的日历类Calendar Calendar类使用其静态的getInstance()方法获取一个日历实例,该实例为当前...
  • AOP(Aspect-Oriented Programming),也就是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的...
  • JAVA UTC时间和本地时间

    千次阅读 2018-09-03 22:05:10
    世界时是最早的时间标准。 在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104。以此标准形成的时间系统,称为世界时,即 UT1。 1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java ...
  • JAVA时间格式处理

    千次阅读 2010-08-24 11:29:00
    JAVA时间格式化处理 日期格式化 import java.util.Date; import java.text.SimpleDateFormat; class dayTime { public static void main(String args[]) { ...
  • for (Object object : jsonArray) { Thread.currentThread().sleep(1000);...此处的停顿 适用于逻辑代码和循环 1000的单位为毫秒 停顿后提示一个未处理的异常 此时需要异常处理  //抛出异常 throws I...
  • Java判断时间是否在当天24h范围内

    万次阅读 2018-08-01 13:20:32
    但是,有些特殊情况需要通过id先把所有满足id条件的数据查询出来,然后通过Java业务逻辑来处理满足当天时间范围内的数据给分页处理,这样就涉及到了一个判断是否为当天时间的工具类。  工具代码: package ...
  • 本篇博文是“Java秒杀系统实战系列文章”的第十四篇,本文将借助缓存中间件Redis的“单线程”特性及其原子操作一同优化“秒杀系统中秒杀的核心业务逻辑”,彻底初步解决“库存超卖”、“重复秒杀”等问题。...
  • 对于开发过网络应用程序的程序员来说,重试并不陌生,由于网络的拥堵和波动,此刻不能访问服务的请求,也许过一小段时间就可以正常访问了。随着重试逻辑的不断变化,上面代码会越来越复杂。而且重试逻辑,其实是各个...
  • Java 8 时间日期库的20个使用示例

    万次阅读 2017-03-21 23:05:44
    除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的处理一直以来都饱受诟病...
  • 如何精确表达java.util.Date的业务逻辑

    千次阅读 2009-12-12 09:10:00
    Java中最常用的日期时间操作类有四个:java.util.Datejava.sql.Datejava.sql.Timejava.sql.Timestamp 为了精确表达业务逻辑,应尽量避免使用父类(java.util.Date)的方法。java.sql包下的三个子类中特有的val
  • java时间格式化处理

    万次阅读 2018-07-26 09:21:31
    这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.  //------------------------------------------------------ import java.util.Date;  public class DateExample1  {  public static void ...
  • JAVA8中时间的处理

    万次阅读 2015-11-13 09:14:12
    Java 8时间和日期API 20例   本文由 ImportNew - Sandy 翻译自 javarevisited。欢迎加入翻译小组。转载请见文末要求。 伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的...
  • java8 日期 时间 时区

    千次阅读 2015-04-11 14:19:05
    java8 时间 日期 时区
  • 首先需要创建java文件,例如上述的HelloWorld.java,文件内容定义一个主类,然后类里面顶一个main主方法,作为程序的执行入口。 使用JDK的javac命令编译源文件(即HelloWorld.java),生成字节码文件(Hell
  • 愤怒!竟然还有学校还在教 Java 的 Swing

    万次阅读 多人点赞 2021-05-24 08:34:36
    昨天,有个读者私信我说,“老师正在教 Swing,这个...但我内心其实是非常愤怒的,都什么时候了,Java 中的 Swing 早被淘汰了,哪个项目还会用这玩意编写客户端界面呢! 学 Swing、AWT 这些图形化组件纯属浪费时间! 可
  • 在实际开发过过程中,我们会经常遇见将一个“庞大”的任务拆分成多个子任务,各个子任务在独立的子线...代码如下:WorkThread.javapublic class WorkThread extends Thread { @Override public void run() { try {
  • Java Calendar.set 方法设置时间的问题

    万次阅读 2018-09-09 09:46:42
    因项目需要,需要遍历一年中的其中几个月,获得每个月的用户数量。 变量有:开始时间--startDate,结束时间--endDate。 逻辑很简单:获取到开始时间的月份和结束时间的月份,然后得到月份
  • java比较当前时间与所需时间比较

    千次阅读 2019-05-20 10:16:14
    try{ //规定格式 (格式根据自己数据库取得的数据进行规范) SimpleDateFormat sdf=new SimpleDateFormat(... //获取当前时间 String dateOne = sdf.format(new Date()); Date dateTwo = new Date(); ...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 542,918
精华内容 217,167
关键字:

java时间逻辑

java 订阅