java基础面试题题库一(传智专修学院2017级Java4班)

本文汇总了Java面试中常见的技术问题,涵盖了数据类型、集合框架、异常处理、内存管理、面向对象特性等核心主题,旨在帮助Java开发者全面掌握面试所需知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-------------------------------------------------------------

本面试题由传智专修学院2017级java4班所有同学合作完成

-------------------------------------------------------------

1.char型变量中能不能存储一个中文汉字?(黎珊珊)

答:能, 可以存储一个中文汉字,因为在Java中,char类型占2个字节,而且Java默认采用Unicode编码,一个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉字还是英文字母都是用Unicode编码来表示的。所以,在Java中,char类型变量可以存储一个中文汉字。

2.String s=new String("xyz")创建了几个String Object? 二者之间有什么区别?(李源AND叶元林)

答:创建了两个对象

答案一:

区别:

第一个:

   String s=xyz;

  1. 第一个

当类被加载时,String s=new String("xyz")进入栈中,JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象, String s=new String("xyz")执行后首先在常量池创建一个共享的字符串对象"xyz"

  1. 第二个:

  String s=new String(xyz);

  程序中只要出现了new关键字,就会在堆内存中分配空间,创建对象,值是引用常量池之前创建的字符串对象“xyz”。

答案二:

这个跟常量池没有关系只要是new都是重新分配堆空间如果不区分栈和堆这里创建了1String Object。如果是从jvm角度来说的话,它是创建了两个对象,String s是在栈里创建了一个变量,new String("xyz")是在堆里创建了一个对象并被s引用到。

如果是String s = "xyz",那就要看常量池里有没有"xyz",如果有直接引用,如果没有则创建再引用

3. Collection和collections的区别(邱满绪)

1Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。例如: list接口, set接口,ArrayList  hashSet

2Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化就像一个工具类服务于JavaCollection框架。 

4. GC是什么?为什么要有GC?(冯松年)

GC是垃圾收集器

作用是:用来回收内存,当资源紧张时自动清除内存堆中死亡或长期没有使用的对象释放资源

为什么要有GC

如果没有GC,程序运行时死掉的对象或长期用不到的对象,会大量的占用资源,会使内存溢出,导致程序崩溃。因为程序员不能实时的调用垃圾回收器对内存堆中死亡或长期没有使用的对象进行回收。

所以出现了GC ,GC可以自动进行管理程序运行内存,要使用GC可以调用System.gc()和Runtime.getRuntime.GC()方法

GC可以有效的防止内存泄露,有效的使用内存。

5. 通过迭代器遍历list的时候,如果想修改集合对象是否会报错,会报什么错误?如何解决这个错误?(张宇)

并发修改异常ConcurrentModificationException

1、在使用迭代器进行遍历集合时会获取到当前集合的迭代对象

2、获取到的对象中封装了迭代器的remove方法与集合本身自带的remove方法

3、当调用迭代器对象的remove方法是没问题的,但调用集合自带的remove方法就会报错

4、总的来说,通过迭代器进行遍历集合的时候,是不允许集合本身在结构上进行修改的

解决方式:

方法一:迭代器迭代元素,迭代器修改元素由于Iterator迭代器没有添加功能,所以使用其子类ListIterator                                     

方式二, 如果想修改集合对象使用for循环的方式

6. 如何对list集合中的数据去重?(尤宝松)

答:

1.采用set集合进行去重,set有一个特性就是元素不重复

2.我们先创建一个set对象

3.把一个数据重复的list集合,放入set中

4.因为set集合不能存储重复的数据,所以可以完成去重

7. loatfloat f=3.4是否正确?(陈紫嫣)

答:错误!因为float需要被声明!在java中整数默认为int数据类型,小数默认为double数据类型,所以如果需要创建float类型的数据,则需要按照float的定义语法进行定义,在定义的小数后面添加f来标识该数据的类型是float类型   

