JAVA面试题2.docx
- 文档编号:7914475
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:22
- 大小:35.19KB
JAVA面试题2.docx
《JAVA面试题2.docx》由会员分享,可在线阅读,更多相关《JAVA面试题2.docx(22页珍藏版)》请在冰豆网上搜索。
JAVA面试题2
java面试题(续)
4.多线程:
在同一应用程序中,有多个顺序流同时执行。
同步和异步有和异同,在什么情况下分别使用他们?
临界资源问题
线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。
但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。
我们需要做的是允许一个线程彻底完成其任务后,再允许下一个线程执行。
必须保证一个共享的资源一次只能被一个线程使用。
实现此目的的过程称为同步。
同步是用于确保资源一次只能被一个线程使用的过程。
同步对于单线程程序没有任何好处。
使用同步比非同步的性能差三到四倍。
线程方法介绍:
构造函数:
Thread()
Thread(Runabletarget)
Thread(Runabletarget,Stringname)
Thread(ThreadGroupgroup,Runabletarget)
Thread(ThreadGroupgroup,Runabletarget,Stringname)
Thread(ThreadGroupgroup,Stringname)
用于完成一个线程“实际功能”的代码放在run方法中。
Run方法可以在Thread的子类中重写,也可以在Runable对象中重写。
一旦线程死去,它就永远不能再重新启动,否则会抛出异常。
用start方法启动一个已经启动的线程也会抛出异常。
isAlive、interrupt、Thread.currentThread、suspend、resume、stop
Sleep方法可以使低优先级的线程得到执行的机会,Yield方法只能使同优先级的线程有执行的机会。
Join方法能够使调用该方法的线程在此之前执行完毕,在该方法之后,调用join方法的线程不会产生输出了,
Wait与notify使用时,需要注意的事项?
它们只能用于synchronized同步块中;
它们需要配对使用;
Wait一般出现在一个while循环中,while语句使用一个boolean标志控制。
死锁
当被锁定的A对象试图访问另一个被锁定的B对象,B对象同时又要访问已被锁定的A对象。
这样导致两个线程都在等待另一个线程释放资源,这样就出现了死锁。
16、JAVA多线程编程。
用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。
希望大家补上,谢谢
17、STRING与STRINGBUFFER的区别。
答:
STRING的长度是不可变的,STRINGBUFFER的长度是可变的。
如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
Strings=newString("xyz");创建了几个StringObject?
两个
JDBC调用数据库的基本步骤
WeblogicServer中的JDBC配置
1、建立到指定数据库的连接池ConnectionPool
2、建立基于该连接池的数据源DataSource
3、访问数据库时通过数据源的JNDI名字查找到该数据源,然后通过数据源获得数据库连接对象。
得到该对象后就可以依次生成数据库语句对象和结果集对象,进行相应的数据库操作。
importjava.sql.*;
importjavax.naming.*;
importjavax.sql.*;
importjava.util.*;
importjavax.rmi.*;
publicclassDataSourceTest{
privatestaticContextgetInitialContext()throwsException{
Stringurl="t3:
//localhost:
7001";
Stringuser="system";
Stringpassword="11111111";
Propertiesproperties=null;
try{
properties=newProperties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL,url);
if(user!
=null){
properties.put(Context.SECURITY_PRINCIPAL,user);
properties.put(Context.SECURITY_CREDENTIALS,
password==null?
"":
password);
}
returnnewInitialContext(properties);
}catch(Exceptione){
throwe;
}
}
publicstaticvoidmain(Stringargs[]){
UserTransactiontx=null;
DataSourceds=null;
Contextctx=null;
ConnectionmyConn=null;
try{
ctx=getInitialContext();
tx=(UserTranscation)ctx.lookup("javax.transcation.UserTranscation");
tx.begin();
ds=(DataSource)ctx.lookup("myTxDataSource");
}catch(Exceptione){
e.printStackTrace();
}
StatementmyStatement=null;
ResultSetmyResultSet=null;
try{
myConn=ds.getConnection();
myStatement=myConn.createStatement();
myResultSet=myStatement.executeQuery(
"selectfullnamefromemployee");
while(myResultSet.next()){
System.out.println(myResultSet.getString("fullname"));
}
mit();
}catch(Exceptione){
try{
tx.rollback();
}catch(Exceptione){
}
}finally{
myStatement.close();
myConn.close();
}
}
}
JavaMail发邮件的步骤:
Propertiesprops=System.getProperties();
props.put(“mail.smtp.host”,”*******”);//设置相关的属性
try{
//创建一个会话对象
Sessionsession=Session.getDefaultInstance(props,null);
//创建一个消息对象
MimeMessagemessage=newMimeMessage(session);
message.setText(“*****”);//发送文本格式的邮件
message.setSubject(“*****”);
message.setFrom(“*****”);
message.addRecipient(Message.RecipientType.To,
newInternetAddress(“******”));
//使用传送类的send方法发送消息
Transport.send(message);
}catch(MessagingExceptionme){
me.printStackTrace();}
解析XML文件的几种方式和区别
XML解析器使用的两种基本API是:
文档对象模型DOM,一种基于树结构的API。
它定义了一组java接口,用于创建、访问和操纵XML文档的内部结构。
它是基于对象。
整个XML文档被作为对象体系结构排列进行解析和存储,应用程序可以随机访问这些对象。
DOM主要用于:
在结构上修改XML文档时;在内存中与其他应用程序共享文档时。
SAX提供一种用于解析XML文档的事件驱动模型,使用SAX接口的XML处理器并不创建数据结构,而是扫描输入的XML文档,并生成元素开始、元素结束等事件,在发生事件时,解析器会通知应用程序。
SAX优点:
在解析大型文档时,不必将整个文件加载到内存中,因此占有的内存比DOM少。
在只需要一个信息子集时,SAX忽略不需要的数据,而DOM无法做到这点。
SAX的缺点是:
必须按到达顺序处理数据,不能对文档进行随即访问。
SAX是只读的,它是设计来读取XML文档而不是写入的。
文档只能遍历一次。
使用DOMAPI查找XML文档中的元素和属性
importorg.w3c.dom.*;
importjavax.xml.parsers.*;
importjava.io.*;
import.URL;
publicclassBookDetails{
publicBookDetails(Stringfilename){
Documentdoc=null;
try{
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilderdb=dbf.newDocumentBuilder();
doc=db.parse(newFile(filename));
Stringnm="
Stringlocal="a";
Stringob="";
System.out.println(nm+"名字空间中的元素");
NodeListnl=doc.getElementsByTagNameNS(nm,"*");
for(inti=0;i Noden=nl.item(i); System.out.println(n.getNodeName()); } System.out.println("\n名称为"+local+"的元素"); nl=doc.getElementsByTagNameNS("*",local); for(inti=0;i Noden=nl.item(i); System.out.println(n.getNodeName()); } System.out.println("\n名字空间"+ob+"中的属性"); nl=doc.getElementsByTagName("*"); for(inti=0;i if(nl.item(i)instanceofElement){ Textt=(Text)nl.item(i).getFirstChild(); Elemente=(Element)nl.item(i); Attra=e.getAttributeNodeNS(ob,"class"); if(a! =null){ Stringval=a.getNodeValue(); System.out.println("<"+val+">"+t.getNodeValue()+""+val+">"); } } } }catch(Exceptione){ e.printStackTrace(); } } publicstaticvoidmain(Stringargs[]){ BookDetailsnsd=null; if(args.length>=1){ nsd=newBookDetails(args[0]); }else{ System.out.println("Books.xml"); } } } 使用SAXAPI解析XML文档 importorg.xml.sax.Attributes; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; importjavax.xml.parsers.SAXParser; importjavax.xml.parsers.SAXParserFactory; publicclassSAXParserHandlerextendsDefaultHanlder{ publicvoidstartDocument()throwsSAXException{ System.out.println("起始文档"); } publicvoidendDocument()throwsSAXException{ System.out.println("结束文档"); } //在遇到字符数据时激发 publicvoidcharacters(char[]ch,intstart,intlenght)throwsSAXException){ StringcharString=newString(ch,start,lenght); System.out.println("字符: "+charString); } publicvoidstartElement(StringnamespaceURI,StringlocalName,StringqName, Attributesatts)throwsSAXException{ System.out.println("起始元素"+qName); for(inti=0;i System.out.println("属性值: "+atts.getvalue(i)); } } publicvoidendElement(StringnamespaceURI,StringlocalName,StringqName) throwsSAXException{ System.out.println("结束元素"+qName); } publicstaticvoidmain(Stringargs[])throwsException{ SAXParserFactoryfactory=SAXParserFactory.newInstance(); SAXParserparser=factory.newSAXParser(); parser.parse("book.xml",newSAXParserHanlder()); } } 使用DOMAPI写XML文档 importorg.w3c.dom.*; importjavax.xml.parsers.*; importjavax.xml.transform.*; importjavax.xml.transform.dom.*; importjavax.xml.transform.stream.*; importjava.io.*; publicclassStudent{ publicstaticvoidmain(Stringargs[]){ Documentdoc; Elementstudents; Elementstud; ElementfName; ElementsName; try{ DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance(); DocumentBuilderdb=dbf.newDocumentBuilder(); doc=db.newDocument(); stud=doc.createElement("Student"); fName=doc.createElement("FirstName");; fName.appendChild(doc.createTextNode("John")); stud.appendChild(fName); sName=doc.createElement("Surname"); sName.appendChild(doc.createTextNode("David")); stud.appendChild(sName); students=doc.createElement("Students"); students.setAttribute("Department","Mathematics"); students.appendChild(stud); doc.appendChild(students); TransformerFactorytf=TransformerFactory.newInstance(); Transformertransformer=tf.newTransformer(); transformer.transform(newDOMSource(doc),newStreamResult(System.out)); }catch(Exceptione){ e.printStackTrace(); } } } 使用DOMAPI显示现有XML文档内容 使用DOMAPI将XML文档数据插入数据库 使用DOMAPI根据数据库创建XML文档 Java的国际化 国际化是为了将应用程序发布在多个地区(locale)而进行准备的过程。 不同地区标识了各个特定的国家在信息表现上所广泛使用的语言、流通货币、字符集、日期格式及其他要素。 支持国际化的应用程序具有以下特点: 1、不用改变代码就可以支持另外的语言。 2、文本元素、消息和图片保存在源代码之外。 3、将于文化背景有关的数据,比如日期和时间、十进制数值以及流通货币,根据用户所用的语言和所在地理位置进行正确格式化。 4、支持非标准字符集。 5、应用程序可以快速适应新的语言区域。 为了使一个应用程序国际化,: 1、必须将用户所见到的硬编码字符(如标签、工具提示和错误信息等)替换成包含在资源包ResourceBundle中的字符。 它是一个java属性文件,它将关键字映射为字符值。 并且可以使用多个不同语言版本的ResourceBundle,这样将可以对于不同语言提供不同的字符串。 2、使用Locale对象,可以使数据格式化为与地区相关的数据。 3、国际化的应用程序还必须使用统一的字符编码标准字符集。 应用服务器有那些? Servlet方面 什么是Servlet? Servlet是J2EE应用框架中部署于Web层的Web组件,运行在支持Servlet的Web服务器或应用服务器上。 Servlet为客户端和服务器端的信息处理提供了一种“请求/响应”机制。 客户程序将请求发送到服务器;服务器将请求发送到Servlet;依据客户程序的请求,Servlet动态地构造回答信息并返回给服务器;服务器将回答返回给客户程序。 什么是JSP? JSP是J2EE应用框架中部署于Web层的Web组件,是对Servlet技术的扩展。 它使在静态的页面中加入动态的内容变得非常容易。 并且通过使用标签库可以大大节省开发时间;将JavaBean与JSP一起使用可以将数据表示和程序实现分离。 在MVC架构模式中: 使用Servlet作为控制器,而JSP作为数据视图。 CGI与Servlet的区别? CGI(公共网关接口)是一项标准,使WEB服务器可以与外部应用程序交互。 但是该技术存在一些严重的限制: 1、CGI应用程序占用资源很多。 当系统要处理来自一个用户的请求时,就会创建一个新的进程来处理该请求,一旦CGI脚本停止执行,系统就必须收回该进程。 这种重量级进程的经常启动和停止非常低效。 2、CGI很难链接于请求进程的其他阶段,因为在WEB服务器上它们运行于不同的进程。 这就很难处理授权、工作流和日志记录工作。 JavaServlet技术提供了一个基于组件、与平台无关的方法来构建WEB应用程序。 Servlet没有标准CGI应用程序所遇到的性能局限。 Servlet比CGI更高效是因为: Servlet应用中将只创建一个单一个重量级进程,并对每个用户请求使用更轻量级的线程来完成请求处理,并且这些线程是由JVM自动维护。 每个客户端请求对应一个线程,每个Servlet类在Servlet容器中只存在一个唯一的对象(实例)。 Servlet类首次加载后将常驻内存。 1、说一说Servlet的生命周期? 答: 在第一次请求Servlet时将创建Servlet实例,容器调用实例的init方法,如果容器有请求要传送给servlet,它就会调用servlet实例的Service方法。 一个请求将作为一个线程。 如果服务器要销毁servlet实例就会调用servlet实例的destory方法,否则该实例将会常驻内存。 2、Servlet版本间(忘了问的是哪两个版本了)的不同? 希望大家补上,谢谢 会话根中技术 用户认证: 使用用户名和口令进行验证来让客户端访问某些资源。 隐藏表单字段: 用于保存一个浏览器在服务器中的相关信息。 URL重写: 在URL后面添加附加信息 持久Cookie: 在请求和响应头信息中添加和编辑信息 什么是会话对象? 会话对象用于在用户访问一个Web站点的多个页面时共享信息。 任何时候用户第一次访问某个网页,系统都将创建一个会话。 如果以后用户访问此网页,JSP将检索有关此会话的信息。 只要服务器收到此用户的请求,则会话就会持续,如果经过一段时间没有收到此用户的新请求,会话就会终止。 3、JAVASERVLETAPI中forward()与redirect()的区别? 使用重定向: 当调用sendRedirect方法时,Web容器就会向浏览器返回响应,指示需要新的URL。 因为浏览器发出了完全崭新的请求,所以在重定向之前存储为请求属性的任何对象都会消失。 使用转发: 当为一个请求调用转发时,请求就发送给服务器上另一个资源,而无需通知客户机由不同的资源处理请求。 这个过程完全在Web容器内部进行,客户机绝不知晓。 与重定向不同,转发过程中,对象
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 试题