java宝典(6)

简介: java宝典(6)

78、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:

1,张三,28


2,李四,35


3,张三,28


4,王五,35


5,张三,28


6,李四,35


7,赵六,28


8,田七,35



程序代码如下(答题要博得用人单位的喜欢,包名用该公司,面试前就提前查好该公司的网址,如果查不到,现场问也是可以的。还要加上实现思路的注释):


package com.huawei.interview;



import java.io.BufferedReader;


import java.io.IOException;


import java.io.InputStream;


import java.io.InputStreamReader;


import java.util.Comparator;


import java.util.HashMap;


import java.util.Iterator;


import java.util.Map;


import java.util.TreeSet;




public class GetNameTest {


/**


* @param args


*/


public static void main(String[] args) {

// TODO Auto-generated method stub


//InputStream ips = GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt");


//用上一行注释的代码和下一行的代码都可以,因为info.txt与GetNameTest类在同一包下面,所以,可以用下面的相对路径形式



Map results = new HashMap();


InputStream ips = GetNameTest.class.getResourceAsStream("info.txt");


BufferedReader in = new BufferedReader(new InputStreamReader(ips));


String line = null;


try {

while((line=in.readLine())!=null)


{

dealLine(line,results);


}


sortResults(results);


} catch (IOException e) {

// TODO Auto-generated catch block


e.printStackTrace();


}


}



static class User


{

public  String name;


public Integer value;


public User(String name,Integer value)


{

this.name = name;


this.value = value;


}



@Override


public boolean equals(Object obj) {

// TODO Auto-generated method stub



//下面的代码没有执行,说明往treeset中增加数据时,不会使用到equals方法。


boolean result = super.equals(obj);


System.out.println(result);


return result;


}


}



private static void sortResults(Map results) {

// TODO Auto-generated method stub


TreeSet sortedResults = new TreeSet(


new Comparator(){

public int compare(Object o1, Object o2) {

// TODO Auto-generated method stub


User user1 = (User)o1;


User user2 = (User)o2;


/*如果compareTo返回结果0,则认为两个对象相等,新的对象不会增加到集合中去


* 所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。


* */



//return user1.value-user2.value;


//return user1.value<user2.value?-1:user1.value==user2.value?0:1;


if(user1.value<user2.value)


{

return -1;


}else if(user1.value>user2.value)


{

return 1;


}else


{

return user1.name.compareTo(user2.name);


}


}



}


);


Iterator iterator = results.keySet().iterator();


while(iterator.hasNext())


{

String name = (String)iterator.next();


Integer value = (Integer)results.get(name);


if(value > 1)


{

sortedResults.add(new User(name,value));


}


}



printResults(sortedResults);


}


private static void printResults(TreeSet sortedResults)


{

Iterator iterator  = sortedResults.iterator();


while(iterator.hasNext())


{

User user = (User)iterator.next();


System.out.println(user.name + ":" + user.value);


}


}


public static void dealLine(String line,Map map)


{

if(!"".equals(line.trim()))


{

String [] results = line.split(",");


if(results.length == 3)


{

String name = results[1];


Integer value = (Integer)map.get(name);


if(value == null) value = 0;


map.put(name,value + 1);


}


}


}



}


79、写一个Singleton出来。

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。


一般Singleton模式通常有几种种形式:


第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。


public class Singleton {


private Singleton(){}


     //在自己内部定义自己一个实例,是不是很奇怪?


     //注意这是private 只供内部调用


     private static Singleton instance = new Singleton();


     //这里提供了一个供外部访问本class的静态方法,可以直接访问  


     public static Singleton getInstance() {


       return instance;    


     }


  }


  第二种形式:


public class Singleton {


 private static Singleton instance = null;


 public static synchronized Singleton getInstance() {


 //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次      


 //使用时生成实例,提高了效率!


 if (instance==null)


   instance=new Singleton();


return instance;


}


}


其他形式:


定义一个类,它的构造函数为private的,所有方法为static的。


一般认为第一种形式要更加安全些


80、递归算法题1

一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。

例:n=1237

则输出为:

1237,

2474,