8. error和exception有什么区别?(曹泽伦)

首先,Throwable类是所有异常的根类,Error类和Exception类是Throwable类两个重要的子类。

    Error(错误)是系统中的错误,程序员是不能改变的和处理的,只能通过修改程序才能修正,如系统崩溃,内存溢出。

    Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。

举个简单的例子

Error和Exception就像是水池和水池里的水的区别

“水池”,就是代码正常运行的外部环境,如果水池崩溃(系统崩溃),或者池水溢出(内存溢出)等,这些都是跟水池外部环境有关。这些就是java中的error

“水池里的水”,就是正常运行的代码,水污染了、有杂质了,浑浊了,这些影响水质的因素就是Exception。

9. 数组有没有length()这个方法?String有没有length()方法?(邱满绪)

java中数组是没有length()方法的只有length属性数组length属性返回的是该数组的长度。

字符串Stringlength()方法,字符串的 length()返回的是该字符串的长度。

例如

数组:

    int[] array = {1,2,3,4,5};

    int a = array.length//求数组中元素的个数 5

字符串:

   String str = "he"

   int a = str.length(); //求字符串中字符的个数 2

10. JDK,JREJVM是什么?(张雨豪)

jdk jre jvm是什么

    答:JDKjdk java语言开发最基础的工具包,jdk是整个Java的核心,包括了Java运行环境JREJava开发工具包和Java基础类库

           JREjre是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。与大家熟知的JDK不同,

JREJava运行环境,并不是一个开发环境,所以没有包含任何开发工具。

           JVMjvmjava虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为字节码的类文件,这种类文件可以在虚拟机上执行。

只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。

          JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。

11. 说说&和&&区别?(李源)

&&&都可以用作逻辑运算符,表示逻辑与。当运算符两边的表达式都为true时,结果才为true;否则,结果为false

&&&:(与,短路与):一样的地方就是二者执行最后的结果是一样的(truefalse),但是执行的过程有区别,

对于&:无论&左边是否为false,他都会继续检验右边的boolean值。

对于&&:只要检测到左边Boolean值为false时,就会直接判断结果为false,不会在检验右边的值(因为"短路与:&&"有一个false最后结果就是false了)

所以&&的执行效率更高,所以一般都是使用&&.

12. this和super的区别(张大伟)

this表示当前类对象,super表示对当前类父类的引用

例如:

一个A类与B类,A类继承了B类,那么B类就是A的父类。如果A类中有个方法test(),B类中也有方法test (),A中使用this. test ()调用的就是A中的test()方法,如果要在A类中调用B类中的test方法,是super.test();

13.JAVA中的栈和堆的区别(常兆祥)

概述:在Java中,常用的内存分为两种,一种是栈内存,另一种是堆内存。

区别:

(1)存放内容不同:

栈内存:用来存放基本数据类型变量和引用类型变量。

堆内存:用来存放运行时创建的对象。

(2)生命周期不同:

栈的生命周期与线程相同,随线程而生,随线程而亡,是线程私有的。

堆的生命周期与JVM相同,JVM启动时创建,JVM停止时销毁,是线程共享的。

(3)内存回收管理不同:

栈是线程私有的内存区域

堆是线程共享的内存区域

(4)存取速度不同:

栈的存取速度较快,仅次于寄存器,但栈的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。

堆在运行时动态分配内存,生存期不用提前告诉编译器,但这也导致了堆的存取速度较慢。

14. 普通的for循环和增强for那个遍历list集合更快?(程大力)

增强for循环是普通for循环的简写形式

相同点(作用):普通for循环和增强for作用 遍历集合或数组

不同点(场景)1.普通for循环 

              1.1普通for是遍历ArrayList,采用数组的形式保存对象的这类方式,这种方式将对象放在连续的内存块中, 因为连续,所以插入和删除时效率低,因为有索引,所以查询效率高。(侧重于有索引)

              2.增强for循环

              2.1:对于数组,是在编译期把增强for还原成简单的for循环

              2.2:实现 Iterable 接口的对象,最终java会通过迭代器的形式来遍历它              

              2.3:增强forLinkList采用链表的结构将对象放在独立的空间中的遍历,每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。(侧重于无索引)

