【2019秋冬】【面经】Java基础

10 篇文章 0 订阅
6 篇文章 0 订阅

语法类

Java8种基本数据类型
int float double byte boolen long short char
bool byte 1字节
char short 2字节
int float 4字节
double long 8字节

Integer与int区别
1.int为基本数据类型,Integer为封装类型
2.Integer需要new生成对象才能赋值,int可以直接赋值
3.Integer是通过new生成一个对象的引用,int是直接存储数值
4.Integer的默认值是null,int的默认值是0

int与Integer相等比较

两个Integer实例化的对象不相等,因为是引用,代表的是地址

Integer a = new Integer(100);
Integer b = new Integer(100);
a == b //false

Integer实例化对象与int可以比较,因为会自动拆箱成int

Integer a = new Integer(100);
int b = 100;
a == b //true

非new生成的Integer对象和new生成的Integer对象不相等,非new的是直接引用常量池,地址不同

Integer a = new Integer(100);
Integer b = 100;
a == b //false

两个非new生成的Integer对象在-128~127区间内可以比较,因为java内部在编译时,规定在这个区间范围内会将值进行缓存,两次调用的是同一个

Integer a = 100;
Integer b = 100;
a == b //true

字节与字符
字节是存储容量的单位,字符是数字,字母等符号

基本类型与引用类型
基本类型是存储值,引用类型存储地址

String,StringBuilder与StringBuffer区别
1.都是final类,不允许被继承
2.String长度不可变,StringBuilder和StringBuffer可变
3.StringBuffer是线程安全的,在StringBuilder的基础上加了synchronized锁
4.StringBuilder性能更好

为什么String不可变
因为String是final类,如果String不是final类,那么子类就可以覆盖方法,修改字符串,违背了String的不可变性
String不可变是为了提高效率,String创建的字符串会放入常量池,再次引用会直接在常量池中访问;保证安全,String常用来表示路径,地址;

+号连接字符串:通过StringBuilder的append方法实现

String属于基础数据类型吗
不属于,基础数据类型只有八个

String str="i"与 String str=new String(“i”)一样吗?
不一样,前者会被分配到常量池,后者会被分配到堆内存中

Object常见函数
equal ;hashCode ;getclass ;toString; wait ;notify ;notifyall;

==与equal
基本数据类型 = = 比较值,equal比较值
复合数据类型 = = 比较地址,equal比较内容,因为被重写
没有被重写的比较地址
StringBuilder与StringBUffer特殊,= = equal都比较地址

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
不对,哈希值相等不代表值相等
每次重写equals时也要重写hashCode

finally finalize final 区别
final是修饰符,表示该方法或变量不可被修改,类不可被继承
finally是try catch finally中的最后一部分,可以被省略,但如果存在就一定被执行
finalize是Object类的一个方法,在对象被回收时调用

finally代码块与finalize()方法区别
无论是否抛出异常,都会执行finally
finalize只会在对象被垃圾回收时被虚拟机调用回收

final
final是修饰符,不可被修改
修饰类,该类不可被继承
修饰方法,该方法不可被重写
修饰变量, 如果是基本数据类型,数值在初始化后不可更改;如果是引用类型变量,初始化后值可变,但引用不可变

static
修饰代码块 类加载完成后,执行代码块内容
修饰方法 类加载时就存在,不依赖任何实例,static方法必须实现,不能抽象
修饰变量 类加载时被初始化,内存中只有一个,被所有类共享

父类静态代码块 > 子类静态代码块 > 父类非静态代码块 > 父类构造方法 > 子类非静态代码块 > 子类构造方法

static方法是否能被覆盖?
不可以,因为覆盖是在运行时动态绑定的,而static方法是编译时静态绑定的。static方法与类的实例无关

可以在static中访问非static变量吗?
不可以,static变量在编译时被加载进了静态方法区,此时还没有实例化,而非static变量需要实例化才能访问。

