# Java基础知识与常见面试题
## 基础
1. 抽象类可以有构造方法,但是不能被实例化。不一定只有抽象方法,相反有抽象方法的一定是抽象类。
2. 抽象类和接口的区别
1. 接口可以继承接口,并且可以多继承,但类只能单继承
2. 抽象类必须有某一个子类实现所有的方法。
3. 接口中只能有方法的声明,静态方法和default方法,但抽象类可以有普通方法。
4. 抽象类的变量是普通变量,接口中是公共的常量。
2. 外部类不能是静态的,因为如果是静态的,那么随着应用启动该类就会被加载,如果根本没有用过该类,那么就会造成内存浪费,这样是不合理的。
3. 内部类,成员内部类可以访问外部类所有的方法和成员变量,不能有静态的方法和成员变量
4. 静态内部类,只能访问外部类的静态方法和成员变量
5. 匿名内部类,没有类名,没有关键字,也没有继承实现的修饰,类的定义和实例化同时进行。前提条件,必须继承或实现一个接口。比如Runable的匿名内部类实现,Thread的匿名内部类实现。
3. Try-Catch-Finally中,如果在finally修改返回值不会生效,但是如果直接return会覆盖try中的return。
4. 类初始化的过程
1. 创建实例前需要先加载并初始化该类
2. 子类初始化前需要初始化父类
3. 类初始化执行静态类变量显示赋值代码和静态代码块,从上到下执行。
5. 实例化的初始化过程
1. 非静态实例变量显示赋值代码和非静态代码块从上到下执行,对应的构造器方法最后执行。
2. 被重写的非静态方法的this指的是正在创建的对象,所以执行子类的重写方法。
6. 方法的传参机制和特殊类的不变性
1. 基本数据类型传递的是数据值,引用数据类型传递的是地址值。
2. String,包装类不可变,所以在方法中指向了新的对象,所以原数据仍然无法修改。
7. JAVA的四大特性(3.17 阿里一面题)
1. 抽象:abstract修饰,父类为子类提供一些属性和行为,子类根据业务需求实现具体的行为。如果子类没有实现所有的抽象方法,那子类也是抽象类。
2. 封装:private修饰,对外提供set,get方法。把对象的属性和行为结合为一个独立的整体,尽可能隐藏对象的内部实现细节。
3. 继承:extends,子类继承父类的属性,并能根据自己的需求扩展出新的属性和行为,提高代码复用性。
4. 多态:接口实现,继承父类进行方法重写,在同一个类中进行方法重载。不修改代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态。多态有三个必要条件
1. 要有继承
2. 要有重写
3. 父类引用指向子类对象
8. Collection接口下有:List,Set,Queue,sortedSet
9. Map接口下:HashMap,HashTable,TreeMap,IdentityHashMap,WeakHashMap
10. B+ Tree
1.
11. 红黑树
## super和 this
1. 都只能在构造器的第一行,且不能同时使用。
2. this调用的是重载的构造器,super调用的是父类被子类重写的方法。
3. this和super都指的是对象,所以不能在static环境中使用。
## 异常
1. Exception和Error的区别:
1. 都继承自Throwable
2. Error指的是较为严重的,正常情况不应该出现的错误,如OutOfMemoryError,StackOverflowError,不应当捕获
3. Exception指的是可以预料到的意外情况,可以捕获处理
2. 运行时异常(不受检查的异常)和一般异常的区别
1. 受检查的异常:编译时被强制检查的异常如ClassNotFountException,IOException
2. 不受检查的异常,在编码过程中可以避免的逻辑错误,如空指针异常,不需要在编译时强制检查。
3. 常见的几种运行时异常
1. NullPointerException 空指针
2. ClassCastException 类型转换
3. NumberFormatException 数字类型转换
4. IndexOutOfBoundsException 越界
4. throw和throws的区别
1. throw:在方法中手动抛出异常的方法,如果方法体内不处理,需要在方法上声明throws
2. throws:方法声明时标明可能产生的所有异常,不做任何处理直接向上层传
5. 异常使用的注意点
1. 不要捕获Exception这样的通用异常
2. 不要catch到异常后不处理
3. 借助日志记录异常
4. 不要try-catch一大段代码,因为会造成额外的性能开销
## Int 和 Integer
1. Integer在-128到127内时,使用缓存机制,是同一个对象,否则是不同对象不能直接==判断数值。
2. Integer在自增等操作后是一个新的对象。
3. 判断数值相等时需要使用equals或拆箱为基本数据类型int比较。
## String,StringBuffer,StringBuilder
1. String是final的,所以具有不可变性,对于字符串操作会产生新的String对象。
2. StringBuffer本质是一个线程安全的可修改的字符串序列,由于加入线程安全,会带来额外性能损耗。
3. StringBuilder是没有线程安全的StringBuffer。
4. String重写了equals方法,所以可以使用equals判断两个字符串内容是否一致。equals方法先判断是否为字符串,然后逐个比较。
## 方法重写和覆盖
1. 重写指子类中重写父类的方法,实现的功能不同。要求必须满足两同两小一大。
1. 访问修饰符要大于等于父类。
2. 方法名和参数相同。
3. 返回值是引用数据类型要小于等于父类,基本数据类型的返回值必须相同。
4. 抛出的异常更小。
2. 重载指方法名相同,参数类型和类型不同。
3. final方法,静态方法,private等子类不可见方法不可被重写。
## nio
1. IO和NIO的区别
1. IO:面向流,阻塞
2. NIO:面向缓冲区,非阻塞,选择器。通道负责打开连接,需要获取通道和容纳数据的缓冲区,操作缓冲区对数据进行处理。
2. 缓冲区Buffer
1. 底层就是数组,用于存储不同数据类型的数据
2. 根据数据类型不同,提供了相应类型的缓冲区。(boolean除外)
3. 存取数据的核心方法:put() get() flip() 分别对应存,取,读写模式切换
4. 缓冲区的四个核心属性
1. capacity:容量,一旦声明不能改变
2. limit:界限,表示缓冲区可以操作数据的大小
3. position:缓冲区中正在操作数据的位置
4. mark:标记用于标识position的位置,可以通过reset()恢复到mark的位置
5. 直接缓冲区,非直接缓冲区
1. 非直接缓冲区:allocate() 将缓冲区建立在jvm的内存中,需要从用户空间拷贝到内核地址空间。
2. 直接缓冲区:allocateDirect() 将缓冲区建立在物理内存内存中,由于不需要拷贝所以可以提高效率。但是当写到物理内存映射文件中后,程序无法再管理数据,而是由操作系统处理。分配销毁开销大,不容易控制。
6. 通道
1. 通道表示IO源于目标打开的连接,通道类似于传统的流,只不过通道本身不能访问数据,只能和Buffer交互。
2. 传统方式中,由CPU处理所有的IO接口,当出现大量数据请求后,CPU占用极高,性能下降。DMA是内存和IO接口中的一个直接存储器,DMA负责IO操作,CPU不需要干预IO操作,也就是IO流,但存在总线冲突问题。因为DMA还是需要向CPU申请资源,大量请求仍然会出现性能下降。
3. DMA由通道替代,通道是完全独立的处理器,专门用于IO操作,有一套自己的命令。
4. 通道间传输,transformTo/From()
5. 分散读取,将通道中的数据分散到多个缓冲区中
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Java前后开发面试题,大厂进阶之路,基于JavaGuide、Cyc大佬、牛客上的面经及王道考研相关视频,并改进了其中说法矛盾或含糊之处。 包含计算机网络知识、JavaSE、JVM、Spring、Springboot、SpringCloud、Mybatis、多线程并发、netty、MySQL、MongoDB、Elasticsearch、Redis、HBASE
资源推荐
资源详情
资源评论
收起资源包目录
Java基础知识与常见面试题.zip (153个子文件)
springLearning.iml 2KB
rocketmq.iml 2KB
sjms.iml 1KB
nio.iml 1KB
thread.iml 1006B
algorithm.iml 1006B
redisLearning.iml 998B
TOC.iml 930B
IntAndInteger.iml 830B
jvm.iml 830B
hashmapLearning.iml 830B
stringLearning.iml 830B
ListLearning.iml 830B
lambdaExpressLearning.iml 830B
SingletonPattern.iml 793B
TestMethod.java 5KB
TestBuffer.java 3KB
ThreadWaitNotifyDemo.java 3KB
AccountDaoImpl.java 3KB
ThreadOrderAccess.java 3KB
BigDecimal.java 2KB
TestNonBlockingNio.java 2KB
TestPing.java 2KB
AtomicDemo.java 2KB
OrderProducer.java 2KB
BeanFactory2.java 2KB
OrderStep.java 2KB
AsyncProducer.java 2KB
SyncProducer.java 2KB
ReadWriteLockDemo.java 2KB
SingletonDemo.java 2KB
ThreadTest.java 2KB
findRepeatNumber.java 2KB
Consumer.java 1KB
AccountServiceTest.java 1KB
AccountServiceImpl.java 1KB
BeanFactory.java 1KB
TransactionManager.java 1KB
SerializeUtil.java 1KB
HomeWork.java 1KB
volatileDemo.java 1KB
OrderConsumer.java 1KB
JedisPoolUtil.java 1KB
CyclicBarrierDemo.java 988B
ProxyFactory.java 979B
ProxyFactory.java 957B
Lock8.java 950B
MainClass.java 892B
University.java 868B
Colleage.java 864B
PersonProxy.java 857B
SemaphoreDemo.java 846B
LambdaExpressDemoo.java 841B
Singleton6.java 828B
OrganizationComponent.java 828B
NotSafeDemo.java 827B
ConnectUtils.java 823B
HashMapTest.java 797B
MyThreadPoolDemo.java 795B
Account.java 785B
Singleton2.java 744B
Singleton1.java 730B
CountDownLatchDemo.java 708B
Facade.java 675B
JdbcDemo1.java 662B
MainClass.java 659B
IntegerTest.java 632B
Ticket.java 610B
Department.java 580B
SaleTicket.java 578B
TeachDao.java 577B
Singleton5.java 570B
Client.java 560B
MainClass.java 546B
SoyaMilk.java 528B
FoldedPhone.java 522B
Projector.java 507B
Popcorn.java 495B
Singleton4.java 489B
DVDPlayer.java 488B
JVMTest.java 477B
WebSiteFactory.java 474B
Drink.java 468B
AccountService.java 458B
VoltageAdapter.java 443B
AccountDao.java 426B
BlockingQueueDemo.java 418B
XiaoMi.java 415B
TeachDaoProxy.java 413B
Vivo.java 407B
StringTest.java 405B
ConcreteWebSite.java 402B
Decorator.java 399B
TocUtils.java 393B
MainClass.java 363B
Phone.java 347B
MainClass.java 347B
TestTX.java 342B
MyCallable.java 340B
MainClass.java 330B
共 153 条
- 1
- 2
资源评论
极致人生-010
- 粉丝: 2930
- 资源: 2826
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功