java面试题11
第九次面试题
1、 GC是什么?为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
2、 int a=5;int b=7,如何在不定义第三个变量的情况下实现a、b的值互换?
public static void main(String[] args) {
int a = 5;
int b = 7;
// 方法一:
a = a + b;
b = a - b;
a = a - b;
System.out.println(a);
System.out.println(b);
// 方法二:
a = a * b;
b = a / b;
a = a / b;
System.out.println(a);
System.out.println(b);
// 方法三:
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);
System.out.println(b);
}
3、 MVC的各个部分都有哪些技术实现?如何实现?
MVC 是 Model-View-Controller 的简写。 Model 代表的是应用的业务逻辑( 通过
JavaBean, EJB 组件实现), View 是应用的表示面( 由 JSP 页面产生), Controller 是提供
应用的处理过程控制( 一般是一个 Servlet), 通过这种设计模型把应用逻辑, 处理过程和显
示逻辑分成不同的组件实现。 这些组件可以进行交互和重用。
4、 面向对象的特征有哪些方面?
1.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治,封装的对象,这些对象通过一个受保护的接口访问其他对象
2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表达共性的方法,对象的一个新类可以从现在的类中派生,这个过程成为继承,新类继承了原始类的特性,新类成为原始类的派生类,而原始类称为新类的基类,派生类可以从他的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更加适合特殊的需求
3.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便充分的注意与当前目标有关的方面,抽象包括两个方面,一个是过程抽象,二是数据抽象
4.多态性:多态性是指允许不同类的对象对同一消息作出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活,抽象,行为共享,代码共享的优势,很好的解决了应用程序函数同名的问题
5、 简述线程的基本概念、线程的基本状态以及状态之间的关系
线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
线程的基本状态:
1.新生
用new语句创建的线程对象处于新建状态,此时它和其他java对象一样,仅被分配了内存。2.就绪
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待cpu的使用权。
3.运行状态
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程处于这个状态。
只有处于就绪状态的线程才有机会转到运行状态。
4.阻塞状态
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才会有机会获得运行状态。
阻塞状态分为三种:
1、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
2、同步阻塞:运行的线程在获取对象同步锁时,若该同步锁被别的线程占用,则JVM会把线程放入锁池中。
3、其他阻塞:运行的线程执行Sleep()方法,或者发出I/O请求时,JVM会把线程设为阻塞状态。当Sleep()状态超时、或者I/O处理完毕时,线程重新转入就绪状态。
5.死亡状态
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。
6、 Float f=3.4是否正确?
不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。
7、 用js代码写一个Ajax请求(get方式)(写出代码)
function doGet(url){
// 注意在传参数值的时候最好使用encodeURI处理一下,以防出现乱码
createxmlHttpRequest();
xmlHttp.open("GET",url);
xmlHttp.send(null);
xmlHttp.onreadystatechange = function() {
if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) {
alert(‘success‘);
} else {
alert(‘fail‘);
}
}
}
8、 截取字符串abcdefg的efg(写出代码)
public static void main(String[] args) {
String s = "abcdefg";
s = s.substring(4, 7);
System.out.println(s);
}
9、 简要回答如何解决页面前端各个浏览器的兼容性问题?
因为很多浏览器的内核不一样,解析页面内容的时候也不一样。所以在a浏览器显示的内容在b浏览器就不一定是一样的。可以考虑使用html5,其兼容性越来越强,而且很多浏览器开始都开始兼容html5了。
10、 写出一条mysql的分页语句
select * from table order by id limit (intPage - 1) * PageRow , intPage * PageRow
PageRow 每页多少条记录
intPage 页数
11、 请编写sql语句,要求tf_f_user表中随机查询5条数据
MySQL:
SELECT * FROM TF_F_USER ORDER BY RAND() LIMIT 5
12、 是否可以继承String类?
因为Sting是这样定义的:public final class String extends Object,里边有final关键字,所以不能被继承。
什么样的类不能被继承?
一,在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的。
二,final是java中的一个关键字,可以用来修饰变量、方法和类。用关键词final修饰的域成为最终域。用关键词final修饰的变量一旦赋值,就不能改变,也称为修饰的标识为常量。如果一个类的域被关键字final所修饰,它的取值在程序的整个执行过程中将不会改变。
三,假如说整个类都是final,就表明自己不希望从这个类继承,或者不答应其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。
13、日期和时间:(写出代码)
-如何获得年月日、小时分钟秒?
-如何取得从1970年1月1日0时0分0秒到 现在的毫秒数?
-如何取得某月的最后一天?如何格式化日期?
-如何格式化日期?
public static void main(String[] args) throws ParseException {
Calendar now = Calendar.getInstance();
System.out.println("年: " + now.get(Calendar.YEAR));
System.out.println("月: " + (now.get(Calendar.MONTH) + 1) + "");
System.out.println("日: " + now.get(Calendar.DAY_OF_MONTH));
System.out.println("时: " + now.get(Calendar.HOUR_OF_DAY));
System.out.println("分: " + now.get(Calendar.MINUTE));
System.out.println("秒: " + now.get(Calendar.SECOND));
System.out.println("当前时间毫秒数:" + now.getTimeInMillis());
Date d = new Date();
System.out.println(d);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateNowStr = sdf.format(d);
System.out.println("格式化后的日期:" + dateNowStr);
String lastDay = getLastDayOfMonth(2014, 5);
System.out.println("获取当前月的最后一天:" + lastDay);
}
public static String getLastDayOfMonth(int year, int month) {
Calendar cal = Calendar.getInstance();
// 设置年份
cal.set(Calendar.YEAR, year);
// 设置月份
cal.set(Calendar.MONTH, month - 1);
// 获取某月最大天数
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
// 设置日历中月份的最大天数
cal.set(Calendar.DAY_OF_MONTH, lastDay);
// 格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String lastDayOfMonth = sdf.format(cal.getTime());
return lastDayOfMonth;
}
public static void main(String[] args) throws ParseException {
String lastDay = getLastDayOfMonth(2014, 5);
System.out.println("获取当前月的最后一天:" + lastDay);
}
14、求从1到100中能被3或5整除的数的和(写出代码)
public class Test01 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0 || i % 5 == 0) {
sum += i;
}
}
System.out.println(sum);
}
}
结果是:2418
15、同最有效率的方法算出2乘以8等于几?(写出代码)
class Test{
public static void main(String[] args) {
//最有效率的方式算出2乘以8等于几?
System.out.println(2<<3);
}
}
结果是:16