面试经历感悟:
第一部分是:Java基础。
一.String、StringBuffer、StringBuilder的用法:
首先他们三者的出现是由于我们java程序员在编写程序时,一把都会遇到大量的字符串的操作。java中就提供了String、StringBuffer、StringBuilder这几个类来操作字符串。下面就说说他们三者的具体使用:
1.1 String类:包含的了一个不可变的字符串。一旦一个String对象被创建,包含在这个对象中的内容就是不可改变的了,直至这个对象被销毁。
1.2 StringBuffer类:StringBuffer对象则是代表一个内容可变的字符串,StringBuffer和String虽然都是可以代表字符串,但是二者的实现方式有所不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存上的使用优于String。所以在实际使用中,如果经常需要对字符串进行修改,就是使用StringBuffer性能就更好一些。
1.3 StringBuilder类:是JDK5.0新增的代表字符串的对象,它和StringBuffer在很多方面是相同的。我们就说说他们两同胞兄弟格局个性的地方吧:StringBuffer方法是线程安全的,而StringBuilder不是线程安全的。所以StringBuilder的性能就要高一些。在不考虑线程安全的情况下,如果我们需要创建一个内容可变的字符串对象,我们可以优先考虑使用StringBuilder。
二,下列那种异常是检查异常,需要在编写程序时申明(C)
A NullPointException B ClassCastException
C FileNotFoundException D IndexOutOfBoundException
首先:异常分为-检查异常、运行时异常、错误。
检查异常:通常是用户错误或者不能被程序员所预见的问题(不能被简单的忽略)。例如:打开一个文件时,文件找不到。C-文件找不到。
运行时异常:一个程序在运行过程中可能发生的、可以被程序员避免的异常类型。与检查异常不同的是,运行时异常可以被忽略。如:数组越界、除数为零、引用为空、把引用类型转成一个无用的数据类型等。A-引用为空、B-类型转换出错、D-数组越界
错误:错误根本不是一个异常,但却是程序员或用户无法控制的问题。如:调用栈溢出。
三,分析下列代码,i,count变量的最终取值为:_7,16__;
int i = 4;
int count = (i++)+(i++)+(++i);
分析:常见的增量和减量运算符的前置和后置。i++就是后置增量:运行后加一。++i就是前置增量:运行前加一。
所以:i的值为-4-->5,5-->6,6-->7(最后一个前置了)。最终i的结果就为7。
count的值:4+5+7=16;
四,java接口修饰符可以为:BDE
A:private B:public C:protected D:final E:abstract
接口不是类,类是指描述对象的属性和行为,而接口里面只有行为。所以接口不符合类的定义。
接口所有方法全是抽象方法只能 public abstract修饰 (默认public abstract修饰 ),属性默认public static final修饰。
五,下面那个流类属于面向字符的输入流:D
A:BufferedWriter B:FileInputStream C:ObjectInputStream D:InputStreamReader
1.按照流的方向分为输入输出流:
输入流:从数据源读取数据到程序中,只能从中读取而不能写入数据,如:InputStream或Reader
输出流:从数据源写入数据到程序中,只能从中写入而不能读取数据。如:OutputStream或Writer
2.按照处理数据的最小单位的不同,可以分为两种类型。字符流和字节流。
字节流:字节流是以byte为最小单位进行数据传送。以InputStream或OutputStream结尾
字符流:字符流是以char为最小单位进行数据传送。以Reader和Writer结尾
六,下列哪些是不合法的标识:
A:do_it_now B:_Substitude C:9thMethod D:$addMoney E:%getPage F:2variable G:variable2 H:#myvar
在Java中我们需要标识代码中很多元素,包括类名、方法、字段、变量、包名等,我们选择的名称就是标识符,并且遵守以下规则:
1.标识符不能是关键字或true、false、null
2.标识符可以允许包含字母、数字(0-9)、下划线(_)、美元符号($)
3.标识符的第一个字符必须是:一个字母、下划线(_)、或美元符号($)
4.标识符是区分大小写的,并且没有规定最大长度
标识符就好比有:“三儿一女”-“美元字母下划线”+“数字”,还是以儿为重的主。
由此可知:CEFH都不是合法的标识符。
七,请问下列哪些语句在编译时会出错:
A:float f=1.3; B:double d =4.0; C:byte b = 257; D:String s="7"; E:int i=10; F:cahr c="a";
G:cahr c=5; H:boolean b = null;
编译时出错是指:语法错误,在eclipse中就会直接报错的错误称为编译时出错。
上面的大都是基本数据数据类型和String字符串,String字符串不属于基本数据类型。
所以从这些数据的定义的规则来看:ACFGH会编译出错。
将上列的错改为:
float f =1.3F;
byte b =(byte) 257;
char c ='a';//单引号,双引号即为字符串类型
boolean b = true;//只能是true or false,不能定义为其他的任何字符。
short dd = 3;是可以通过编译的。
八,下面那些事Thread类的方法:AB
A:start() B:run() C:exit() D:getPriority()
线程管理的主要方法定义在Thread类中,包括:
start()/run()/setName()/setPriority()-优先级/join-让调用者等待/interrupt()-中断本线程/yield()-让步/sleep();
第二部分为Sql部分:MySql数据库。
一共有两张表:sm_user和db_deptdoc
一,写出对数据库进行增删改查的关键字:
增:insert into 删:delete 改:update 查:select
二,查询sm_user表中不重复的数据:
SELECT DISTINCT * FROM sm_user;
三,查询sm_user中字段user_code为字符串01开头或结尾的数据:
SELECT * FROM sm_user WHERE user_code LIKE '01%' AND '%01';
四,查询sm_user中字段vtype的最大值:
SELECT MAX(vtype) FROM sm_user;
五,查询sm_user表中字段vtype等于该表中字段vtype最大值的全部信息:
SELECT * FROM sm_user WHERE vtype = (SELECT MAX(vtype) FROM sm_user);
六,统计sm_user表中以pk_deptdoc字段分组分别有多少条数据:
SELECT COUNT(pk_deptdoc) FROM sm_user;
七,统计sm_user表中以pk_deptdoc字段分组分别有多少条数据,并用内联接的方式关联表查询出对应的dept_name:
SELECT sm_user.user_name AS uName,bd_deptdoc.dept_name AS dName FROM sm_user INNER JOIN bd_deptdoc ON sm_user.pk_deptdoc = bd_deptdoc.pk_deptdoc;
八,查询出sm_user表user_name以‘蒲’开头且user_name值的长度为2的数据的vtype字段的平均值,平均值函数为avg(),字符串长度函数为length():
SELECT AVG(ALL vtype) WHERE (SELECT * FROM sm_user WHERE user_name LIKE '张%' AND LENGTH(user_name)=2);
九,对表sm_user按照这两字段user_code和user_name建索引:
CREATE INDEX Codeindex,Nameindex ON sm_user(user_code,user_name);
十,对表sm_user在这个字段sm_date上进行日期范围分区(写出关键字即可):
between and
第三部分:综合部分(简单题和代码编写)
简答题:
1.接口interface和抽象abstract的区别??
答:
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行。
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。
2.什么是方法覆盖?与方法的重载有什么不同?方法的覆盖与属性的隐藏有什么不同?
答:
重载:方法名相同,但参数不同的多个同名函数
注意:1.参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同。
2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义)。
3.main方法也是可以被重载的。
覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同,‘两同两小一大’。
注意:子类实例方法不能覆盖父类的静态方法;子类的静态方法也不能覆盖父类的实例方法(编译时报错),总结为方法不能交叉覆盖
隐藏:父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
注意:当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定。方法隐藏只有一种形式,就是父类和子类存在相同的静态方法。属性只能被隐藏,不能被覆盖。子类实例变量/静态变量可以隐藏父类的实例/静态变量,总结为变量可以交叉隐藏。
隐藏和覆盖的区别:
被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性。被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法。因为覆盖是动态绑定,是受RTTI(run time type identification,运行时类型检查)约束的,隐藏不受RTTI约束,总结为RTTI只针对覆盖,不针对隐藏。
特殊情况:
1.final修饰的属性可以被隐藏,但是不能被赋值,即不能用=来赋值,网上说final属性不能被修改,这个说法不准确,因为对于引用类型的变量用final修饰后,它只是不能被指向其他对象,但是可以改它自身的值,可以用ArrayList测试,final属性可以在运行的时候进行初始化,但是不能不出现初始化语句。
2.final修饰的方法不能被重写,可以被重载。
3.final修饰的类不能被继承。
4.private 方法隐式添加了final。
以上就是这次面试的面试题目的一些情况。
总结:
- 从面试题目来看涉及到数据库的知识很多,当然数据库的知识考察也是由简单到难得循循渐进,以此来确定你的水平。能给你开多少工资。但是当我在答题时,数据库的知识几乎全部答错了,因为在平时的sql语句中接触这些的时候相对比较少,所以才能到了这个地步。所以接下来的时间安排就要对数据库的知识进行一个回顾。
- java基础知识的考察,从题目看的出来考察的范围还是比较细的。所以在看java基础的知识的时候要重视理解。
- 框架的知识几乎没有涉及到,只是在面试的时候问了一些框架的知识。
- 还有一个就是对于基础知识中线程、流、集合的知识考察得比较多。
- 这次面试的失败,从心态到策略上来说有一些地方没做好。首先是心态上:以为随便写一写说一说就会通过的,未免有一些太轻视,所以才会在面试的时候被问死,那种强烈的反差使得自己有些乱了阵脚。策略上:以为会重视框架的知识较多,就复习框架的知识较多。但是并没有问及到框架的知识。所以,得到的信息就是基本上只会在乎你的基础知识,高深的东西压根不会在乎那么多,毕竟你的工作经验也摆在那里的。
- 基础知识掌握不牢是这次失利的根本所在。告诫处于没啥经验的朋友们多去看看基础知识和数据库吧。对面试成功有很大的帮助。