Java基础篇面试题
1.列举出JAVA中6个比较常用的包
java.lang;java.util;java.io;java.sql;java.awt;java.net;javax.swing
2.JDK中哪些类是不能继承的?
不能继承的是类是那些用final关键字修饰的类。一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的。
3.String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
所以String不属于基本数据类型范畴内,但String属于最常见一种引用类型。
4.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1=1;s1=s1+1; 由于s1+1运算是会自动提升表达式的类 所以结果为int类型 再赋值给s1 导致结果被转换 被强制转换
short s1 = 1; s1 += 1 由于 += 是java语言规定的运算符,Java编译器会对它进行特殊处理,因此可以正确编译。
5.Java 对象初始化顺序?
一种是本类的初始化,一种是含有父类的初始化顺序。
本类的初始化顺序是:静态变量、静态初始化块、变量、初始化块、构造函数
继承类的初始化顺序是:父类静态变量、父类静态初始化块、子类静态变量、子类静态初始块、父类变量、父类初始化块、父类构造函数、子类变量、子类初始化块、子类构造函数。
public void persion(){ public void user extend persion(){
private int num; private int age;
private static String name; //静态变量 private static String address;
private persion(){} //无参构造 private user(){};
private persion(int num){this.num=num} //有参构造 private User(int age){this.age=age};
public static void test(){} //静态 public static void test(){}
}
6.写几个线程安全类,不安全的,支持排序的类名?
线程安全类:Vector 、Hashtable、Stack。
线程不安全: ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap等。
支持排序的类名:HashSet、LinkedHashSet、TreeSet等(Set接口下的实现都支持排序)
7.哪几个方法可以实现一个线程?
一是继承Thread ,重写 Thread 类的方法 run方法;另种是实现 runnable 接口并实现 run方法。
8.STOP()和SUSPEND()不推荐使用的原因?
方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。
用Thread.stop()方法来终止线程将会释放该线程对象已经锁定的所有监视器。如果以前受这些监视器保护的任何对象都处于不连贯状态,那么损坏的对象对其他线程可见,这有可能导致不安全的操作。 由于上述原因,因此不应该使用stop()方法,而应该在自己的Thread类中置入一个标志,用于控制目标线程是活动还是停止。如果该标志指示它要停止运行,可使其结束run()方法。如果目标线程等待很长时间,则应使用interrupt()方法来中断该等待。
suspend()方法 该方法已经遭到反对,因为它具有固有的死锁倾向。调用suspend()方法的时候,目标线程会停下来。
如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前,其他线程都不能访问该资源。除非被挂起的线程恢复运行。对任何其他线程来说,如果想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。由于上述原因,因此不应该使用suspend()方法,而应在自己的thread类中置入一个标志,用于控制线程是活动还是挂起。如果标志指出线程应该挂起,那么用wait()方法命令其进入等待状态。如果标志指出线程应当恢复,那么用notify()方法重新启动线程。
9."=="和equals方法有什么区别?
==操作符比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】,也就是用于比较变量所对应的堆内存中所存储的数值是否相同。
equal用于比较两个对象的值是否相同【不是比地址】
10.静态变量和实例变量的区别?
静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。
实例变量:就是相当于该类的属性,需要先初始化该类,就是new 该类后,才可以调用。但是该类未被再次使用,被垃圾回收器回收后,该实例也将不存在了,就是不在内存中了。
区别如下:
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关
3.内存分配方式不同。
4.生命周期不同。
11.构造器的名能不能和类的名字相同?
构造器的名称必须与类名相同。
12.在一个主方法类可不可以调用一个静态的方法?
可以
13.GC是什么,为什么要使用它?
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域,从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
14.说一下垃圾回收的原理,可以直接从内存中回收吗?
ava语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收,因为Java语言规范并不保证GC一定会执行。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收
14.Java的异常有哪几种,有什么区别?
两大类,一般异常和运行时异常。一般异常,这些异常是在定义方法时声明抛出的,这些异常必需用try catch抛出,或throws处理,如果不处理,程序将编译失败。比如:IOException、FileNotFoundException、SQLException等。
运行时异常是程序运可能报出的异常。可以用try catch抓取,也可以不做任何处理。例如:NullPointerException 异常就是一种比较常见的运行时异常。
15.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
可以是int 基本类型或Integer 包装类型,由于,byte,short,char 都可以隐含转换为int,所以这些类型以及这些类型的包装类型也是可以的。显然long 和String 类型都不符合switch 的语法规定,并且不能被隐式转换成int 类型,所以它们不能作用于swtich 语句中。switch中可以是字符串类型,String(JDK1.7之后才可以作用在string上),switch中可以是枚举类型(JDK1.5之后)。
16.Integer与int的区别?
int是java提供的8种原始数据类型之一,另外Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。
17.Java Reflection是什么
JAVA反射,Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性
18.写几个java.lang.Object类中的方法名称。
主要有equals()、toString()、getClass()、hashCode()、clone()、 notify()、wait()、notify()方法。
19.&和&&的区别?
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位。
20.数组有没有length()这个方法,String有没有length()这个方法。
数组有.length
字符串 有.length()方法
21.String s=new String(“xyz”)创建了几个对象
创建了2个对象 对象1 s=null 对象2 =“xyz” 的对象
22.能不能自己写个类,也叫java.lang.String?
可以
23。你对面向对象思想的理解?
面向对象编程简称oop技术 是开发计算机运用程序的一种新方法新思维 他有3大特性 继承 封装多态特征 使面向对象编程上能够设计出高内聚低耦合的系统结构 使系统更灵活 更容易扩展成本低
24.最常见的runtime exception运行时异常
ClassCastException(类型转换异常) NumberFormatException(格式化异常) ArrayIndexOutBoundsException(数组越界异常) ArithmeticException(算术异常) NullPointerException(空指针异常)等等
25.用JDBC来实现访问数据库记录可以采用下面的几个步骤:
(1).驱动管理器获取连接接口(connection)
(2).获得Statement或者他的子类
(3).指定Statement中的参数
(4).拖过Statement发送SQL语句
(5).检查并处理返回结果
(6).关闭Statement
(7).关闭连接
26.Error和 exception的区别与联系?
Error 电脑系统异常 内存溢出 网络故障
Exception 表示 程序运行时异常 或一般异常 try cation捕获
27.String s = "Hello";s = s + " world!"
没有 String对象建立后不能在改变 s=s+“world” 是s对象指向地址发生了改变
28.JVM工作原理?
运行jvm 字符码的工作是由解释器来完成的。解释执行过程分三步进行:
代码的装入、代码的校验、和代码的执行。
29.说说Java中的内存分配?
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存
30.final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承;
finally是异常处理语句结构的一部分,表示总是执行;
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。
31.Extends和Implement的不同
extends 只能单继承 final 修饰的类不能被继承
implement 可以多实现 不 支持多继承
32.静态的多态和动态的多态的区别?
静态的多态: 即为重载 ;方法名相同,参数个数或类型不相同。(overloading)
动态的多态: 即为重写;子类覆盖父类的方法,将子类的实例传与父类的引用调用的是子类的方法 实现接口的实例传与接口的引用调用的实现类的方法。
33.说出一些常用的类,包,接口,请各举5个?
常用的类:String、StringBuffer、 Integer 、Vector、ArrayList、Hashtable等
常用的包:java.lang java.io java.util 、java.sql 。
常用的接口:集合中的List、Set、 Map接口;与Servlet API相关的Servlet接口、HttpServletRequest,HttpServletResponse,HttpSession接口等。
34.Collections和Collection的区别【天晟科技】
Collection是个java.util下的接口,它是各种集合结构的父接口,定义了集合对象的基本操作方法
Collections是个java.util下的 工具类,它包含有各种有关集合操作的静态方法,主要是针对集合类的一个帮助类或者叫包装类,它提供一系列对各种集合的搜 索,排序,线程安全化等操作方法。
35.Class.forName的作用?为什么要用?
调用该访问返回一个以字符串指定类名的类的对象。
说明:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
36.Socket如何获取本地ip地址?
InetAddress类提供的API来访问。InetAddress.getLocalAddress()
37.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
38.是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。
39.abstract class(抽象类)和interface(接口)有什么区别?
抽象类 有抽象方法的类一定是抽象类 抽象类不一定有抽象方法
接口类 只有方法 没有方法体
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
40.Collection框架中实现比较要实现什么接口?
Comparable、Comparator接口
41.String 和StringBuffer的区别
三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
String实现了三个接口:Serializable、Comparable<String>、CarSequence
StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
、首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
42.List 和 Map 区别?
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
43.ArrayList和Vector的区别
两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的。
Vector是线程安全的
本文地址:https://blog.csdn.net/java_bibug/article/details/107464149