java基础面试题 https://blog.csdn.net/qq_39031310/article/details/83050263
一、小策略
1、说区别的时候,先单独说出每一个的特性,再列出相同点即可。
2、当遇到自己不太擅长的问题的时候,一定不要慌张,想法设法的往自己熟悉的地方带,比如说问到快速排序算法时,自己不是特别的懂,就可以说自己比较了解简单的二分算法和冒泡排序算法。
二、基础面试题
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
2、Java有没有goto?
java中的保留字,现在没有在java中使用。
3、说说&和&&的区别?
- &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
- &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
- &还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。
4、启动一个线程是用run()还是start()? .
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。jdk1.7版本后switch可以作用再String上面,依旧不能作用在long上面。
6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- 对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。正确为s1=(short)s1+1
- 对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
7、char型变量中能不能存贮一个中文汉字?为什么?
- 可以存储,因为java中使用的编码是Unicode编码,一个char类型占2个字节(16bit),放一个中文汉字是没有问题的。
- Unicode编码:不选择任何特定的编码,直接使用字符在字符集中的编码,这是统一的唯一方法。
8、用最有效率的方法算出2乘以8等於几?
2 << 3
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。
9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
10、重载(Overloading)和重写(Override)的区别
- 重载(Overloading):多个同名函数同时存在,参数类型和参数个数不通,返回值类型可同可不同,统一方式处理不同类型的数据。这也是java特性中多态性的一种体现,一个类中的多态性。
- 重写(Override):子类中重新父类的方法,也叫做方法覆盖,方法名与父类相同,参数返回类型相同,子类的修饰权限不能够低于父类不同类之间多态的体现。
11、"=="和equals的区别
- “==”: 比较变量值是否相等(数值) 相当于比较的是地址
- “equals”: 两个独立对象的内容是否相同 比较的是内容
举个例子
String a = new String(“abc”)
String b = new String(“abc”)
a==b false 不同对象地址不相同
a.equals(b) true 比较的是a、b两个字符串中的内容
12、静态变量和实例变量的区别?
- 静态变量:静态变量也叫做类变量,static修饰,在类中,为类所有,只要程序加载啦字节码文件,不用创建实例对象就会自动的为静态变量分配内存空间。所有对象共有,其中一个对象将其值改变,其他对象得到的就是改变后的结果。
- 实例变量:new了对象之后,才会分配内存空间。当前对象私有,改变其值,不会影响其他对象。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
package com.fsj;
public class Test9 {
public static int staticVar = 0;
public int instanceVar = 0;
public Test9() {
staticVar++;
instanceVar++;
System.out.println("staticVar=" + staticVar);
System.out.println("instanceVar=" + instanceVar);
}
public static void main(String[] args) {
Test9 t1 = new Test9();//staticVar=1 instanceVar=1
Test9 t2 = new Test9();//staticVar=2 instanceVar=1
}
}
13、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为static方法的调用可以直接通过类名.方法名()调用,不用创建对象。而非static方法要与对象关联在一起的,必须要创建对象之后才可以在该对象上进行方法的调用,所以是不可以的。
14、Integer与int的区别?
Integer:默认值为null
int:默认值为0
int是java提供的8种原始数据类型之一。Integer是java为int提供的封装类。
15、请说出作用域public,private,protected,以及不写时的区别?
作用域 | 当前类 | 同一个包 | 子孙类 | 不同包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
16、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
- Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应。
- ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;
- floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;
- round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,Math.round(11.5)=12 , Math.round(-11.5)=-11。
17、构造器Constructor是否可被重写(override)?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
18、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
- 接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽象类中可以有静态的main方法。
- 只要记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法和非abstract方法。
19、abstract class和interface有什么区别?
abstract class:abstract 类不能创建的实例对象。允许有abstract方法和非abstract方法。
interface:抽象类的一种特例,接口中的所有方法都必须是抽象的。
主要区别:
- 抽象类可以有构造方法,接口中不能有构造方法。
- 抽象类中可以有普通成员变量,接口中没有普通成员变量。
- 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
- 抽象类中可以包含静态方法,接口中不能包含静态方法。
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
20、同步和异步
- 同步:所有操作都做完,才返回给用户,例如:银行转账
- 异步:不用等所有操作都做完,就返回结果,达到局部刷新。
21、error和exception有什么区别?
- error:表示不是不可能恢复,但是很困难的一种严重问题,比如说内存溢出。不能够指望程序处理这样的情况。
- exception:表示一种设计或者实现问题,需要捕捉或者需要进行处理的异常,处理的是程序引起的问题,程序必须处理的。
22、多线程有几种实现方法?同步有几种实现方法?
- 多线程有两种实现方法:继承Thread类与实现Runnable接口
- 同步的实现方面有两种:synchronized,wait与notify
- wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
- sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
- notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
- Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
23、启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
24、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
- 其他方法前是否加了synchronized关键字,如果没加,则能。
- 如果这个方法内部调用了wait,则可以进入其他synchronized方法。
- 如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
- 如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
25、ArrayList和Vector的区别?
这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。
接着才说ArrayList与Vector的区别,这主要包括两个方面:.
- 同步性:
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。 - 数据增长:
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。
26、HashMap和Hashtable的区别?
从三方面来说
- 历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
- 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
- 只有HashMap可以让你将空值作为一个表的条目的key或value
27、List 、Map、Set区别?
- List:存储单列数据的集合,数据有序,并且允许重复。
- Map:数据无序,键值集合,键不可以重复,值是可以重复的。
- Set:数据无序,无重复对象。
28、Collection 和 Collections的区别?
- Collection:集合类的上级接口,继承与他的接口主要有Set 和List.
- Collections:针对集合类的一个帮助类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
29、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
- Set里的元素是不能重复的
- 元素重复与否是使用equals()方法进行判断的。
- equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
30、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
对。
如果对象要保存在HashSet或HashMap中,它们的equals相等,那么,它们的hashcode值就必须相等。
如果不是要保存在HashSet或HashMap,则与hashcode没有什么关系了,这时候hashcode不等是可以的,例如arrayList存储的对象就不用实现hashcode,当然,我们没有理由不实现,通常都会去实现的。
31、说出一些常用的类,包,接口,请各举5个
要让人家感觉你对java ee开发很熟,所以,不能仅仅只列core java中的那些东西,要多列你在做s项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。
-
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
java.util.Date,System,Class,List,HashMap -
常用的包:java.lang java.io java.util java.sql javax.servlet,org.apache.strtuts.action,org.hibernate
-
常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession
32、GC是什么? 为什么要有GC?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
33、heap和stack有什么区别?
- heap(堆内存):程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
- stack(栈内存):用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
34、说出Servlet的生命周期,并说出Servlet和CGI的区别?
- 简述:加载和实例化–>初始化–>处理请求–>服务结束
- 生命周期:Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
- 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
35、final, finally, finalize的区别?
- final :用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
- finally:异常处理语句结构的一部分,表示总是执行。
- finalize:Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
36、forward 和redirect的区别?
- forward:服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 一次请求,地址栏中的地址不改变。
- redirect:就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。两次请求,地址栏中的地址改变。
37、什么时候用assert(断言)?
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
38、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有length()这个方法。
39、编程题: 写一个Singleton(单例模式)出来?
- 饱汉模式
public class Singleton {
private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
- 饥汉模式
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance;
}
}
40、Java的接口和C++的虚类的相同和不同处?
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public,一个类可以实现多个接口。
41、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
42、什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
43、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
- Servlet:服务器端应用程序,动态web页面。
- JSP:java servlet page,Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。
- 不同:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
44、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
- 两种形式:dtd schema。
- 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),
- 解析方式:DOM,SAX,STAX等
- DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
- SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问
- STAX:Streaming API for XML (StAX)。
45、应用服务器与WEB SERVER的区别?
- 应用服务器:Weblogic、Tomcat、Jboss;
- WEB SERVER:IIS、 Apache
46、MVC 软件架构思想?
- Model:模型,封装业务,处理逻辑
- View:视图,显示数据
- Controller:协调
47、String,StringBuffer,StringBuilder的区别?
- String:不可修改,适用于少量字符串操作,不需要频繁改动字符串的情况。
- StringBuffer:可变,线程安全,同步,适用于多线程下在字符缓冲区进行大量操作的情况。
- StringBuilder:可变,线程不安全,非同步,适用于单线程下在字符缓冲区进行大量操作的情况。
48、Sql优化?
1、减少查询字段数
2、表关联尽量用主键
3、 查询条件尽量避免模糊查询
4、避免使用排序字段,排序字段尽量使用主键
5、尽量使用限制查询条件
6、查询条件使用有效索引
7、exist关键字代替in
8、distinct关键字慎用
49、String s = “a” + “b” +“c” + "d"创建了几个对象?
一个对象
javac编译可以直接对字符串常量进行直接的加减
package com.fsj;
public class Test9 {
public static void main(String[] args) {
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab"); // false
System.out.println(s3 == "ab"); // true
}
}
50、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
51、我们在web 应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
public String translate(String str){
String tempStr = "";
try{
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}catch (Exception e){
System.err.println(e.getMessage());
}
return tempStr;
}
52、定义类A 和类B 如下:
class A {
int a = 1;
double d = 2.0;
void show() {
System.out.println("Class A: a=" + a + " d=" + d);
}
}
class B extends A {
float a = 3.0f;
String d = "Java program.";
void show() {
super.show();
System.out.println("Class B: a=" + a + " d=" + d);
}
}
(1) 若在应用程序的main 方法中有以下语句:
A a=new A();
a.show();
则输出的结果如何?
(2) 若在应用程序的main 方法中定义类B 的对象b:
A b=new B();
b.show();
则输出的结果如何?
输出结果为:
1)Class A: a=1 d=2.0 ;
2)Class A: a=1 d=2.0
Class B: a=3.0 d=Java program。
53、String s=new String(“xyz”);创建了几个String Object?
两个对象,一个是"xyx",一个是指向"xyx"的引用对象s。
54、指出下面程序的运行结果: 【基础】
class A {
static {
System.out.print("1");
}
public A() {
System.out.print("2");
}
}
class B extends A {
static {
System.out.print("a");
}
public B() {
System.out.print("b");
}
}
public class Hello {
public static void main(String[] ars) {
A ab = new B(); // 执行到此处,结果: 1a2b
ab = new B(); // 执行到此处,结果: 1a2b2b
}
}
输出结果为1a2b2b;
类的static 代码段,可以看作是类首次加载(虚拟机加载)执行的代码,而对于类加载,首先要执行其基类的构造,再执行其本身的构造。执行顺序,基类static代码块—>本身static代码块—>基类构造方法—>本身构造方法
55、字符串操作:如何实现字符串的反转及替换?
可用字符串构造一StringBuffer 对象,然后调用StringBuffer 中的reverse方法即可实现字符串的反转,调用replace 方法即可实现字符串的替换。
56、socket通信(tcp/udp区别及JAVA的实现方式)?
- TCP:面向连接的传输层控制协议,面向字节流,把数据看成是一连串无结构的字节流,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。
- UDP:无连接的数据包服务,面向报文的,无拥塞控制,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。
- java实现方式:大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无关紧要。
57、什么是java序列化,如何实现java序列化?
- 序列化:就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
- 实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
58、i = 5 ,j =7 求 i | j?
i | j 或运算 先转换为二进制再运算
5:0101
7:0111
i | j = 0111 = 7
59、List遍历集合的三种方式?
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
- 超级for循环遍历
for(String value : list){
System.out.println(value);
}
- size()方法遍历
for(int i =0; i<list.size();i++){
System.out.println(list.get(i));
}
- 迭代器遍历
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
60、(1 | 2)<< 4 =?
1 | 2 按位或
0001 0010 0011
<<4 左移运算符,左移四位 相当于乘以2的4次方 (1 | 2) << 4 = 48
61、byte b = (byte)129 b=?
byte取值 -127 ~ 128
java中正数用源码表示,负数用补码表示,第一位为符号位
129
补码 1000 0001 符号位为1 所以为负数 补码减1 得到反码
反码:1000 0000 反码按位取反得到源码
源码:1111 1111
所以 b=-127
62、abstract方法不能够和static连用,为什么?
- static修饰的为静态方法,而abstract修饰的为抽象方法,无方法体的方法,无法调用
- abstract方法需要子类重写,而静态方法不能被重写,二者相互矛盾
63、Integer a= 1 , Integer b = 1 , a==b? Integer c = 1000 ,Integer d = 1000,c==d?
- Integer a = 1 , Integer b = 1 , a==b true
- Integer c = 1000 , Integer d = 1000 , c==d false
这里设计到自动装箱和自动拆箱的知识
- 在自动装箱时对于值从 -128 ~ 127之间的值,在内存中会被重用,Integer b = 1 没有重新生成对象 所以 a == b true
- Integer d = 1000 装箱后的Integer不被重用,每次装箱都会新建一个Integer对象 所以 c == d false
64、8大基本数据类型
- 四整型:byte short int long
- 二浮点型:float double
- 一布尔型:boolean
- 一字符型:char
65、什么是面向对象?
- 对象:一切皆对象,人们所研究的所有事物都是对象。
- 面向对象:不需要知道其中的具体操作。
- 例子:去饭店吃饭的时候,我们面向服务员点菜,不需要知道菜是怎么做的,只需要吃就可以啦,而当买单的时候,服务员面向我们收钱,不需要知道我们如何吃的,只需要知道多少钱就可以啦。
66、Ajax的好处和坏处?
- 好处:
- 页面无刷新,用户体验好
- 响应速度快,异步方式
- 进一步促使页面和数据分离
- 坏处:
- ajax局部刷新,页面后退无用
- 编写时需要考虑到浏览器的兼容性,使用了大量的js和ajax引擎
- 对流媒体和移动设备的支持不太好
- 对搜索引擎的支持比较弱
67、说说你常见的异常?
- 空指针异常 NullPointException
- 类型转换异常 ClassCastException
- 数组下标越界异常 IndexOutOfBoundsException
- 文件未找到异常 FileNotFoundException
- 操作数据库异常 SqlException
- 字符串转换成数字异常 NumberFormatException
- 类不存在异常 ClassNotFoundException
68、HashMap 默认的容量?
- 默认容量:16
- 负载因子:0.75
容量大于 16 * 0.75 自动扩容
69、服务器性能优化?
- 使用内存数据库
- 使用RDD spark的核心
- 增加缓存
- SSD代替机械硬盘
- 优化数据库
- 选选择合适的IO程序
- 多核处理使用
- 分布式开发
70、java的有点和缺点?
- 优点:
- 平台无关性
- 无指针
- 垃圾回收机制
- 类库
- 安全性和健全性好
- 缺点:
- 需要运行环境
- 不适合开发桌面应用程序
- 增加了产品的复杂性
72、java和c++的区别?
- java:
- 无指针,单继承,实现多接口
- 完全面向对象,垃圾回收机制
- 允许预编译,不支持其功能,显示转换
- c++:
- 有指针,多继承。
- 面向对象,由程序释放内存
- 需要预编译,隐含转换
73、敏捷开发?
- 概念:敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。
- 优点:
- 精确,质量,速度
- 丰富的投资回报率
- 高效的自我管理团队
- 敏捷开发宗旨
- 个体与交互比流程与工具更具价值
- 可用的软件比文档更有价值
- 与客户的协作比合作谈判更有价值