某公司笔试题解读(一)

  上午刚参加完一公司的笔试,整个笔试给我的感受是,比较基础也很全面。但自己就是有好多不确定,好多需要时间思考,总之就是基础需要补回来。下面我就总结一下这次的笔试,举一反三地把相关知识点也梳理下。

一、最让我抓狂的SQL题

  这种SQL题我以前做过好多次了,工作两年多用得少,SQL也写得不多,运用SQL的思维能力都下降了。题目大概是“有一张销售营业额表(t_sales),表结构如下: 

CREATE TABLE t_sales(
    t_person VARCHAR(20),   #销售人员
    t_item VARCHAR(100),    #商品
    t_sale INT,             #销售额
    t_time DATE             #时间
)

  “求各种商品今年销售额最高的销售人员和商品名”

  这题目看它的数据结构应该是用Mysql写的,我就用Mysql来解答吧(我当时用了oracle语法解答的,悲剧呀) 

SELECT t.* FROM 

    (SELECT t_item,t_person,SUM(t_sale) year_sale FROM t_sales
        WHERE YEAR(t_time) = YEAR(NOW())
        GROUP BY t_item,t_person order by year_sale desc) t

    GROUP BY t.t_item 

二、cookie和session的代码实现

 1、设置cookie

  今天笔试题考的是cookie的设置,我竟然选了request也可以设置cookie,我的天呀。

  我们来看如何在response设置吧

public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{

        Cookie c = new Cookie("name","jenkins");
        resp.addCookie(c);

 } 

  这样子设置,实际上是在返回的消息头中加了一个key-value,key为Set-Cookie,value也是key-value的形式,上面的就是:name=小明,多个cookie用分号(;)隔开

  消息头中的样式是:Set-Cookie:name=jenkins;JSESSIONID=ERERE23343423

  其实如果要在request中把cookie返回到服务器端,我们可以在请求的消息头中加一个值:

package servletbase;

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;

public class MyServlet01 extends HttpServlet{

    public void postCookieToServer(){
        HttpClient client = new HttpClient();
        List<Header> headers = new ArrayList<Header>();
        //把key为JSESSIONID的cookie上传到服务器,服务器会根据这个id来判断
        //发起该会话的用户是不是之前登录过,做鉴权
        headers.add(new Header("cookie","JSESSIONID=RERER3"));
     //设置消息头
        client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
    }

}

2、查询Cookie

  在请求对象中获取:

public void getCookieFromRequest(HttpServletRequest request){
        //获取cookie数组
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            //获取cookie的key-value
            String name = cookie.getName();
            String value = cookie.getValue();
        }
    }

3、修改Cookie 

public void updateCookieFromRequest(HttpServletRequest request,HttpServletResponse response){
        //获取cookie数组
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            //修改cookie的value
            String name = cookie.getName();
            if(name.equals("city")){
                cookie.setValue("guangzhou");
                response.addCookie(cookie);
            }
        }
    }

4、Cookie的编解码(value为中文时需要编码,否则访问时会报错)

     //编码
        Cookie c = new Cookie("city",URLEncoder.encode("广州","utf-8"));

        //解码
        String value = c.getValue();
        value = URLDecoder.decode(value,"utf-8");

5、Cookie的其他方法

//设置生存时间,单位是秒,默认小于零,保存在内存中。等于零是即刻删除
cookie.setMaxAge(30)

//设置路径,浏览器访问服务器时只向cookie路径或者子路径发送cookie,以下访问/web/index.html是会发cookie,但访问/myweb/index.html就不会了
cookie.setPath("/web");

6、Cookie的限制

  a、可以被用户限制

  b、保存在浏览器,不安全,敏感数据要进行加密

  c、只能保存少量数据,大约4k左右

  d、个数有限制

  e、只能保存字符串

7、Session定义和工作原理

  简单来说Session就是服务器为每一个访问的浏览器分配的内存空间,它有一个唯一的id,并且会将这个sessionid以cookie的形式发送到浏览器,浏览器再次访问时就会把这个sessionid发送到服务器,服务器就能找到session对象。

  如果浏览器再次访问时,服务器能找到对应的sessionid,则服务器不再返回sessionid到浏览器。

