一些经典的java面试题(转载)


1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。

2、说说&和&&的区别。

&和&&都可以用作逻辑与的运算符,表示逻辑与(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。

3、在 JAVA 中如何跳出当前的多重嵌套循环?

在 Java 中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,

for(inti=0;i<10;i++)      {

for(intj=0;j<10;j++)                        {

System.out.println(“i=” + i + “,j=” + j); if(j == 5) break ok;

}

}

另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][] ={{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(inti=0;i<arr.length&& !found;i++)     {

for(int j=0;j<arr[i].length;j++){System.out.println(“i=” + i + “,j=” + j); if(arr[i][j] ==5) {

found = true; break;

}

}

}

4、IO流的分类

根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:

(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。

结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。


 

 

5、switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String

 

上?

在 switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是 int 基本类型或 Integer 包装类型,由于,byte,short,char 都可以隐含转换为 int,按位与操作,所以,这些类型以及这些类型的包装类型也是可以的。显然,long 和 String 类型都不符合 switch 的语法规定,并且不能被隐式转换成 int 类型,所以,它们不能作用于swtich 语句中。

 

6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

 

对于 short s1= 1; s1 = s1 + 1;由于 s1+1运算时会自动提升表达式的类型,所以结果是 int型,再赋值给 short 类型 s1时,编译器将报告需要强制转换类型的错误。

 

对于 shorts1 = 1; s1 += 1; 由于 +=是 java 语言规定的运算符,java 编译器会对它进行特殊处理,因此可以正确编译。

 

7、char 型变量中能不能存贮一个中文汉字?为什么?

 

char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字符集中包含了汉字,所以,char 型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那么,这个 char 型变量中就不能存储这个特殊汉字。补充说明:unicode 编码占用两个字节,所以,char 类型的变量也是占用两个字节。

 

8、用最有效率的方法算出 2 乘以 8 等于几?

 

2 << 3,因为将一个数左移 n 位,就相当于乘以了2的 n 次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu 直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

 

9、使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

 

使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

 

final StringBuffer a=newStringBuffer("immutable");

 

执行如下语句将报告编译期错误:

 

a=new StringBuffer("");

 

但是,执行如下语句则可以通过编译:

 

a.append(" broken!");

 

10、"=="和 equals 方法究竟有什么区别?

“==”是看两个对象是否是同一个对象,也就是两个对象引用是否指向同一个对象(Java分配的内存地址一样)当然如果用于int,long,double就不是看两个值是否相等了。 
equals()是比较两个对象的内容是否相等,一般如果用户自己不定义针对自己的类的equals()方法,那么就会使用Object的活着你的类的父类的这个方法。如果你的类里没有对象引用的域,就不必要覆盖equals()(注意String域也是对象)String有自己的equals()方法(它已经覆盖了Object的该方法了。 
如果你的类中的域有对象引用,那么你需要重写equals() 
因为Object的equals()的工作实质是对你的所有的域进行“==”比较历遍,所以如果你的域有对象引用,“==”比较就又变成了对域的对象引用是否指向同一个对象了
 

11、静态变量和实例变量的区别?

 

在语法定义上的区别:静态变量前要加 static 关键字,而实例变量前则不加。

 

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

 

12、是否可以从一个 static 方法内部发出对非 static 方法的调用?

 

不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static 方法调用时不需要创建对象,可以直接调用。也就是说,当一个static 方法被调用时,可能还没有创建任何实例对象,如果从一个static 方法中发出对非 static 方法的调用,那个非 static 方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个 static 方法内部发出对非 static 方法的调用。

 

13、Integer 与 int 的区别

 

int 是 java 提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer 是 java 为 int 提供的封装类。int 的默认值为0,而Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为0的区别,int 则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在 JSP 开发中,Integer 的默认为 null,所以用 el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为0,所以用 el 表达式在文本框中显示时,结果为0,所以,int 不适合作为 web 层的表单数据的类型。

 

 

 

14、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。

 

15、请说出作用域 public,private,protected,以及不写时的区别

 

这四个作用域的可见范围如下表所示。

 

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly。

 

作用域

当前类

同一包(package)

子孙类

其他包(package)

 

 

 

 

 

public

 

 

 

 

 

protected

×

 

 

 

 

 

friendly

×

×

 

 

 

 

 

private

×

×

×

 

 

 

 

 

 

16、Overload 和 Override 的区别。Overloaded 的方法是否可以改变返回值

 

的类型?

 

Overload 是重载的意思,Override 是覆盖的意思,也就是重写。

 

重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

 

重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

 

override 可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:

 

1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;

 

2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;

 

3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;

 

4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

 

overload 对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM 就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int,float),

但是不能为 fun(int,int));

 

2、不能通过访问权限、返回类型、抛出的异常进行重载;

 

3、方法的异常类型和数目不会对重载造成影响;

 

4、对于继承来说,如果某一方法在父类中是访问权限是 priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

 

17、构造器 Constructor 是否可被 override?

 

构造器 Constructor 不能被继承,因此不能重写 Override,但可以被重载 Overload。

 

18、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可

 

继承具体类(concrete class)?抽象类中是否可以有静态的 main 方法?

 

接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。抽象类中可以有静态的main 方法。

 

只有记住抽象类与普通类的唯一区别:就是不能创建实例对象和允许有abstract 方法。

 

19、写 clone()方法时,通常都有一行代码,是什么?

 

clone 有缺省行为,

 

super.clone();

 

因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

 

20、java 中实现多态的机制是什么?

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

 

21、abstract class 和 interface 有什么区别?

含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract 方法的类必须定义为 abstract class,abstractclass 类中的方法不必是抽象的。abstractclass类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。

两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

 

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

 

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

 

4. 抽象类中的抽象方法的访问类型可以是 public,protected和(默认类型),但接口中的抽象方法只能是 public 类型的,并且默认即为 publicabstract 类型。

 

5.抽象类中可以包含静态方法,接口中不能包含静态方法

 

6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static final 类型,并且默认即为public static final 类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

 

两者在应用上的区别:

 

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,

 

 

 

22、String 是最基本的数据类型吗?

 

基本数据类型包括 byte、int、char、long、float、double、boolean 和 short。

 

java.lang.String 类是 final 类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer 类

 

23、String s = "Hello";s = s + " world!";这两行代码执行后,原始的 String

 

对象中的内容到底变了没有?

没有。因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 "Hello",然后我们对 s 进行了+操作,那么s 所指向的那个对象是否发生了改变呢?答案是没有。这时,s 不指向原来那个对象了,而指向了另一个 String 对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指向它了。

 

 

String 对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String 对象来表示。这时,应该考虑使用 StringBuffer 类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new 一个 String。

24、是否可以继承 String 类?

 

String 类是 final 类故不可以继承。

 

25、什么是Java集合API

Java集合框架API是用来表示和操作集合的统一框架,它包含接口、实现类、以及帮助程序员完成一些编程的算法。简言之,API在上层完成以下几件事:

1.编程更加省力,提高城程序速度和代码质量

2.非关联的API提高互操作性

3.节省学习使用新API成本

4.节省设计新API的时间

5.鼓励、促进软件重用

具体来说,有6个集合接口,最基本的是Collection接口,由三个接口Set、List、SortedSet继承,另外两个接口是Map、SortedMap,这两个接口不继承Collection,表示映射而不是真正的集合

 

26、什么是Iterator,Iterator与ListIterator有什么区别?

 

一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本身。

Iterator:只能正向遍历集合,适用于获取移除元素。

ListIerator:继承Iterator,可以双向列表的遍历,同样支持元素的修改。

 

27、什么是HaspMap和Map?怎样使Hashmap同步?

Map是接口,Java 集合框架中一部分,用于存储键值对,HashMap是用哈希算法实现Map的类。

HashMap可以通过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。

28、为什么Vector类认为是废弃的或者是非官方地不推荐使用?或者说为什么我们应该一直使用ArrayList而不是Vector

你应该使用ArrayList而不是Vector是因为默认情况下你是非同步访问的,Vector同步了每个方法,你几乎从不要那样做,通常有想要同步的是整个操作序列。同步单个的操作也不安全(如果你迭代一个Vector,你还是要加锁,以避免其它线程在同一时刻改变集合)。而且效率更慢。当然同样有锁的开销即使你不需要,这是个很糟糕的方法在默认情况下同步访问。你可以一直使用Collections.sychronizedList来装饰一个集合。

事实上Vector结合了“可变数组”的集合和同步每个操作的实现。这是另外一个设计上的缺陷。Vector还有些遗留的方法在枚举和元素获取的方法,这些方法不同于List接口,如果这些方法在代码中程序员更趋向于想用它。尽管枚举速度更快,但是他们不能检查如果集合在迭代的时候修改了,这样将导致问题。尽管以上诸多原因,oracle也从没宣称过要废弃Vector.

 

29、Java的23种设计模式?

 

Factory(工厂模式),     Builder(建造模式),      Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式),   Facade(门面模式),
Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式),
Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式),
Command(命令模式),      Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式),
Observer(观察者模式),   State(状态模式),        Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

 

