JAVA面试题学习笔记(二)

1.String用于字符串操作,属于不可变类,而StringBuffer也是用于字符串操作,不同之处是StringBuffer属于可变类。
String是不可变类,也就是说,String对象一旦被创建,其值将不能被改变,而StringBuffer是可变类,当对象被创建后,仍然可以对其值进行修改。如果一个字符串经常需要被修改的时候,使用StringBuffer有更高的效率。

2.final、finally和finalize的区别如下:
(1)final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)。final指的是引用的不可变性,即它只能指向初始时指向的那个对象,而不关心指向对象内容的变化。
2)finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带着一个语句块表示这段语句最终一定被执行,经常被用在需要释放资源的情况下。
3)finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。需要注意的是一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

3.ArrayList、Vector和LinkedList区别
ArrayList和Vector都是基于存储元素的Object[]array来实现的,它们会在内存中开辟一块连续的空间来存储,由于数据存储是连续的,因此,它们支持用序号(下标、索引)来访问元素,同时,索引数据的速度比较快。但是在插入元素的时候需要移动容器中的元素,所以,对数据的插入操作执行速度比较慢。ArrayList和Vector都有一个初始化的容量的大小,当里面存储的元素超过这个大小的时候,就需要动态地扩充它们的存储空间。为了提高程序的效率,每次扩充容量的时候,不是简单地扩充一个存储单元,而是一次就会增加多个存储单元。Vector默认扩充为原来的两倍(每次扩充空间的大小是可以设置的),而ArrayList默认扩充为原来的1.5倍(没有提供方法来设置空间扩充的方法)。
ArrayList与Vector最大的区别就是synchronization(同步)的使用,没有一个ArrayList的方法是同步的,而Vector的绝大多数的方法(例如add、insert、remove、set、equals和hashcode等)都是直接或者间接同步的,所以,Vector是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,使其性能上也要略逊于ArrayList。
LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此,随机访问的效率比较低,但是插入元素的时候不需要对数据进行移动,故插入效率较高。同时,LinkedList不是线程安全的。
那么,在实际使用时,如何从这几种容器中选择合适的使用呢?当对数据的主要操作为索引或只在集合的末端增加、删除元素,使用ArrayList或Vector效率比较高。当对数据的操作主要为指定位置的插入或删除操作,使用LinkedList效率比较高。当在多线程中使用容器时(即多个线程会同时访问该容器),选用Vector较为安全。

4.覆盖(Override)是指派生类(子类)方法覆盖基类(父类)方法,覆盖一个方法并对其重写,以起到不同的作用。在使用覆盖时需要注意以下几点:
1)派生类中的覆盖方法必须要和基类中被覆盖方法有相同的函数名和参数。
2)派生类中的覆盖方法的返回值必须和基类中被覆盖方法的返回值相同。
3)基类中被覆盖的方法不能为private,否则,其子类只是定义了另外一个方法,并没有对其覆盖。
4)子类方法不能缩小父类方法的访问权限。
5)子类方法不能抛出比父类方法更多的异常。

5.被public修饰的类或者接口必须与文件名相同。

6.当创建子类对象的时候,必定会首先调用父类的构造方法,然后再调用子类的构造方法。构造方法是不能被继承的。

7.Java语言为解释性语言,运行的过程如下:源代码经过Java编译器编译成字节码(Byte Code),然后由JVM(Java Virtual Machine,Java虚拟机)解释执行。而C/C++语言为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java语言的执行速度比C/C++语言慢,但是Java语言能够跨平台执行,而C/C++语言不能够跨平台执行。

8.计算机的最基本用途之一是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。可以把运算符分成以下几组:算术运算符(+、-、、/、%、++、–等)、关系运算符(==、!=、>、<、>=、<=等)、位运算符(&、|、^、~、<<、>>、>>>等)逻辑运算符(&&、||、!等)、赋值运算符(=、+=、-=、=、/=、(%)=、<<=、>>=、&=、|=等)及其他运算符(条件运算符?:、instanceof运算符等)。

9.接口只能被public和abstract这两个关键字修饰,而不能被private、protected和static修饰。
在Java语言中,有很多数据类型可以进行转换,但是也有部分无法转换,例如int类型与boolean类型之间无法进行转换。

10.JDBC(Java DataBase Connectivity,Java数据库连接)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句、访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC操作数据库的所有类。通过JDBC访问数据库一般有如下几个步骤:
1)加载JDBC驱动器。将数据库的JDBC驱动加载到classpath中,在基于Java EE的Web应用开发过程中,通常要把目标数据库产品的JDBC驱动复制到WEB-INF/lib下。
2)加载JDBC驱动,并将其注册到DriverManager中。一般使用反射Class.forName(String driveName)。
3)建立数据库连接,取得Connection对象。一般通过DriverManager.getConnection(url, username, passwd)方式实现,其中,url表示连接数据库的字符串,username表示连接数据库的用户名,passwd表示连接数据库的密码。
4)建立Statement对象或者PreparedStatement对象。
5)通过Statement或PreparedStatement对象执行SQL语句。
6)访问结果集ResultSet对象。
7)依次将ResultSet、Statement、PreparedStatement和Connection等对象关闭,释放掉所占用的资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值