经过一个多小时的奋战,被虐的惨惨的。。。
面试题如下:
- 考察的final和StringBuffer ,打印K;
引用Java编程思想140页:当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象,。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径(但可以自己编写类已取得使对象恒定不变的效果)。这一限制同样适用数组,它也是对象。
final 基本数据类型是不可改变,报错的
public class Test {
public static void setA(final StringBuffer aa) {
aa.append("aa");
}
public static void main(String[] args) {
StringBuffer aa = new StringBuffer("--");
setA(aa);
System.out.println(aa);
}
}
打印结果:–aa
- 讲讲堆和栈(内存)
栈是编译器自动申请的,例如在主函数里面,要声明一个int变量a,那么编译器就自动开辟一块内存存放变量a。而堆则不相同,是由程序员手动申请的,只要程序员感觉程序此处需要用到多大的内存空间,那么就使用new来申请固定大小的内存使用。栈的空间在程序结束的时候由系统或者编译器自动释放,而堆则在程序结束前由程序员手动使用delete释放,或者忘记手动释放,由系统在程序结束的时候自动回收。摘自http://blog.sina.com.cn/s/blog_75b0e2ad01013afr.html和https://www.douban.com/note/199184450/
- 直接插入排序,输入一个数组,然后输出将数组由小到大排序
public class Test {
public static void main(String[] args) {
int[] values = { 44, 23, 54, 88, 98};
sort(values);
for (int i = 0; i < values.length; ++i) {
System.out.println(values[i]);
}
}
public static void sort(int[] values) {
int temp;
int j = 0;
for (int i = 1; i < values.length; i++) {
if (values[i] < values[i - 1]) {// 此处的判断很重要,这里体现了插入排序比冒泡排序和选择排序快的原因。
temp = values[i];
// 数据往后移动
for (j = i - 1; j >= 0 && temp < values[j]; j--) {
values[j + 1] = values[j];
}
// 将数据插入到j+1位置
values[j + 1] = temp;
System.out.print("第" + (i + 1) + "次:");
for (int k = 0; k < values.length; k++) {
System.out.print(values[k] + ",");
}
System.out.println("");
}
}
}
}
- 抽象类(abstract)和接口(interface)的区别
1 抽象类是不能被实例化的类,只能作为由其他类继承的基类;
接口则定义了实现某种服务的一般规范(Objective-C中将接口称为“协议”(protocol)),声明了必需的函数和常量,但不指定如何实现。
2 子类通过extends关键字来继承抽象类(且只能继承一个);
类通过implements关键字来实现接口(可以实现多个)。
3 在抽象类中定义的所有方法都必须在子类中实现;
当类实现了接口后,接口中的所有方法都必须实现。如果实现类没有实现接口中的所有方法,则必须声明为抽象类。
4 在抽象类中可以实现一些行为(实际上,抽象类可以完全实现、部分实现、根本不实现);
在接口中只能定义方法,不能实现方法。
- 以逗号分隔的字符串转换成数组
这里需要用两种方法来做,分别为StringTokenizer和split。
参考:http://blog.youkuaiyun.com/sanyuesan0000/article/details/7699342
package com.data;
import java.util.StringTokenizer;
/**
*
* @Title: Test.java
* @Package: com.data
* @author you.xu
* @date 2016年4月27日下午2:14:28
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
String str = "1,2,3,4,5,6,7,8,9";
String[] strToArrayBySplit = strToArrayBySplit(str);
String[] strToArrayByStringTokenizer = strToArrayByStringTokenizer(str);
}
public static String[] strToArrayBySplit(String str) {
// 如果将“,” 替换成 “|”,这种方法会出错。
// 根据给定正则表达式的匹配拆分字符串,故而可以把字符串分离成单个字符的形式
String[] strArray = str.split(",");
return strArray;
}
//api说明:StringTokenizer 是出于兼容性的原因而被保留的遗留类
//(虽然在新代码中并不鼓励使用它)。建议所有寻求此功能的人使用
public static String[] strToArrayByStringTokenizer(String str) {
// 把","作为分割标志,然后把分割好的字符赋予StringTokenizer对象。
StringTokenizer st = new StringTokenizer(str, ",");
// 通过StringTokenizer 类的countTokens方法计算在生成异常之前可以调用此 tokenizer 的 nextToken
// 方法的次数。
String[] strArray = new String[st.countTokens()];
int i = 0;
// 看看此 tokenizer 的字符串中是否还有更多的可用标记。
while (st.hasMoreTokens()) {
// 返回此 string tokenizer 的下一个标记。
strArray[i++] = st.nextToken();
}
return strArray;
}
}
- 设计模式 此处略,需要认真学习一下。
- IOC和DI详解
- Linux命令:
// 查看Java进程
ps -ef | grep java
lsof -i:端口号
// 根据进程查看内存
cat /proc/pid/status
参考:http://www.unjs.com/ziliaoku/dn/192203.html
// 查看系统负载
top/sar -u
// 新建文件
touch xx.txt
// 新建文件夹
mkdir aa
- Sql语句
* 查询语句
select * from 表名 [where]
* 聚集函数
count 获取数量
sum 求和
avg 求平均数
max 最大值
min 最小值
* 分组
group by having 条件
* 内连接
* 普通内连接
* 前提条件:需要有外键的。
* 提交关键字 inner join ... on
select * from aa inner join bb on aa.id = bb.aid;
* 隐式内连接
* 可以不使用inner join ... on关键字
select * from aa,bb where aa.id = bb.aid;
* 外连接
* 左外链接(看左表,把左表所有的数据全部查询出来)
* 前提条件:需要有外键的。
* 语法: 使用关键字 left [outer] join ... on
select * from aa left outer join bb on aa.id = bb.aid;
* 右外链接(看右表,把右表所有的数据全部查询出来)
* 前提条件:需要有外键的。
* 语法: 使用关键字 right [outer] join ... on
select * from aa right join bb on aa.id = bb.aid;
- 有关异常try/catch
try {
① int a = 0;
② int b = a / 0;
} catch (Exception e) {
③ e.printStackTrace();
④ return false;
} finally {
⑤ System.out.println( "aaaa");
}
⑥return true;
如上代码会抛java.lang.ArithmeticException: / by zero异常
retrun和finally的执行顺序为先执行finally并打印“aaaa”,然后再return。可进行断点调试。
执行顺序为:①②③⑤④,然后返回false;
try {
① int a = 0;
② int b = a / 1;//此处修改
③ return true;
} catch (Exception e) {
④ e.printStackTrace();
⑤ return false;
} finally {
⑥ System.out.println("aaaa");
}
以上代码执行顺序为:①②⑥③并返回true。
这是今天上午的面试试题,做了一下总结,希望能够帮助到大家。
在此谢谢李老师,帮助我发现了一些自己不足的地方。
祝好