Java基础面试题

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

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

2. String s=new String(“xyz”)创建了几个String Object? 二者之间有什么区别?

答:
创建了两个对象
区别:

  1. 第一个
    String s=”xyz”;
    当类被加载时,String s=new String(“xyz”)进入栈中,JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象, String s=new String(“xyz”)执行后首先在常量池创建一个共享的字符串对象"xyz"。
  2. 第二个:
    String s=new String(“xyz”);
    程序中只要出现了new关键字,就会在堆内存中分配空间,创建对象,值是引用常量池之前创建的字符串对象“xyz”。

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

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

3. Collection和collections的区别

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

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

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. loat型float 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属性返回的是该数组的长度。
字符串String有length()方法,字符串的 length()返回的是该字符串的长度。
例如:
数组:
int[] array = {1,2,3,4,5};
int a = array.length;//求数组中元素的个数 是5
字符串:
String str = “he”;
int a = str.length(); //求字符串中字符的个数 是2

10. JDK,JRE和JVM是什么?

jdk jre jvm是什么?
答:JDK:jdk 是java语言开发最基础的工具包,jdk是整个Java的核心,包括了Java运行环境JRE、Java开发工具包和Java基础类库

JRE:jre是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。与大家熟知的JDK不同,
JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具。

JVM:jvm是java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为字节码的类文件,这种类文件可以在虚拟机上执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。

11. 说说&和&&区别?

&和&&都可以用作逻辑运算符,表示逻辑与。当运算符两边的表达式都为true时,结果才为true;否则,结果为false。
&,&&:(与,短路与):一样的地方就是二者执行最后的结果是一样的(true或false),但是执行的过程有区别,
对于&:无论&左边是否为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.testtest();

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:增强for是LinkList采用链表的结构将对象放在独立的空间中的遍历,每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。(侧重于无索引)
性能对比:循环数组结构的数据—普通for循环(普通for循环采用索引访问)
循环链表结构的数据—增强for循环(使用普通for数据量大可能会导致系统崩溃)
注意:在增强for循环中 add/remove 集合元素,会抛出 ConcurrentModificationException(并发修改异常) 异常

15. 面向对象的基本特征是什么?

面向对象有三大基本特征:封装、继承、多态
封装:
封装是把对象(可以理解为代码中的私有属性)的实现过程隐藏起来然后通过公用方法(get,set方法)体现出该对象的功能。

继承:
主要用来实现代码复用,继承就是父子类的一种关系 (继承关系) 子类可以继承父类的方法和属性(父类的私有属性可以被继承但私有方法不能)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§;
}
public void add(Person p) {
p.setName(“张三”);//此时main方法中的p和add方法中的p指向同一片空间,所以其中的值回收到影响,结果由李四变成了张三。
}

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

17. int和Integer的区别

(1)Integer是int的包装类,是引用数据类型,int则

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值