Comparable接口与Comparator接口
comparable和comparator都用来对对象集合或数组排序。
comparable强制自然顺序排序,比较的类必须继承接口并重写函数
comparator可以实现对特定字段的排序,可以单独使用

Session与Cookie
Session是用户登录之后,服务器创建一个Session,并把session id 发送给浏览器,浏览区会存储到cookie中。当浏览器再次访问服务器时,会带着session id,服务器接受后根据id找到对应的信息

Cookie是浏览器存储在本地的一块服务器发送的信息,在浏览器访问服务器时传送对应的cookie。

区别:
session在服务器端,cookie在客户端
session可以放在文件,数据库或内存中,cookie只能放在浏览器中
cookie安全性没有session高
cookie有容量限制,session没有

概念类

面向对象的特性
1.继承:一个类可以继承另一个类的方法与变量
2.抽象:只关注对象的行为,不关心细节
3.封装:只提供接口,对内部不可见
4.多态:允许同一个对象对同一消息有不同的反应

创建对象方法
1.使用new
2.使用clone
3.反序列化
4. 反射机制,Class类的newInstance方法或Constructor类的newIstance方法

重载与重写
重写,就是覆盖
1.不能在同一个类中
2.名相同,参数相同,返回值相同
3.子类方法的访问修饰符要大于父类
4.子类方法的异常检测要小于父类
5.发生在运行时
是多态的体现

重载
在同一个类中,方法名相同,其他都可以不同,发生在编译时

装箱 拆箱
是基本数据类型和封装类型的自动转换,基本数据类型如int转化为封装类型Integer为装箱,封装类型转为基本数据类型为拆箱

反射机制
在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用其任意一个方法和属性

获取Class对象的方法:class.getclass() class.forname classloader.loadclass

抽象方法是什么?
用 abstract修饰的方法,是一个没有方法体的方法,如果使用需要继承抽象类并重写这个方法

抽象类必须要有抽象方法吗?
不是必须的,抽象类中允许有非抽象方法,不强制要求一定有抽象方法

抽象类能使用 final 修饰吗?
不可以,因为抽象类需要被继承才有意义,声明了final就无法被继承

抽象类中可以有main函数吗?
可以有,但不能创建实例

抽象类可以有构造函数吗?
可以有构造函数,即使不声明一个构造函数,系统也会默认添加,声明构造函数可以对抽象类内的变量赋值

抽象类可以实现接口吗?
可以实现接口,通过implement实现,因为是抽象的,不需要实现所有的方法

可以创建抽象类的实例吗?
抽象类不可以创造实例

普通类和抽象类有哪些区别?
普通类可以实例化,不能包含抽象方法
抽象类不可以实例化,可以包含抽象方法

接口与抽象类有什么区别?
1.一个类可以实现多个接口,抽象类只能被继承一次
2.接口不可以有构造函数,抽象类可以有
3.接口内不能有普通成员变量,抽象类可以有
4.接口中所有的方法必须是抽象的,抽象类中可以有非抽象方法
5.接口中的方法默认修饰符是public,抽象类的方法可以自定义
6.实现一个接口必须实现其所有方法,抽象类没要求

Java 中 IO 流分为几种?
按功能分为 输入流,输出流
按类型分为 字节流,字符流

BIO、NIO、AIO 有什么区别?
BIO 同步阻塞 传统IO,并发能力低
NIO 同步非阻塞 多用于通信,实现了多路复用
AIO 异步非阻塞 NIO的升级

JDK与JRE
JRE是运行时环境,包括虚拟机,核心类库和支持文件
JDK是完整的开发包,包括JRE和其他工具

用键盘获取输入方法
1.通过Scanner
2.通过BufferedReader

序列化
保存内存中各种对象的状态,需要的时候可以还原回来
将实现了serializable接口的对象转化为一个字节序列

一般在需要数据持久化,或在网上传递信息时采用序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值