20160427面试总结

本文是作者2016年的一次面试总结,涵盖了Java中的final关键字、内存管理(堆栈区别)、直接插入排序、抽象类与接口的区别、字符串转数组的两种方法以及异常处理等核心知识点。通过这次面试,作者发现了自身的不足,并希望通过分享来帮助其他人学习和提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过一个多小时的奋战,被虐的惨惨的。。。
面试题如下:


  1. 考察的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.htmlhttps://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 在抽象类中可以实现一些行为(实际上,抽象类可以完全实现、部分实现、根本不实现);
   在接口中只能定义方法,不能实现方法。

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。

这是今天上午的面试试题,做了一下总结,希望能够帮助到大家。

在此谢谢李老师,帮助我发现了一些自己不足的地方。

祝好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值