性能对比:循环数组结构的数据---普通for循环(普通for循环采用索引访问)

         循环链表结构的数据---增强for循环(使用普通for数据量大可能会导致系统崩溃)

注意:在增强for循环中 add/remove 集合元素,会抛出 ConcurrentModificationException(并发修改异常) 异常 

15. 面向对象的基本特征是什么? (冯松年)

面向对象有三大基本特征:封装、继承、多态

封装:

封装是把对象(可以理解为代码中的私有属性)的实现过程隐藏起来然后通过公用方法(getset方法)体现出该对象的功能。

继承:

主要用来实现代码复用,继承就是父子类的一种关系 (继承关系) 子类可以继承父类的方法和属性(父类的私有属性可以被继承但私有方法不能)java是单继承。一个子类只能继承一个父类。

多态:

父类引用或接口的引用指向自己的子类对象,这就是多态,多态提高了程序的扩展性。

但是只能访问父类中具备的方法不能访问子类中特有的方法。实现多态两个类中必须有关系比如 继承或实现关系。

16. 什么是值传递和引用传递?(刘晓龙)

值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参                数

例如:

 Public static void main(String [] args){

  Int a=2;

   add(a);

}

public void add(int a) {

  a=10;//此时对a进行更改,不会影响到main方法中a的值,表示只是将main中a的值复制发一份到add方法中

}

这个可以看作是值传递,a是基本数据类型,重新给a赋值10 

 

引用传递:指的是在方法调用时,传递的参数是变量引用的地址值,传递前和传递后都指向同一个内存空间

例如:

 Public static void main(String [] args){

  Person p=new Person();//此时p的name值为:李四

   add(p);

}

public void add(Person p) {

 p.setName(张三);//此时main方法中的p和add方法中的p指向同一片空间,所以其中的值回收到影响,结果由李四变成了张三。

 }

总结:

对象传递是引用传递,基础类型数据传递是值传递

17. int和Integer的区别(戴光辉)

(1)Integer是int的包装类,是引用数据类型,int则是java的一种基本数据类型 
(2)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
(3)Integer的默认值是null,int的默认值是0

18. 四类八种,以及取值范围(袁树清)

 四类:

  整数型,浮点型,字符型,布尔型

 八种:

   byte,short,int,long,float,double,char,boolean

 取值范围:

四类

八种

数据表示范围

整型

byte

-128~127(重点记)

short

-32768~32767

int

-2147483648~2147483648

long

-263~263-1

浮点型

float

-3.403E38~3.403E38

double

-1.798E308~1.798E308

字符型

char

表示一个字符,如('a','A','0','家')

布尔型

boolean

只有两个值true与false

19. 异常处理的时候 finally代码块的重要性是什么(卢梦豪)

finally 代码块

是异常处理的一部分,用于释放资源  一般来说的话,finally控制的代码一定会执行

重要性:

不管catch语句抛不抛出异常,finally代码块总是会被执行.

就算是没有catch语句的同时,抛出异常的话,finally代码块仍然会被执行。

20. 在java中,对象什么时候被垃圾回收(卢梦豪)

1)Java中垃圾收集器自动地定期扫描Java对象的动态内存,并将所有的引用的对象加上标记,在对象运行结束后(没有变量对该对象进行应用),清除其标记,并将所有无标记的对象作为垃圾进行回收,释放垃圾对象所占的内存空间。

2)对象运行结束后或生命周期结束时,将成为垃圾对象,但并不意味着就立即会被回收,仅当垃圾收集器空闲或内存不足时,才会回收他们。

                                                                                                                                                                     2019.1.7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月阳阳月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值