面试题-基础类

1、常用的java api包、类、接口?

    包:java.lang.*、java.util.*、java.io.*、java.sql.*、java.net.* 等

    类:String、Integer、Arrays、ArrayList、HashMap、Formatter、Date 等

    接口:List、Map、Set、Collection、Serializable、Iterable 等

2、string类常用的方法?

    equal,split,getBytes,length,replaceAll,toUpperCase,trim,indexOf等

3、API接口开发注意事项?

    使用https协议(数据传输安全),授权(安全性),返回数据类型(json,大多数语言支持)

4、&和&&的区别?

前者是位运算符,后者是逻辑运算符

都作为逻辑运算符时,&是不管前面的条件是否正确,后面的都会执行,&&是如果前面的不正确,后面的就不会执行(效率高点)

5、jdk1.7和1.8的区别?

    相对1.7的增强:

    1)支持整数类型(int、short、long、byte)用二进制表示(以ob开头);

    2)switch语句支持string类型;

    3)try-with-resource语句(保证声明的资源在语句结束后都会被关闭);

    4)Catch多个异常;

    5)数字类型的下划线表示(如1_0_3_0063);

    6)泛型实例的创建可以通过类型推断来简化(new后面的内容<>里面可以省略);

    7)并发工具增强(fork-join框架最大的增强)

    1.8的新特性:

    1)接口的默认和静态方法(Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法);

    2)Lambda表达式;

    3)方法与构造函数引用
    4)函数式接口:
    5)Annotation 注解:支持多重注解:
    6)新的日期时间 API(提供了新的java.time包,可以用来替代java.util.Date和java.util.Calendar)
    7)Base64编码(在Java 8中,Base64编码成为了Java类库的标准)
    8)JavaScript引擎Nashorn(Nashorn允许在JVM上开发运行JavaScript应用,允许Java与JavaScript相互调用)
    9)Stream的使用(Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce)
    10)Optional(Java 8引入Optional类来防止空指针异常,Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。)
    11)扩展注解的支持(Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。)
    12)并行(parallel)数组(支持对数组进行并行处理,主要是parallelSort()方法,它可以在多核机器上极大提高数组排序的速度)
    13)编译器优化(Java 8将方法的参数名加入了字节码中,这样在运行时通过反射就能获取到参数名,只需要在编译时使用-parameters参数)

6、java类的初始化顺序??

指出下面程序的运行结果
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[] args) {
        A ab = new B();
        ab = new B();
    }
}

=====开始执行main方法=====
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
=====结束执行main方法===== 

    (优先级从高到低。)其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

7、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 
     1)重写和重载是Java多态性的不同表现。

     2)重写Override是父类与子类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。

     3)如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。

    4)如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。   

     5)Overload的方法是可以改变返回值的类型,即参数不同返回值类型可以不同。

8、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 
    1)Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。

    2)equals()是判读两个Set是否相等。 
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

9、error和exception有什么区别? 
    error 表示系统级的错误和程序不必处理的异常,表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

10、给我一个你最常见到的runtime exception?
- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)

11、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?
    不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

12、Java 中应该使用什么数据类型来代表价格?
    如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。

13、哪个类包含 clone 方法?是 Cloneable 还是 Object?
    java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义, 方法clone进行对象拷贝。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其他本地语言实现的。

14、Java 中 ++ 操作符是线程安全的吗?
    不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。

15、a = a + b 与 a += b 的区别
    += 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。

16、我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?
    不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

17、3*0.1 == 0.3 将会返回什么?true 还是 false?
    false,因为有些浮点数不能完全精确的表示出来。

18、int 和 Integer 哪个会占用更多的内存?
    Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少

19、为什么 Java 中的 String 是不可变的(Immutable)?
    Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。

20、32 位和 64 位的 JVM,int 类型变量的长度是多数?
    32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。

21、.JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?
    当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从 32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU 缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM 主要动机在于可以指定最大堆大小,通过压缩 OOP 可以节省一定的内存。通过 -XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。

22、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
    理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5 GB,Solaris 大约 3GB。64 位 JVM允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。

23、JRE、JDK、JVM 及 JIT 之间有什么不同?
    JRE 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

24、解释 Java 堆空间及 GC?
    当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

25、怎么获取 Java 程序使用的内存?堆使用的百分比?
    可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。
    Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory() 方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

26、Java 中堆和栈有什么区别?
    JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

27、Java 中的编译期常量是什么?使用它又什么风险?
    公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。

28、用哪两种方式来实现集合的排序?
可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。

29、???
 

30、ArrayList 和 HashMap 的默认大小是多数?
    在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)

31、String 是最基本的数据类型吗?
    不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)

32、float f=3.4;是否正确?

    不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F;

    单精度浮点数在机内占4个字节,用32位二进制描述。双精度浮点数在机内占8个字节,用64位二进制描述。double 和 float 的区别是double精度高,但double消耗内存是float的两倍,double的运算速度比float慢得多