8、获取Session 

//参数为true时一定会返回session对象
HttpSession session = request.getSession(true);
//不加参数默认是true
HttpSession session = request.getSession();

//参数为false时,则没有sessionid时返回null
//有sessionid,但找不到session对象时也返回null,能找到session对象就返回该对象
HttpSession session = request.getSession(false);

9、使用Session绑定对象

//绑定对象
void session.setAttribute(String name,Object boj);
//获取绑定对象
Object session.getAttribute(String name);
//移除绑定对象
void session.removeAttribute(String name);

//删除session对象
session.invalidate();

10、Session超时

服务器会将空闲时间过长的session对象删除以节省内存空间资源,一般是30分钟 

在tomcat的conf/web.xml文件夹设置(单位是分钟):

  <session-config>

    <session-timeout>30</session-timeout>

  </session-config>

通过编程修改:

  void session.setMaxInactiveInterval(int seconds)

11、浏览器禁用cookie后果及解决方法

  浏览器禁用cookie后,session就不能用了,因为sessionid不能再浏览器保存。

  解决办法:使用URL重写方法解决,就是在重定向时在url中加sessionid参数,就不需要浏览器保存了。看以下的例子,假如登录验证过程了,需要重定向到首页 

if(name.equals("admin") && pwd.equals("admin")){
            session.setAttribute("name",name);
            //重定向到首页
            //response.sendRedirect("index.jsp");

            //改为,其会在路径后面加上jsessionid,
            //System.out.println("url:" + resp.encodeRedirectURL("index.html")); --> url:index.html;jsessionid=4E885D5D87247441F761C96ACA9A7B68
            response.sendRedirect( response.encodeRedirectURL("index.jsp"));              
        }

  登录之后我们就可以把sessionid保存到页面,访问时把它带上就好了,可以在url后面加上sessionid,如下:

  localhost:8080/testweb/servlet01;jsessionid=4E885D5D87247441F761C96ACA9A7B68

  另外如果在服务器端没有生成session对象,服务器是不会返回sessionid的cookie到浏览器的,即在服务器端要调用request.getSession()

12、Session的优缺点

  优点:

  a、安全(状态保存在服务器端)

  b、能保存的数据类型更多,cookie只能是字符串

  c、能保存更多数据

  缺点:

  session将状态保存在服务器端,占用服务器内存,当用户量过大时,会严重影响服务器性能。

三、重定向与转发的区别

  今天只考了代码如何实现的,我就把他们原理和区别总结一下吧

  1、重定向

  定义:服务器向浏览器发送一个302的状态码和一个Location消息头(其值是一个地址),浏览器收到后会马上向该地址发出请求。

  代码实现:response.sendRedirect("/index.html");

  之后的代码不能使用request和response,如下所示: 

response.sendRedirect("/index.html");
//response.sendRedirect("/login.html");  

  2、转发

  定义:一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另一个Web组件继续完成。常见的是Servlet获取数据之后将这些数据转发给JSP,有这个JSP来负责展示

  代码实现:request.getRequestDispatcher("index.jsp").forward(request,response);

    之后的代码不能使用request和response,如下   

req.getRequestDispatcher("/servlet02").forward(req, resp);
//req.getRequestDispatcher("/servlet03").forward(req, resp);

  3、重定向与转发的区别

  a、是否任意地址:重定向的地址可以任意地址,转发必须是应用内的某一地址

  b、浏览器地址是否变:重定向浏览器地址栏会变,转发浏览器地址栏不会变

  c、是否共享数据:重定向有两次请求对象,不共享数据;转发只生产一次请求对象,且在同一应用中共享数据。

  d、原理上的不同:重定向是浏览器收到响应后再向另外一个地址发出请求,转发是收到请求为了完成响应转到一个新地址。

四、request.getParameter()与request.getAttribute()的区别

  笔试考了他们返回的数据类型,request.getParameter()返回的是String,request.getAttribute()返回的是Object。下面看看他们的区别

