Java面试总结1

xiaoxiao2021-02-28  15

1.简述:JDK,JRE,JVM的关系? JDK:Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。 JRE:Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的系统类库。 JVM:Java虚拟机,提供了字节码文件(.class)的运行环境支持。 2.java编程语言的特点、优势? 1.简单,稳定。 2.面向对象。 3.跨平台性。 4.解释型语言。 5.多线程。 6.多态性,可靠,安全。 2、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。 3、Java有没有goto? java中的保留字,现在没有在java中使用。 4.在JAVA中如何跳出当前的多重嵌套循环? 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号, 然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。 5.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型, 所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。 对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符, java编译器会对它进行特殊处理,因此可以正确编译。 6.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 使用final关键字修饰一个变量时,是指引用变量不能变, 引用变量所指向的对象中的内容还是可以改变的另外final修饰的方法不能被重写, 修饰的类不可被继承,修饰的成员变量不可改变。 7.静态变量? static关键字修饰成员变量是静态变量,静态变量不属于对象的数据结构 ,而是属于类的变量,通常通过类名来引用static成员。 当创建对象后,成员变量是存储在堆中的,而static成员变量和类的信息一 起存储在方法区, 而不是在堆中,一个类的static成员变量 只有“一份”(存储在方法区),无论该类创建了多少对象。 8.内存管理? JVM会将申请的内存从逻辑上划分为三个区域:堆、栈、方法区。 这三个区域分别用于存储不同的数据。 堆:用于存储使用new关键字所创建的对象。 栈:用于存储程序运行时在方法中声明的所有的局部变量。 方法区:用于存放类的各种信息(包括方法)都在方法区存储。 9.java Bean规范? 创建一个类时要遵循java Bean规范: 1)实现可序列化接口。 2)私有属性(成员变量)和公有方法。 3)无参构造器。 4)GET和SET方法。    其中:get和set方法后面跟着的属性是Bean属性,比如:getName/setName中的Name. 10.成员变量和局部变量以及java Bean规范中的bean属性? 局部变量: 1) 定义在方法中; 2) 没有默认值,必须自行设定初始值; 3) 方法被调用时,存在栈中,方法调用结束时局部变量从栈中清除; 成员变量: 1) 定义在类中,方法外; 2) 由系统设定默认初始值,可以不显式初始化; 3) 所在类被实例化后,存在堆中,对象被回收时,成员变量失效; Bean属性: get和set方法中,get/set后面跟着的属性是Bean属性,比如:getName/setName中的Name. 11.静态变量和实例变量的区别? 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象, 其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象, 而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象, 静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后 才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 12.Overload和Override的区别? Overload是重载的意思,Override是覆盖的意思,也就是重写。 重载Overload表示同一个类中可以有多个名称相同的方法, 但这些方法的参数列表各不相同(即参数个数或类型不同)。 重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同, 通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法, 这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向 对象编程的多态性的一种表现。 13.向上造型? 父类的引用指向子类对象。 14.面向对象的特征。 封装,继承,多态,抽象。 15.访问修饰符? public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 16.java中实现多态的机制是什么? 靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象, 而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法, 也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 17.abstract class抽象类和interface接口有什么区别? 含有abstract修饰符的class即为抽象类,抽象类不能创建的实例对象。 含有抽象方法的类必须定义为abstract class,抽象类中的方法不必是抽象的。 抽象类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为抽象类型。 接口(interface)可以说成是一种特殊的抽象类,接口中的所有方法都必须是抽象的。 接口中的方法定义默认为public abstract类型,接口中的成员变量类型默 认为public static final。 下面比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量 3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的, 不能有非抽象的普通方法。 4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的, 并且默认即为public abstract类型。 5. 抽象类中可以包含静态方法,接口中不能包含静态方法 6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以 任意,但接口中定义的变量只能是public static final类型, 并且默认即为public static final类型。 7. 一个类可以实现多个接口,但只能继承一个抽象类。 18.内部类可以引用它的包含类的成员吗?有没有什么限制? 完全可以。如果不是静态内部类,那没有什么限制! 如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问 外部类的普通成员变量,而只能访问外部类中的静态成员。 19.String是最基本的数据类型吗? 不属于,基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。 为了提高效率节省空间,我们应该用StringBuffer类。 20.什么是内部类?Static Nested Class和Inner Class的不同。 内部类就是在一个类的内部定义的类,内部类中不能定义静态成员内部类 可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面, 也可以定义在外部类的方法体中。 21.包装类的自动拆装箱? 自动拆装箱是JDK1.5以后的一个新特性: 基本类型转换为包装类叫自动装箱,比如int转换成Integer 包装类转换成基本类型叫自动拆箱,比如Integer转换成int。 22.Integer与int的区别? int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类, Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null, 即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。 23."=="和equals方法究竟有什么区别? ==比较基本数据类型时比较时的值是否相等,比较引用类型时比较的是对象 的地址值是否相同,是否是同一对象。 equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人 的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码: String a=new String("foo"); String b=new String("foo"); 两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象, 这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的, 所以,表达式a==b将返回false,而这两个对象中的内容是相同的, 所以,表达式a.equals(b)将返回true。 重写后的equals和==用法相同。 24.String和StringBuffer的区别? JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串, 即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。 而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时 候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字 符数据。另外,String实现了equals方法,new String(“abc”).equals(newString(“abc”) 的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”) .equals(newStringBuffer(“abc”)的结果为false。 25.final, finally, finalize的区别。 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码…… finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可 以覆盖此方法提供垃圾收集时的其他资源回收例如关闭文件等。JVM不保证此方法总被调用。 26.error和exception有什么区别? error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。 不可能指望程序能处理这样的情况。 exception表示一种设计或实现问题。 也就是说,它表示如果程序运行正常,从不会发生的情况。 27.sleep()和 wait()有什么区别? sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间, 给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。 调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁, 进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll) 后本线程才进入对象锁定池准备获得对象锁进入运行状态。 28.同步和异步有何异同,在什么情况下分别使用他们?举例说明。 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到, 或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据, 必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望 让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 29.List和 Map区别? 一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合, List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的, 其键是不能重复的,它的值是可以有重复的。 30.List, Set, Map是否继承自Collection接口? List,Set是,Map不是。 31.说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据 以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组 元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized 方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储, 按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可, 所以插入速度较快。 LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当 作堆栈和队列来使用。 32.Collection和 Collections的区别。 Collection是集合类的上级接口,继承与他的接口主要有Set和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合 的搜索、排序、线程安全化等操作。 33.set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()? 它们有何区别? Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖, 为的是当两个分离的对象的内容和类型相配的话,返回真值。 34.你所知道的集合类都有哪些?主要方法? 最常用的集合类是 List 和 Map。 List的具体实现包括 ArrayList和 Vector, 它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。 Map集合类用于存储元素对(称作"键"和"值")。 35.目前为止你处理过的异常有哪些? RuntimeExcepiton 运行时异常  ArithmeticException 算术异常  IllegalArgumentException 非法数据异常  ArrayIndexOutOfBoundsException 数组索引越界异常  NullPointerException 空指针异常  ClassNotFoundException 类无法加载异常(类不能找到)  NumberFormatException 字符串到float类型转换异常(数字格式异常)  IOException 输入输出异常  FileNotFoundException 找不到文件异常  EOFException 文件结束异常  InterruptedException (线程)中断异常  36.一个对象在什么情况下会被GC回收? 当这个对象没有被指向或者引用为NULL时会被GC回收。
转载请注明原文地址: https://www.6miu.com/read-2603144.html

最新回复(0)