33、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法?
    通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;

    通过new关键字和构造器创建的对象放在堆空间;

    程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。

    栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

34、用最有效率的方法计算2乘以8?
    2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

35、数组有没有length()方法?String有没有length()方法?
    数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。

36、构造器(constructor)是否可被重写(override)?
    构造器不能被继承,因此不能被重写,但可以被重载。

37、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。

38、是否可以继承String类?
    String 类是final类,不可以被继承。

39、抽象的(abstract)方法是否可同时是静态的(static)?是否可同时是本地方法(native)?是否可同时被synchronized修饰?
    都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

40、如何实现对象克隆?
    有两种方式:
1).实现Cloneable接口并重写Object类中的clone()方法;
2).实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆

41、String s = new String("xyz");创建了几个字符串对象?
    两个对象,一个是静态区的"xyz",一个是用new创建在堆上的对象

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

    可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致

43、???

44、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
    会执行,在方法返回调用者前执行。
    注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。

45、Collection和Collections的区别?
    Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

46、描述一下JVM加载class文件的原理机制?
    1.装载:查找和导入class文件;
    2.连接:
        (1)检查:检查载入的class文件数据的正确性;
        (2)准备:为类的静态变量分配存储空间;
        (3)解析:将符号引用转换成直接引用(这一步是可选的)
    3.初始化:初始化静态变量,静态代码块。

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java类的加载采用了双亲委托模型机制。
委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

47、???

48、阐述JDBC操作数据库的步骤?
 

下面的代码以连接本机的Oracle数据库为例,演示JDBC操作数据库的步骤。
    加载驱动。
 Class.forName("oracle.jdbc.driver.OracleDriver");
    创建连接。
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
    创建语句。
 PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
    ps.setInt(1, 1000);
    ps.setInt(2, 3000);
    执行语句。
    ResultSet rs = ps.executeQuery();
    处理结果。
 while(rs.next()) {
        System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
    }
    关闭资源。
  finally {
        if(con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
提示:关闭外部资源的顺序应该和打开的顺序相反,也就是说先关闭ResultSet、再关闭Statement、在关闭Connection。

49、Statement和PreparedStatement有什么区别?哪个性能更好?
    ①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);
    ②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;
    ③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

50、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
    要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);
    要提升更新数据的性能可以使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。 

51、在进行数据库编程时,连接池有什么作用?
    由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的),为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。
    池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此相同。基于Java的开源数据库连接池主要有:C3P0、Proxool、DBCP、BoneCP、Druid等。

52、事务的ACID是指什么? 
    - 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败; 
    - 一致性(Consistent):事务结束后系统状态是一致的; 
    - 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态; 
    - 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
    补充:关于事务,首先需要知道的是,只有存在并发数据访问时才需要事务。当多个事务访问同一数据时,可能会存在5类问题,包括3类数据读取问题(脏读、不可重复读和幻读)和2类数据更新问题(第1类丢失更新和第2类丢失更新)。

53、JDBC中如何进行事务处理?
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;
当事务完成后用commit()显式提交事务;
如果在事务处理过程中发生异常则通过rollback()进行事务回滚。
除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到指定的保存点。

54、JDBC能否处理Blob和Clob?
    Blob是指二进制大对象(Binary Large Object),而Clob是指大字符对象(Character Large Objec),因此其中Blob是为存储大的二进制数据而设计的,而Clob是为存储大的文本数据而设计的。JDBC的PreparedStatement和ResultSet都提供了相应的方法来支持Blob和Clob操作。 

55、简述正则表达式及其用途。
    在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

56、获得一个类的类对象有哪些方式?
- 方法1:类型.class,例如:String.class
- 方法2:对象.getClass(),例如:"hello".getClass()
- 方法3:Class.forName(),例如:Class.forName("java.lang.String")

57、如何通过反射创建对象?
- 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");

58、简述一下你了解的设计模式。
    所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
面试被问到关于设计模式的知识时,可以拣最常用的作答,例如:
- 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
- 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。
- 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作。
- 模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑。
    除此之外,还可以讲讲门面模式、桥梁模式、单例模式、装潢模式(Collections工具类和I/O系统中都使用装潢模式)等,反正基本原则就是拣自己最熟悉的、用得最多的作答,以免言多必失。

59、???

60、???

61、???

62、java开发中常用的数据结构?

    1).ArrayList: 元素单个,效率高,多用于查询 
    2).Vector: 元素单个,线程安全,多用于查询 
    3).LinkedList:元素单个,多用于插入和删除 
    4).HashMap: 元素成对,元素可为空 
    5).HashTable: 元素成对,线程安全,元素不可为空  

猜你喜欢

转载自blog.csdn.net/m0_37524661/article/details/81662071