1、HttpServletRequest类有setAttribute()方法,而没有setParameter()方法

2、request.getParameter()负责获取从浏览器(get,post上传的)其他HttpClient上传的参数。而request.getAttribute()是获取容器内部转发过来的数据,该数据需要用request.setAttribute()方法绑定,常见于Servlet中把获取的数据转发到JSP显示。

参考:http://www.cnblogs.com/jirglt/archive/2012/10/25/2738617.html

五、javascript题

1、考变量赋值和返回

代码如下,问执行后y的值是多少?

   var y = 0;
    function f(n){
        n += 1;
    }
    function m(){
        y = f(0);
    }

  结果是:undefined

  js的语法是比较弱的,没有返回值的函数也能赋值到变量。

2、考js的日期函数

就是考Date对象的几个函数,年月日 时分秒,我都总结一遍吧

     var now = new Date();
        var yy = now.getYear();//返回从1900开始算得年份间隔,2016就返回116
        yy = 1900 + yy;//加上1900就是2016了
        var MM = now.getMonth();//返回月份,范围是0-11
        MM = MM + 1;//加上1就是正常月份
        var dd = now.getDate();//返回月份的第几天,从1开始算

        var arr = new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
        var day = now.getDay();//返回星期,0是星期日,6是星期六
        var week = arr[day];

        var date = yy+"年"+MM+"月"+dd+"日"+"  "+week+"  ";

        var hh = now.getHours();//返回小时数,24小时制
        var mm = now.getMinutes();//返回分钟数
        var ss = now.getTime();//返回日期的毫秒数
        ss = ss % 60000;//一分钟取余数,单位是毫秒
        //ss % 1000是求得不够一秒的毫秒数,与ss相减是为了求得能够被1000整除的数
        ss = (ss - (ss % 1000)) / 1000;

        var time = hh + ":" + mm + ":" + ss;

        alert("现在的时间是:" + date + time);

 以上比较特殊的是年份、月份和星期

六、到处考的字符集编码

  字符集编码是特别困扰程序员的,我之前也有去研究过,但可能认识地不够深入,笔试时也没能答得很好。笔试是问“什么编码是可以兼容gb2312的?”,我只选了GB18030,其实GBK也可以兼容的。

  网上找了些资料,再来梳理下这些麻烦的字符编码集,就从他们的历史顺利开始吧

  1、ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)

    这应该是最早的编码集,单字节,最多保存256个状态(2的8次方),前127号已经用于英文、数、符号编码,128以后的是扩展位

  2、ISO-8859-1

    单字节,兼容ASCII,用到了ASCII的扩展位,支持部分欧洲使用的语音。以ISO-8859-1编码的文本,都以bytes[]的形式保存,若要显示中文,则用中文编码集解码即可。如果用ISO-8859-1解码则显示乱码。通常页面上传输的编码都是ISO-8859-1。

  3、gb2312

    1980年,一共收录了7445个字符,包括6763个汉字和682个其它符号。很少用了。

  4、GBK

    是微软对gb2312的扩展,是微软标准但不是国际标准,向下兼容gb2312,出现于Windows 95简体中文版中

  5、GB18030

    2000年,取代了GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了一些少数民族文字。编码是一二四字节变长编码。向下兼容gb2312,基本兼容gbk,单字节兼容ASCII

  6、Unicode(统一码、万国码、单一码)

    Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode 16编码里面已经包含了GB18030里面的所有汉字。总之它就是世界各国通用的字符编码集,而不是每个国家自己搞一套,互不兼容。储存每个字符都是用两个字节,英文、汉字都是两个字节,所以存储英文比较浪费空间。

  上面讲得都是字符集,我们在写程序中经常用到的utf-8其实不是字符集,他只是一种编码方式,是对字符集Unicode的再次编码。utf-8是变长字符编码,用1-4个字节表示一个字符,如用一个字节表示英文,中文占了3个字节。utf-8是为了解决网络传输和存储问题的,网络上传输是8个位传输的,这满足了宽带传输的要求(utf-16就是16位传输);储存时可以把英文单字节存储节省空间。

     