30、GC是什么? 为什么要有GC

 

GC是垃圾收集的意思(Gabage Collection)。内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而自动回收对象所占的内存。

 

31、BS与CS的联系与区别。

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如

Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQLServer等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

 

32、描述一下JVM加载class文件的原理机制?

 

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量,初始化Java代码和静态Java代码块

33、ArrayList和Vector的区别?HashMap和Hashtable的区别?

 

ArrayList与Vector主要从二方面来说:

1.同步性:Vector是线程安全的,也就是说是同步的;而ArrayList是线程序不安全的,不是同步的。

2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半。

HashMap与HashTable主要从三方面来说:
    1.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
    2.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
    3.值:只有HashMap可以让你将空值作为一个表的条目的key或value。

34、介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)?

 

Collection FrameWork如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
Map提供key到value的映射

 

35、String与StringBuffer的区别?

 

String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer。StringBuffer转换成String使用StringBuffer的toString()方法。

 

36、谈谈final,finally,finalize的区别?

 

final修饰符:如果一个类被声明为final,意味着它不能再派生出新的子类。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写。

finally:异常处理时提供 finally 块来执行清理工作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finalize方法:Java 虚拟机允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时调用。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。不能确定java虚拟机何时调用该方法

 

37、int 和 Integer 有什么区别?