4948,

9896,

9896,

4948,

2474,

1237,



public static void multiply(int n)


{

if(n>5000) return;


System.out.println(n);


multiply(n*2);


System.out.println(n);


}





81、递归算法题2

第1个人10,第2个比第1个人大2岁,依次递推,第8个人多大?


package cn.itcast;



import java.util.Date;



public class A1 {


public static void main(String [] args)


{

System.out.println(computeAge(8));


}



public static int computeAge(int n)


{

if(n==1) return 10;


return computeAge(n-1) + 2;


}


}



public static void toBinary(int n,StringBuffer result)


{


if(n/2 != 0)


toBinary(n/2,result);


result.append(n%2);


}


82、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。

本人只研究过冒泡排序、选择排序和快速排序,下面是快速排序的代码:


public class QuickSort {

/**

* 快速排序

* @param strDate

* @param left

* @param right

*/

public void quickSort(String[] strDate,int left,int right){

String middle,tempDate;

int i,j;

i=left;

j=right;

middle=strDate[(i+j)/2];

do{

while(strDate[i].compareTo(middle)<0&& i<right)

i++; //找出左边比中间值大的数

while(strDate[j].compareTo(middle)>0&& j>left)

j--; //找出右边比中间值小的数

if(i<=j){ //将左边大的数和右边小的数进行替换

tempDate=strDate[i];

strDate[i]=strDate[j];

strDate[j]=tempDate;

i++;

j--;

}

}while(i<=j); //当两者交错时停止


if(i<right){

quickSort(strDate,i,right);//从

}

if(j>left){

quickSort(strDate,left,j);

}

}

/**

 * @param args

 */

public static void main(String[] args){

String[] strVoid=new String[]{"11","66","22","0","55","22","0","32"};

QuickSort sort=new QuickSort();

sort.quickSort(strVoid,0,strVoid.length-1);

for(int i=0;i<strVoid.length;i++){

System.out.println(strVoid[i]+" ");

}

}



}


83、有数组a[n],用java代码将数组元素顺序颠倒


package cn.itcast.lecture2;



import java.util.Arrays;


import java.util.Collections;



public class ReverseTest {

public static void main(String [] args)


{

//产生若干0到1000的随机数,作为数组的初始值


int data[] = new int[]{

(int)(Math.random() * 1000),


(int)(Math.random() * 1000),


(int)(Math.random() * 1000),


(int)(Math.random() * 1000),


(int)(Math.random() * 1000),


(int)(Math.random() * 1000),


(int)(Math.random() * 100),


};


System.out.println(Math.random());


System.out.print("交换前的数据:");


System.out.println(


Arrays.toString(data));


reverse(data);


System.out.print("交换后的数据:");


System.out.println(Arrays.toString(data));


}



//方法执行完后,参数data中的数据顺序即被颠倒


//实现思路是第1个和第n个交换,第2个和第n-1个交换,依次类推...


public static void reverse(int[] data)


{


int len = data.length;


for(int i=0;i<len/2;i++)


{

int temp = data[i];


data[i] = data[len-1-i];


data[len-1-i] = temp;


}


}


}



84.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。

public class RenMingBi {


/**


* @param args add by zxx ,Nov 29, 2008


*/


private static final char[] data = new char[]{

'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'


};


private static final char[] units = new char[]{

'元','拾','佰','仟','万','拾','佰','仟','亿'


};


public static void main(String[] args) {

// TODO Auto-generated method stub


System.out.println(


convert(135689123));


}



public static String convert(int money)


{

StringBuffer sbf = new StringBuffer();


int unit = 0;


while(money!=0)


{

sbf.insert(0,units[unit++]);


int number = money%10;


sbf.insert(0, data[number]);


money /= 10;


}



return sbf.toString();


}


}


2. html&JavaScript部分

85. 判断第二个日期比第一个日期大

如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21 必须要保证用户的输入是此格式,并且是时间,比如说月份不大于12等等,另外我需要用户输入两个,并且后一个要比前一个晚,只允许用JAVASCRIPT,请详细帮助作答,,