时间: 2024-10-22 19:05:37

某公司笔试题解读(一)的相关文章

某支付公司笔试题二

题目:用java编写一段程序采用选择排序法对数组array = {25,15,42,16,12,36}进行由小到大排序. 1.选择排序法 该排序法的思想是每次从当前元素开始往后查找最小元素,将最小与当前元素进行位置互换.选择排序和冒泡排序相比优势在于交换次数减少. // 时间复杂度n(n-1)/2,即O(n^2) public static void selectSort(int[] array){ int k,tmp,len; len=array.length; for(int i=0;i<l

java各公司笔试题集1

IBM笔试题 注:IBM笔试题一小时之内完成,题目全部用英文描述,这里用中文表述 一.名词解释 1.Eclipse 2.J2EE 3.EJB 4.Ajax 5.Web service 二.找出以下代码问题 public class test{ public void print(String str){ char[] s=str: } } public class a{ public static void main(String [] args){ puts() } } 三.写出以下输出 pu

某公司笔试题

记录一下一份笔试题上的知识点: 1.short类型的范围是多少? 2.考i++ 和++i的考点. 3.可以成为内部函数的修饰类型为. 4.关于建索引的知识. 5.wait() 和 sleep()的区别. 6. gc是什么,为什么需要有gc. 7.谈谈代码重复的理解. 8.final finally finalized的区别. 9.写一个singleton. 10.分别用递归和非递归实现二叉树的后序遍历. 11.有a[n]和b[n]两个数组,f(x)为随机函数,请将a[n]的数随机赋给b[n],要

软件公司笔试题

1.java基本数据类型 byte short int long float boolean double char 2.单例模式 第一种(懒汉,线程不安全): Java代码   public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = ne

操作系统各大公司笔试题汇总

转自:Hackbuteer1 http://blog.csdn.net/hackbuteer1/article/details/6787354 1.在段页式存储管理中,其虚拟地址空间是() A.一维                               B.二维                                C.三维                            D.层次 答案:B 2.采用( )不会产生内部碎片(“内零头”) A.分页式存储管理          

微软公司笔试题_附上源码解决

第一道题 # -*- coding: utf-8 -*- ''' f(a*b, acb) => true f(abc*, abbc) => false f(**bc, bc) => true ''' import re string='abbc' Regex = re.compile(r'(abc)*') def f(Regex,string): mo = Regex.search(string) if mo.group()!='': return True else: return F

关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目

关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目,请大家鉴定,不足之处,敬请指教! 第1到3题解答如下: public enum QuestionType { Text = 0, MultipleChoice = 1 } public interface IQuestion { string Title { get; set; } QuestionType Category { get; } } public abstract class Que

ThoughtWorks笔试题之Merchant&#39;s Guide To The Galaxy解析

一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天HR就打开电话,基本了解了一下情况(工作环境不错,男人妹子比例:1:1,双休,六险一金,满一年年假15天,病假8天,月薪1W--2W).然后立马收到一封:Coding Assignment的笔试题目.网上搜索了一下,发现这个公司还是挺大的,公司面试流程是出了名的繁杂和苛刻.据说有8轮:电话面试=>笔试=>Homework=>结对编程(中午管饭)=>技术面试=>PM面试=>

有意思的笔试题记录与分析

昨天参加了某公司的笔试,总的来说题目很简单.但是还是有几个个题目是很有意思的,拿来和大家分享下! 1.小周带着他的鸵鸟穿越1000公里的沙漠,运送3000颗白菜.已知鸵鸟一次性可驼1000颗白菜,但每走1公里又要吃掉1棵白菜,问:小周最终可以运多少颗白菜? 分析:记得以前算法设计书上有个类似的油车过沙漠的问题,当时这问题是用倒推法来解决的,因为它有个结题突破口:油车以最少的耗油量穿过沙漠.本题同是过沙漠问题,但是却没有像油车过沙漠的解题突破口,怎么办呢?我们先想一个极限:让小周直接带着1000颗