Java 提供两种不同的类型:原始类型(或内置类型)和封装类。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。

原始类型/封装类:boolean/Boolean,char/Character,byte/Byte,short/Short,int/Integer,long/Long,float/Float,double/Double。

newInteger(1);

i.intValue();

拆箱/装箱

 

38、排序都有哪几种方法?

 

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)。

 

39、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

Java通过面向对象的方法进行异常处理。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。

try语句用来执行一段已检查异常程序。try的后面应包含一个catch子句来指定你想要捕捉的"异常"类型。

throw语句用来明确地抛出一个"异常"。

throws用来标明一个成员函数可能抛出的各种"异常"。

finally为确保一段代码不管发生什么"异常"都被执行一段代码。


 

40、什么是java序列化,如何实现java序列化?

 

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化的实现:将需要被序列化的类实现Serializable接口(标记接口),该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

 

41、说出一些常用的类,包,接口,请各举5个?

常用的类:

StringBuffer,String,Integer,HashMap,ArrayList,BufferedReader,BufferedWriter,FileReader,FileWirter

常用的包:

java.lang,java.io,java.util,java.sql,javax.servlet,javax.servlet.http

常用的接口:

Collection, List, Map,Set,Iterator,Comparable

 

42、List的子类特点?

ArrayList :

底层数据结构是数组,查询快,增删慢,线程不安全,效率高

Vector:

底层数据结构是数组,查询快,增删慢,线程安全,效率低

LinkedList:

底层数据结构是链表,查询慢,增删快,线程不安全,效率高

 

43、Jdo 是什么?

JDO 是 Java 对象持久化的新的规范,为java data object 的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO 提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API 的使用)。这些繁琐的例行工作已经转移到JDO 产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO 很灵活,因为它可以在任何数据底层上运行。JDBC 只是面向关系数据库(RDBMS) JDO 更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML 以及对象数据库(ODBMS)等等,使得应用可移植性更强。

44、多线程:

  多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1]  在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

45、多线程编程的好处是什么?

在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heapmemory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。

46、面向对象设计原则:

 面向对象七大设计原则

 1. 开闭原则 2.里氏替换原则 3.单一职责原则 4. 接口隔离原则 5.依赖倒置原则 6.迪米特原则 7.组合/聚合复用原则

47、简述分布式:

什么是分布式计算?所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。分布式网络存储技术是将数据分散的存储于多台独立的机器设备上。分布式网络存储系统采用 可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。

48、并发:

操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。在关系数据库中,允许多个用户同时访问和更改共享数据的进程。SQL Server 使用锁定以允许多个用户同时访问和更改共享数据而彼此之间不发生冲突。

49、反射技术:

其实就是动态加载 个指定的类,并获取该类中的所有的内容。 且将字节码 件封装成对象,并将字节码 件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对 个类进 解剖。

反射的好处:增强了程序的扩展性。

反射的基本步骤:

1、获得Class 对象,就是获取到指定的名称的字节码 件对象。

2、实例化对象,获得类的属性、 法或构造函数。

3、访问属性、调  法、调 构造函数创建对象。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值