Java面试题

内容转载(https://blog.csdn.net/hope900/article/details/78647466/)
1、linux与java之间的关系?
linux主要应用于服务器,是服务器的主流操作系统;
linux与windows类似,是以目录为机构的,区别是,windows是以盘符为单位的,例如C、D盘等,而linux系统最顶层只有一个root根目录,所有的文件都存储在此下;
除此之外、windows一般是基于图形界面的操作,而linux也支持图像化界面,但是绝大部分都是用命令的方式操作的;
2、什么是Java虚拟机?为什么被称为与平台无关的编程语言?
java虚拟机:可以执行java字节码的虚拟机平台;
平台无关性无语:平台只要安装jvm就可以运行java的字节码文件;
3、jdk、jre、jvm之间的关系?
jvm:java虚拟机,运行java字节码文件(编译后的文件)的平台;
jre:java的运行环境,包括jvm和一些java自带的类库,及java封装的一些功能,可以直接使用;
jdk:java开发的工具包,编译、运行环境、以及丰富的类库;
总结:三者之间的关系:jdk包含jre与jvm,jre包含jvm;
4、java支持的数据类型?自动拆装箱?
基本类型(八种):byte、shrot、int、long、float、double、char、boolean;
注:String是应用类型;
自动装箱:引用类型转换为基本类型;
自动拆箱:基本类型转换为引用类型
5、什么是面向对象?
OOP:面向对象编程
面向对象:是一种思想,万事万物皆可以看做是对象;
特性:抽象(封装)、继承、多态
抽象(封装):提取现实世界事物的关键特性,并为其构建模型,将之封装起来,保证类的高内聚;
继承:对现有类的一种复用的机制,一个如果继承现有的类,则将拥有这个类的所有的非私有的属性与行为;
多态:多态是在继承的基础上实现的;多态的三要素,继承、重写、父类引用指向子类对象;
多态的特性:父类对象指向不同的子类时,调用相同的方法,表现出不同的行为;又可以分为编译时多态(重载),运行时多态(重写);
6、&、|、^、>>、>>>、<<、~
(1)&:与、按位与
与:与&&差不多,区别为&&短路运算符
例:null != a & !a.equals("")
null != a && a.equals("")
若a==null前者会报错,空指针异常,若条件一不成立,他还是会判断条件二;
后者不会报错,若条件一不成立,他就不会判断后续了;
按位与:将数据转换为二进制(自动转换,可以写各种进制之间的例如:0x53&010101),同位都为1才为1,否则就为0;
(2)|:或、按位或
或:非短路运算符,相比于||;
例:null == a | a.equals("")
null == a || a.equals("")
若a == null,前者会报错,后者不会
按位或:将值转换为二进制,同位有一个数为1就为1,否则为0;
(3)^:异或
相同为0,不同为1(高位开始,从左到右)
(4)
>>:右移运算,num>>1,相当于num除以2^1
<<:左移运算,num<<1,相当于num乘以2^1
>>>:无符号右移,整体向右移动,正数相当于直接右移,负数则变为正数;
备注:1、并没有无符号左移,因为没有意义,右移是在前面补0或者补1,而左移只是往后面补0,不牵扯
正负的问题(与带符号左移是一样的);
2、左移位右移位是针对于int和Long类型的;
(5)~:非运算符,按位取反
0的地方为1,1的地方为1
7、值传递引用传递?
(1)值传递:针对于基本类型变量的,传递的是该变量的一个副本,改变副本不影响原变量;
(2)引用传递:针对于对象型变量,传递的是该对象地址的一个副本,并不是原对象本身;
8、是否可以在static方法内部使用非static变量?
不行,static修饰的变量以及方法是属于类的,而非static修饰的变量属于实例,编译时就会报错,因为这些变量还没有被创建出来;
9、java中的重载(Overloading)与重写(Overriding)的区别?
Overloading:同一个类里面,方法名相同,但是参数的类型,个数,顺序不同(返回类型不同不能重载,编译报错);
Overriding:基于继承,子类对父类的方法的重写,方法名相同,参数类型、个数、返回类型相同;
9、什么是构造方法?构造方法的重载?复制构造方法?
构造方法:每一个类都有一个构造方法,没有写出的则默认继承Object的构造方法,当新的对象被创建的时候,构造方法会被创建;
构造方法重载:与方法的重载类似;
复制构造方法:暂时不做了解;
10、java支持多继承么?
java的类不支持多继承,但是接口是可以的;
11、内存中栈、堆、方法区?
栈:基本类型的变量,对象的引用、函数调用的现场保存在JVM的栈空间;
堆:对象保存在对空间,垃圾回收的主要位置;
12、接口和抽象类的区别?
接口:接口是由interface修饰的类,接口中的方法全部是默认为public和abstract的,接口中的变量默认为常量,接口没有构造函数;
抽象类:由abstract修饰。抽象类中的方法可以有方法体,且抽象方法可以使用除private的词修饰,抽象类中的变量也是如此,抽象类是可以有构造方法的;
13、String、StringBuilder与StringBuffer的区别?
String:只读字符串,及其字符串的内容是不可修改的;
StringBuilder与StringBuffer:对象内容可修改;StringBuffer是线程安全的(使用synchronized关键字);
14、String str = new String(“xyz”); 创建了几个对象?
首先要明白。在jvm中是有一块内存专门存放字符串常量的,常量“xyz”不论出现多少遍,都是常量池中的,而对于new关键字,只要出现就会在堆中分配内存;
俩个或者一个,
若在运行时常量池中有abc这个对象,则只在堆中创建abc这个对象,常量“abc”不管出现多少遍都是常量池中的那一个;一个对象
若在运行时常量池中没有abc这个对象,则创建了俩个,一个在运行时常量池,一个在堆中;俩个对象
例:
String a = “xyz”;
String b = new String (“xyz”);
String c = new String (“xyz”) ;
String d = “adc” + new String(“asd”); // 创建了4个对象,adc(若在常量池中没有)一个、asd一个(常量池中没有)、new 在堆中新建一个对象、d指向一个对象;
syso(a == b); // 打印false,因为b指向的是堆中的对象,而a指向的是常量池的对象;
syso(b == c); // 打印false,因为只要new出现,就会在堆中新建一个对象,“ == ”指的是引用所指向的地址是否相同,故返回false;
syso(b == “xyz”); // 打印false,“xyz"取得是常量池中的,但是b的引用指向的是堆中的"xyz”;
ps:字符串常量池、Class常量池、运行时常量池介绍(上文说的常量池指的是字符串常量池): https://blog.csdn.net/zm13007310400/article/details/7753434
15、枚举、泛型
枚举:
目的:为了取代传统常量的定义;
好处:运行效率高、类型安全等;
特点:构造方法必须为私有、且所有的枚举默认继承Enum类,孤其不能在继承其他类;
https://blog.csdn.net/qq_34988624/article/details/86592229
泛型:
目的:为了解决强制转换而存在的隐患(向下转型),提供了编译期间的类型安全,避免了运行时产生类型转换错误;
实现:泛型是通过类型擦除来实现的,编译器在编译时擦出了所有类型相关的信息,所以在运行时不存在任何类型相关的信息;
16、UUID是什么?
参考:https://www.cnblogs.com/java-class/p/4727698.html
含义:通用唯一识别码 (Universally Unique Identifier);
作用:可以作为数据库的主键(每一次生成都不同);
内容:当前日期和时间+时钟序列+全局唯一的IEEE机器识别号
使用:
String uuid = UUID.randomUUID().toString().replaceAll("-", “”);
17、lambda表达式?
什么是lambda表达式:http://www.runoob.com/java/java8-lambda-expressions.html
lambda表达式的使用场景:https://www.cnblogs.com/franson-2016/p/5593080.html
简介:java1.8新特性,申明式函数:
本质:是一个匿名的函数;
目标类型:
函数接口:一个接口如果只有一个显示声明的抽象方法,一般用@FunctionalInterface标注,也可不标;
ps:(1)函数式接口显示声明Object的方法不会影响(例如equals方法)
(2)一个lambda表达式转换成Object(必须先转换成函数接口,才能转换成Object)
(3)一个lambda表达式可以有多个目标类型
结构:(参数类型 参数)-> {执行的逻辑}
(4)jdk预定义的接口函数:
a、Function<T,R>接收一个T类型的参数,并返回一个R类型的返回值;
b、Counsumer,没有返回值;
c、Predicate 判断某项条件是否满足,用来进行筛滤操作;
参数类型若为数字类型可不写(默认为数字类型);
参数也可不写,不写则认为不传参;
执行的逻辑就是一些代码;
使用(赋值、传参、返回值):
(1)使用foreach遍历iterator集合、排序;
(2)匿名内部类(回调、时间响应器,Runnable中的Thread类);
(3)使用lambda和stream,stream是对集合的包装
使用lambda可以做map, filter, limit, sorted, count, min, max, sum, collect
filter:过滤,用来过滤符合的结果集,返回为Predicate(且函数部分更换为条件部分,且不能使用{},只能使用(),不加也行);
limit:限制结果集的个数;
collect:排序;colletc(toList());
min/max:筛选最小/大的;
summaryStatistics:可以通过其来获得stream中元素的各种汇总数据;
在这里插入图片描述
PS:“::”:https://www.jianshu.com/p/96b4815d629e
简化lambda表达式
18、print、prinft、println区别?
区别:https://www.cnblogs.com/yyroom/p/3314228.html
printf使用:https://www.cnblogs.com/seakt/p/4478045.html
print:一般的输出,不换行;
println:与print类似,但是最后会换行;
printf:格式化的输出一些数据
在这里插入图片描述
19、comparaTo的返回值?
a.comparaTo(b),若a>b,返回值为正数,相同为负数,a<b则返回负数;

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值