//这里可用正则表达式判断提前判断一下格式,然后按下提取各时间字段内容


<input type="text" id="d1"/>


<input type="text" id="d2" οnblur="compare()"/>


<script>


function compare()


{

var d1 = document.getElementById("d1").value;


var d2 = document.getElementById("d2").value;


arr1 = d1.split("-");


arr2 = d2.split("-");


date1 = new Date(arr1[0],arr1[1],arr1[2]);


date2 = new Date(arr2[0],arr2[1],arr2[2]);


if(date2.getTime()<date1.getTime())


{

alert("不能比第一个日期小");


return false;


}


}


</script>


86. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。

87、HTML 的 form 提交之前如何验证数值不为空? 为空的话提示用户并终止提交?

88、请写出用于校验HTML文本框中输入的内容全部为数字的javascript代码

var re=/^\d{1,8}$|\.\d{1,2}$/;

var str=document.form1.all(i).value;

var r=str.match(re);

if (r==null)

{

sign=-4;

break;

}

else{

document.form1.all(i).value=parseFloat(str);

}


3. Java web部分

89、HTTP请求的GET与POST方式的区别

答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。


90、解释一下什么是servlet;

答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。


91、说一说Servlet的生命周期?

答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。



Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。


web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。



92、Servlet的基本架构

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 {


}


}


93、SERVLET API中forward() 与redirect()的区别?

答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用


sendRedirect()方法。



94、什么情况下调用doGet()和doPost()?

Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。



95、Request对象的主要方法:

setAttribute(String name,Object):设置名字为name的request的参数值


getAttribute(String name):返回由name指定的属性值


getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例


getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组


getCharacterEncoding():返回请求中的字符编码方式


getContentLength():返回请求的Body的长度


getHeader(String name):获得HTTP协议定义的文件头信息


getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例


getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例


getInputStream():返回请求的输入流,用于获得请求中的数据


getMethod():获得客户端向服务器端传送数据的方法


getParameter(String name):获得客户端传送给服务器端的有name指定的参数值


getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例


getParametervalues(String name):获得有name指定的参数的所有值


getProtocol():获取客户端向服务器端传送数据所依据的协议名称


getQueryString():获得查询字符串


getRequestURI():获取发出请求字符串的客户端地址


getRemoteAddr():获取客户端的IP地址


getRemoteHost():获取客户端的名字


getSession([Boolean create]):返回和请求相关Session


getServerName():获取服务器的名字


getServletPath():获取客户端所请求的脚本文件的路径


getServerPort():获取服务器的端口号


removeAttribute(String name):删除请求中的一个属性





96、forward 和redirect的区别

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。


  redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。


97、request.getAttribute() 和 request.getParameter() 有何区别?

98. jsp有哪些内置对象?作用分别是什么? 分别有什么方法?

答:JSP共有以下9个内置的对象:


request 用户端请求,此请求会包含来自GET/POST请求的参数


response 网页传回用户端的回应


pageContext 网页的属性是在这里管理


session 与请求有关的会话期


application servlet 正在执行的内容


out 用来传送回应的输出


config servlet的构架部件


page JSP网页本身


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



request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。


  response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)


  out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。


  pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。


  session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息


  applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息


  config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。


  page表示从该页面产生的一个servlet实例



99. jsp有哪些动作?作用分别是什么?

(这个问题似乎不重要,不明白为何有此题)


答:JSP共有以下6种基本动作


jsp:include:在页面被请求的时候引入一个文件。


jsp:useBean:寻找或者实例化一个JavaBean。


jsp:setProperty:设置JavaBean的属性。


jsp:getProperty:输出某个JavaBean的属性。


jsp:forward:把请求转到一个新的页面。


jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记


100、JSP的常用指令

isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)



101. JSP中动态INCLUDE与静态INCLUDE的区别?

答:动态INCLUDE用jsp:include动作实现


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



102、两种跳转方式分别是什么?有什么区别?

