面试题链接:https://www.cnblogs.com/peke/p/7894685.html
赢在面试之Java基础篇(1)
1.可以有多个类,但只能有一个public的类,并且public的类名必须与文件名一致。
2.java有goto,但是是保留字,目前还没有被应用
3.相同点:&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时整个结果才为true
不同点:&&具有短路功能,即第一个表达式为false则不在计算第二个表达式;&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,如3&1结果是1
4.跳出循环使用break关键字,跳出多重循环可以在最外层循环使用标记,或者是用外层的循环可以受到内存循环的控制
5.switch可作用于char byte short int和对应的包装类,不能作用于long double float boolean和他们的包装类
6.对于short s1= 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1= 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
7.可以,因为 char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字
8.利用位运算2 << 3
9.如果final修饰的是一个基本数据类型的变量,那么这个变量的值就定了,不能变了,而如果修饰的是一个引用变量,那么该变量存的是一个内存地址,该地址就不能变了,但是该内存地址所指向的那个对象还是可以变的,就像你记住了人家的门牌号,但你不能管人家家里人员数量。
10. a.静态变量(类变量)前要加 static 关键字,而实例变量(成员变量)前则不加
b.静态变量属于类的,使用时直接用类名点,实列变量属于对象的,必须用对象才能点
c.静态变量存在于方法区中,实例变量存在于堆中
赢在面试之Java基础篇(2)
11.不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以 直接调用。
12.a.int是一个基本数据类型,Integer是int对应的包装类
b.int的默认值是0,Integer默认值是null
c、Integer实际是对象的引用,而int则是直接存储数据值 。
13.结果是12 和 -11 Math.round(11.5)的方法可以理解为将括号内的数+0.5之后,向下取值,
Math.ceil求最小的整数,但不小于本身 ---向上取整
Math.floor求最大的整数,但不大于本身. ----向下取整
Math.round求本身的四舍五入.
Math.abs求本身的绝对值.
14.Overload是重载,发生在同一个类中,方法名称相同,参数列表不同,Overload不能改变返回值类型
Override是重写,发生在父子类中,方法名称相同,参数列表相同,方法体不同
15,接口可以继承接口,抽象类可以实现接口?抽象类是可以继承具体类(concreteclass),抽象类中可以有静态的main方法
16.靠的是父类引用变指向子类的对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
17.参考链接:https://blog.csdn.net/shuaijunlan/article/details/51378019
18.都不能
19.完全可以。如果不是静态内部类,那没有什么限制!,如果内部类是静态的则只能访问外部的静态变量
20.没有,因为String对象时不可变的,所以s = s + "world!"会创建一个新的对象,然后将s的引用指向新建的对象
赢在面试之Java集合框架篇(3)
21.ArrayLis:底层是数组结构,查询速度快,增加/删除速度较慢,是线程不安全的
Vector和ArrayList一样都实现了List接口,但是线程安全
LinkedList:底层是链表结构,查询速度慢,增加/删除速度快,是线程不安全的
22.HashMap:线程不安全,key和value可以是null值
HashTable:线程安全,key和value都不可以是null值,和HashMap一样都是Map的实现类
23.List:是存储单列数据的集合,存储的数据是有序并且是可以重复的
Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复
24.List/Set是、Map不是
25.参考链接:https://www.cnblogs.com/guweiwei/p/6635530.html
26.ArrayList和Vector:都是使用数组方式存储数据,此 数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据 慢,Vector由于使用了synchronized方法(线程安全),通常性
能上较ArrayList差,Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的;当需要增长时,Vector 默认增长为原来一培,而ArrayList却是原来的一半
LinkedList:使用双向链表实现存 储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
27.方式一:遍历集合,新建一个集合,用contents()方法去判断,添加到新集合方式二:利用set集合不可重复性,遍历集合,新建一个集合,添加到set集合
28.Collection:是所有集合的父类
Collections:是一个服务于Collection类的工具类
29.equals
赢在面试之Java基础篇(4)
31.2个,一个“xyz”,一个new String()对象;String类不能被继承
32.String:String对象是不可变的,每次操作都会创建新的对象
StringBu'f'fer:对象可操作,不会每次都产生新对象,线程安全
StringBuider:和StringBuffer一样,但是是线程不安全的
33.一个
34.会执行,在try中return后执行
35.final:是一个修饰符,修饰类时累不能被继承,修饰变量时,变量值不能被更改,修饰方法时方法不能被重写
finally:是异常捕获中的一部分,必须和try catch一起使用,常常用来释放资源
finalize:是一个方法,每个对象都会默认存在,在对象被GC收回时调用,一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象
36.运行时异常:runtime exception,程序中可以不用手动捕获,运行时异常一般是程序写法不严谨造成,如:NullPointerException
一般异常:一般异常要求程序中必须用进行手动捕获,如:IO异常和Sql异常
37.Exception:是程序正常运行中,可以预料的意外情况,可以进行被捕获,进行相应处理。
Error:表示程序本身无法克服和恢复的一种严重问题,程序只有退的份了,例如说内存溢出和线程死锁等系统问题。
38.java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或throws声明继续抛给上层调用方法处理。所以普通异常为checked异常,而系统异常可以处理也可以不处理。编译器不强制用try..catch或throws声明,所以系统异常成为uncheckde异常
39.堆和栈都是Java用来在RAM中存放数据的地方。
栈:栈中存放着一个个的栈帧,每调用一个方法的时候就会在栈中开辟出一个栈帧用来存放调用方法的参数和局部变量等,栈不被线程共享(递归调用方法容易出现StackOverflowError(内存溢出))
堆: 堆中存放着所有new出来的对象以及所有的成员变量等,堆能被线程共享(如果java堆空间不足了,程序会抛出OutOfMemoryError异常。)
40.可以强转,超出范围时,如果大于128就等于-128+大于128的部分得到结果:如(byte)129就等于:-128+(129-128)= -127
赢在面试之Java基础篇(5)
41 hashCode() 方法对应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。
42.字节流:按照字节进行读写(InputStream、OutputStream),默认不使用缓冲区
字符流:按照字符进行读写,一般用于读取纯文本文件(Reader、Writer),字符流使用缓冲区。
43.JAVA对象转换为字节序列的过程就称为对象的序列化,只有实现了 serializable和Externalizable接口的类的对象才能被序列化 后者是前者的子类 ,可以使用对象流来进行序列化
44. JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。45.就是栈和堆的区别,看39题
46.GC是垃圾回收器,因为GC可以有效的防止内存泄露,有效的使用可以使用的内存
47.优点是:程序员不需要考虑空对象的处理,有了GC可以有效的防止内存泄露,有效的使用可以使用的内存
48.不可以马上回收,可以调用System.gc()方法通知它,通知后也并不一定会马上回收
49.throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
50.会,比如:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露。