logo资料库

2019最新Java程序员初中级面试宝典.docx

第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
资料共34页,剩余部分请下载后查看
JSP九大内置对象:
三大指令:
七大动作:
Java 初中级程序员面试题宝典 加群:“708701457”即可获取一套完整的面试、学习资料,包括但 不限于:分布式架构、高可扩展、高性能、高并发、Jvm 性能调优、 Spring,MyBatis,Nginx 源码分析,Redis,ActiveMQ、、Mycat、 Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、 Nginx 等多个知识点高级进阶干货 Java 基础部分 &与&&区别? &和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但 是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继 续执行,直到整个条件语句执行完为止。 使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对 象不能变? 使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变 量所指向的对象中的内容 还是可以改变的。 静态变量和实例变量的区别? 在语法定义上的区别: 静态变量前要加 static 关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了 实例对象,其中的实例变 量才会被分配空间,才能使用这个实例变 量。 静态变量不属于某个实例对象,而是属于类, 所以也称为类变量, 只要程序加载了类的字节码,不用创建任何实例对象,静态变量就 会被分配空间,静态变量就可以被使用了。 总之,实例变量必须创建对象后才可以通过这个对象 来使用,静态 变量则可以直接使用类名来引用。 静态变量使用时,通过类名.名称,实例变量必须要初始化后才能使用。 实例变量是实例化后才会分配空间,而静态变量当类加载时会分配空 间。 是否可以从一个 static 方法内部发出对非 static 方法的调用? 不可以。因为非 static 方法是要与对象关联在一起的,必须创建 一个对象后,才可以在该对 象上进行方法调用,而 static 方法调 用时不需要创建对象,可以直接调用。也就是说,当一 个 static 方法被调用时,可能还没有创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的调用,那个非 static 方法是关联
到哪个对象上的呢?这个逻辑无法成立,所以, 一个 static 方法 内部发出对非 static 方法的调用。 非 static 方法可以访问 static 方法. static 方法不能访问非 static 方法 "=="和 equals 方法究竟有什么区别? ==如果判断值类型的话,判断内容是否相同。如果判断引用类型 则是判断内存地址是否相同 Equals 判断值内容是否相等 Integer 与 int 的区别 Integer 是引用类型,默认值是 null。而 int 是是值类型默认值是 0 请说出作用域 public, private, protected,以及不写时的 区别 这四个作用域的可见范围如下表所示。 说明:如果在修饰的元素上面没有写任何访问修饰符,则表 示 friendly。 作用域 当前类 同一包( package) 子孙类 其他包( package) public √ √ √ √ protected √ × friendly × private × √ √ √ √ √ × × × 重载与重写区别? 重载是同一个类中,方法名称相同, 但是参数或个数不同。与返回 值没有关系。 重写是在多个类中, 产生继承关系。父类与子类的方法方法必须相 同。 接口与抽象类的区别? 区别:定义接口的关键字是:interface 而定义抽象类的关键字是: abstract。 接口中成员不能有私有, 抽象类可以。
接口中定义的成员, 是 finl public static 类型, 抽象类没有。 接口中的不能有普通方法, 抽象类中可以。 相同: 两个都不 new 但是 接口与抽象类是面向对象必备知识,设计模式、重构代码有必 然作用 final, finally, finalize 的区别。 final 用于声明属性,方法和类,分别表示属性不可变,方法不可 覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成 final 类型,例如, 一段代码…… finally 是异常处理语句结构的一部分,表示总是执行。 finalize 是 Object 类的一个方法,在垃圾收集器执行的时候 会调用被回收对象的此方法,可 以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件 等。 JVM 不保证此方法总被 调用 String、StringBuffer 与 StringBuilder 的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 所有的类都继承于 object 类,你用过的 object 类的直接子类有哪 些,object 类常用的方法 有哪些 1.clone 方法 保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以 调用该方法,否则抛出 CloneNotSupportedException 异常。 2.getClass 方法 final 方法,获得运行时类型。 3.toString 方法 该方法用得比较多,一般子类都有覆盖。 4.finalize 方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少 使用。 5.equals 方法 该方法是非常重要的一个方法。一般 equals 和==是不一样的,但是 在 Object 中两者是一样的。子类一般都要重写这个方法。
6.数组有没有 length()这个方法? String 有没有 length()这个方 法? 答:数组没有 length()这个方法,有 length 的属性。String 有有 length()这个方法。 7.hashCode 方法 该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法。这个方法在一些具有哈希功能的 Collection 中用到。 一般必须满足 obj1.equals(obj2)==true。可以推出 obj1.hash- Code()==obj2.hashCode(),但是 hashCode 相等不一定就满足 equals。不过为了提高效率,应该尽量使上面两个条件接近等价。 7.wait 方法 wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象 的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获 得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在 规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 (1)其他线程调用了该对象的 notify 方法。 (2)其他线程调用了该对象的 notifyAll 方法。 (3)其他线程调用了 interrupt 中断该线程。 (4)时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。 8.notify 方法 该方法唤醒在该对象上等待的某个线程。 9.notifyAll 方法 该方法唤醒在该对象上等待的所有线程 反射的优缺点? 反射:就是正在运行动态读取这个类的完整信息。 优点:java 的反射机制就是增加程序的灵活性、 缺点:缺点:(1)性能问题:使用反射基本上是一种解释操作, 用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用 在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。 (2)使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到 程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。 反射代码比相应的直接代码更复杂。 那些地方用到了反射?
例如: jdbc、Java 常用框架、jdk 的动态代理、android 的加载布 局文件 java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象 类以供继承, 为每种类型的流提供了一些抽象类以供继承, 请说出他们分别是哪些类? 字节流,字符流。字节流继承 于 InputStream OutputStream,字符流继承于 InputStreamReaderOutputStreamWriter。在 java.io 包中还有 许多其他的流,主要是为了提 高性能和使用方便。 多线程部分 什么是多线程? 在一个应用程序中,同时,有多个不同的执行路径。 说一下多线程的好处? 提供程序效率。 线程和进程有什么区别? 线程是进程的一条执行路径,而进程是线程的集合。 什么是线程同步、异步? 线程同步表示,当前线程执行完后下一个线程接着执行。 线程异步表示, 径。例如 javaweb ajax android handler 线程之间如何同步 在一个应用程序中,同时,有多个不同的执行路 线程之间同步使用 synchronized、wait 与 notify 什么是线程不安全?如何解决?(重点) 就是在多个线程共享同一个数据会受到其他线程的干扰。如何解 决:使用线程同步技术, 用上锁(synchronized)。 让一个线程执行 完了,在让另一个线程执行。 如何创建一个线程?有几种方法? 继承 thread 类, 重写 run 方法、实现 Runnalbe 接口,重新 run 方法 , 启动一个线程用 start(); 是使用 Runnalbe 接口好?还是继承 Thread 类好? 是实现 Runnalbe 接口好,因为实现的接口还可以继续继承。如 果继承了 Thread 类不能在继承。 sleep()和 wait()有什么区别? a、sleep 是让当前线程指定休眠时间,然后继续工作 不释 放锁
b、让当前线程 wait 则是等待,直到有线程通知 notify() 唤醒他才会重新工作。释放锁 集合相关面试题 说一下数据结构中的什么是数组?什么是链表? 所谓数组,是相同数据类型的元素按一定顺序排列的集合 数组:存储区间是连续的,占用内存严重,故空间复杂的很大。但 数组的二分查找时间复杂度小,为 O(1);数组的特点是:寻址容 易,插入和删除困难; 所谓链表,链表是一种物理存储单元上非连续、非顺序的存储结构, 数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由 一系列结点(链表中每一个元素称为结点)组成,结点可以在运行 时动态生成。每个结点包括两个部分:一个是存储数据元素的数据 域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结 构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达 到 O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节
点或者访问特定编号的节点则需要 O(n)的时间,而线性表和顺序表 相应的时间复杂度分别是 O(logn)和 O(1)。 链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小, 但时间复杂度很大,达 O(N)。链表的特点是:寻址困难,插入和 删除容易。 说一下什么是哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也 容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈 希表((Hash table)既满足了数据的查找方便,同时不占用太多 的内容空间,使用也十分方便。 哈希表有多种不同的实现方法,我接下来解释的是最常用的一 种方法—— 拉链法,我们可以理解为“链表的数组” ,如图:
说一下 ArrayList 底层实现方式? ①ArrayList 通过数组实现,一旦我们实例化 ArrayList 无参数构 造函数默认为数组初始化长度为 10 ②add 方法底层实现如果增加的元素个数超过了 10 个,那么 ArrayList 底层会新生成一个数组,长度为原数组的 1.5 倍+1,然 后将原数组的内容复制到新数组当中,并且后续增加的内容都会放 到新数组当中。当新数组无法容纳增加的元素时,重复该过程。是 一旦数组超出长度,就开始扩容数组。扩容数组调用的方法 Arrays.copyOf(objArr, objArr.length + 1); 说一下 LinkedList 底层实现方式? LinkedList 底层的数据结构是基于双向循环链表的,且头结点中不 存放数据,如下:
分享到:
收藏