(下面的回答严重错误,应该是想问forward和sendRedirect 的区别,毕竟出题的人不是专业搞文字艺术的人,可能表达能力并不见得很强,用词不一定精准,加之其自身的技术面也可能存在一些问题,不一定真正将他的意思表达清楚了,严格意思上来讲,一些题目可能根本就无人能答,所以,答题时要掌握主动,只要把自己知道的表达清楚就够了,而不要去推敲原始题目的具体含义是什么,不要一味想着是在答题)


答:有两种,分别为:


<jsp:include page=included.jsp flush=true>


<jsp:forward page= nextpage.jsp/>


前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。



103、页面间对象传递的方法

request,session,application,cookie等


104、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。



105、MVC的各个部分都有那些技术来实现?如何实现?

答:MVC是Model-View-Controller的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。  


相关文章
|
负载均衡 算法 NoSQL
阿里大佬倾情力荐:Java全线成长宝典,从P5到P8一应俱全
前言 对于大部分的程序员来说,清晰地规划自己的职业发展并不是一件容易的事情。作为一个曾经底子比较差,从底层摸爬滚打多年走过来的程序员,在这里分享一下对我帮助很大的一份宝典,希望同行们能快速掌握这些技术,直接弯道超车。 很多程序员不知道学什么?或者说不知道从何学习?今天分享的这份宝典由阿里大佬倾情力荐,Java全线成长宝典,从P5到P8一应俱全。
|
消息中间件 设计模式 缓存
复习这份美团架构师的Java核心面试宝典,我四面阿里拿下offer
怎样才能拿到大厂的offer,没有掌握绝对的技术,那么就要不断的学习 他是如何拿下阿里等大厂的offer的呢,今天分享他的秘密武器,美团资深架构师整理的Java核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
工作五年,一年内我靠这系列java面试宝典从13K到大厂30K
我认为对于面试以及进阶最佳的学习方法莫过于刷题+博客+书籍+总结! 前三者我将淋漓尽致地挥毫于这篇文章中,至于总结要靠个人。实际上越到后面你越会发现面试并不难,其次就是在刷题的过程中有没有去思考,刷题只是次之,这又是一个层次了,这里暂时不提后面再谈。 我总结了一系列大厂面试中常问的面试技术点、深入解析以及答案,将为最近准备面试的各位去大厂保驾护航! 何谓面试?
|
监控 前端开发 Dubbo
Java 工程师必读的避坑宝典
但凡工作过的同学都会亲自经历过或者听过各种故障。 轻则受到批评,重则影响绩效,甚至被罚钱、开除。 那么,作为 Java 工程师,我们该如何尽可能避坑呢,有没有一些经验可以交流分享的呢? 本文,结合自己的经验,谈谈自己的看法。
396 1
Java 工程师必读的避坑宝典
|
设计模式 缓存 算法
阿里逆天级调优方案,内部这套Java性能调优实战宝典,堪称教科书
随着互联网的发展,高可靠、高并发以及降本增效,已成为各大公司面临的现实挑战,性能优化需求愈发迫切,大到分布式系统,小到代码块的算法优化,都已经成为你日常工作中必须要面对的事情。对于开发者而言,性能优化也从加分项变为一个热门技能,缺乏相关知识将很难在面试或工作中脱颖而出
阿里逆天级调优方案,内部这套Java性能调优实战宝典,堪称教科书
|
设计模式 监控 Java
简直人生外挂,直接涨薪25K,跪谢这份Java性能调优实战宝典
从整个软件生命周期的视角去关注与审视软件性能,通过主动式地设计与实现来主导软件性能,这样才能保证软件性能长期保持竞争力。针对这些问题,我结合自己十余年的性能调优开发经验。
|
Java 程序员 5G
独家下载!Java工程师成神必备宝典
初学Java的你还在烦恼不知道怎么去学,学习什么内容吗?那么多的技术书籍是否已经让你无从下手?别急,来看这一份完整的Java学习路径。
225458 0
独家下载!Java工程师成神必备宝典
|
XML Java 应用服务中间件
java宝典(9)
java宝典(9)
132 0
|
XML 缓存 开发框架
java宝典(8)
java宝典(8)
213 0
|
SQL 存储 开发框架
java宝典(7)
java宝典(7)
146 0
下一篇
无影云桌面