Java学习-Java基础
1.重写与重载的区别
- 重写发生在父子类之间,重载发生在同类之间
- 构造方法不能重写,只能重载
- 重写的方法返回值,参数列表,方法名必须相同
- 重载的方法名相同,参数列表必须不同
- 重写的方法的访问权限不能比父类方法的访问权限更低
2.接口和抽象类的区别
- 接口是interface,抽象类是abstract
- 接口的权限修饰符必须是public,抽象类可以是public default protected
- 接口是被实现的,可以进行多继承,抽象类是用来被继承的,只能是单继承
- 接口里面可以不有构造方法,抽象类里面可以有构造方法
3.权限修饰符
- public:全局都可以使用
- default:不同包的子类可以使用
- protected:同一个包内可以使用
- private:同一个类内可以使用
4.深拷贝与浅拷贝
- 浅拷贝:拷贝对象的引用,新对象的引用类型属性与原始对象共享同一个对象。
- 深拷贝:拷贝所有引用类型的属性,使原始对象和拷贝对象完全独立。
- 在 Java 中,默认的 clone() 方法是浅拷贝,需要手动实现深拷贝。
5.强软弱虚
- 强引用定义:Object obj=new Object();,这里obj就是对Object对象的强引用。不会被垃圾回收,内存不足,JVM 抛出OOM。
- 软引用定义:通过SoftReference类来实现。当内存不足时,垃圾回收器会回收这些对象。应用场景:常用于实现内存敏感的缓存。
- 弱引用定义:使用WeakReference类来创建。垃圾回收规则:无论当前内存是否充足,弱引用关联的对象都会被回收。应用场景:常用于解决内存泄漏问题,例如在ThreadLocal中使用弱引用存储键,当外部强引用消失时,ThreadLocal中的弱引用对象能被及时回收。
- 虚引用定义:通过PhantomReference类实现,且必须和引用队列(ReferenceQueue)联合使用垃圾回收规则:在任何时候都可能被垃圾回收器回收。应用场景:主要用于在对象被垃圾回收时进行一些额外的清理操作,例如管理直接内存(DirectMemory),在对象被回收时释放其占用的直接内存。
6.super和this的区别
- super是指代调用父类的构造方法,方法,成员变量等
- this是指代类本身,可以调用本类的构造方法,方法,变量
- 使用super调用构造方法的时候,必须放在第一行,保证父类先进行加载
- 使用this调用本类其他构造方法时候也必须放在第一行,避免部分加载的情况
7.sleep和wait区别
- sleep属于Thread类中的方法
- sleep释放cpu给其它线程不释放锁资源 sleep(1000) 等待超过1s被唤醒
- wait属于Object类中的方法释放cpu给其它线程,同时释放锁资源
- wait(1000) 等待超过1s被唤醒wait() 一直等待需要通过notify或者notifyAll进行唤醒wait 方法
- wait必须配合 synchronized 一起使用,不然在运行时就会抛出IllegalMonitorStateException异常
8.自动拆装箱 int和Integer区别
- 装箱:将基本类型转换成包装类对象
- 拆箱:将包装类对象转换成基本类型的值
为什么引入自动装拆箱功能?
主要是用于java集合中,List list=new ArrayList();list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。
Integer-128和+127的问题
Integer对-128到127之间的数字进行缓存,如果在这个范围比较直接取出缓存对象进行比较,如果超出了范围就新建对象,所以说==在范围内有效,超出范围就要用equals
==和equals区别
- ==比较的是两个基本数据类型的值或者引用数据类型的地址
- equals没重写之前比较的是两个对象的地址,重写一般比较对象属性的值
String能被继承吗
- 不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。
- 为了安全。String 类中有native关键字修饰的调用本地方法,如果方法可以重写,可能被植入恶意代码,破坏程序。Java 的安全性也体现在这里。
String a = “abc” String a = new String(“abc”),在内存中的区别
- String a = “123"会先检查常量池中是否有"abc”,有的话直接让a指向这个字符串,没有的话就创建放入常量池
- String a = new String(“abc”)是在堆内存中创建String对象
常量池的作用以及工作原理
- 缓存字符串对象,避免字符串重复创建,节省空间
- 当创建字符串时候,JVM先检查常量池,存在就复用,不存在就创建并放入
- 对于new的字符串对象,也可以通过intern方法放入常量池
String buffer和String builder区别
- StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,效率低。
- StringBuilder 没有这个修饰,可以被认为是线程不安全的。效率高
为什么有了String还要StringBuilder
- String是不可变的,每次对String进行修改都会创建新的对象,消耗资源
- StringBuilder是可变的,能在原有对象上修改内容,节省时间
final、finally、finalize
- final:修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不能再派生出新的子类,即不能被继承,修饰变量时,该变量使用中不被改变,即为常量。修饰方法时,不能在子类中被重写。
- finally:通常放在try…catch的后面构造终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码都能执行
- finalize:Object类中定义的方法,这个方法是由垃圾收集器在销毁对象时调用的
Object中有哪些方法(说出5个即可)
- protected Object clone()—>创建并返回此对象的一个副本。
- boolean equals(Object obj)—>指示某个其他对象是否与此对象“相等
- protected void finalize()—>当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
- Class<? extendsObject> getClass()—>返回一个对象的运行时类。
- int hashCode()—>返回该对象的哈希码值。
- void notify()—>唤醒在此对象监视器上等待的单个线程。
- void notifyAll()—>唤醒在此对象监视器上等待的所有线程。
- String toString()—>返回该对象的字符串表示。
线程的状态生命周期
- 新建状态(New) :线程对象被创建后,就进入了新建状态。Thread thread = new Thread()。
- 就绪状态(Runnable): 调用了该对象的start()方法,从而来启动该线程。随时准备被CPU调度执行。
- 运行状态(Running):线程获取CPU权限进行执行。
- 阻塞状态(Blocked):等待阻塞 – 通过调用线程的wait()方法,让线程等待某工作的完成。同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
- 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
IO流分为哪两种
- 字节流和字符流字节流里面有inputstream和outputstream,字符流里面有reader和writer
BIO NIO AIO区别
- BIO:阻塞式IO,传统的同步阻塞 I/O 模型,每个连接都需要一个独立的线程进行处理。
- NIO:非阻塞IO,采用多路复用(Selector 机制),一个线程可以处理多个连接,不需要为每个连接创建独立线程。采用 Buffer 进行数据读写,Channel 负责数据传输
- AIO:异步非阻塞IO,采用异步回调(基于事件驱动),I/O 操作完成后会自动触发回调方法,无需等待。适用于高并发、高吞吐的场景,如高性能 Web 服务器。
反射是什么
在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。
Class.forName()和ClassLoader.loadClass()有什么区别?
- Class.forName()默认会触发类的静态代码块(static{}执行)。适用于 JDBC 驱动加载(注册数据库驱动时)。
仅加载类,不执行静态代码块。 - ClassLoader.loadClass(“com.example.MyClass”)适用于框架动态加载类(如插件机制)
GET和POST的区别
- 参数 :GET:用于获取数据请求参数会显示在 URL 上。POST:用于提交数据数据放在请求体中传输。
- 安全性 :GET:参数暴露在 URL 中,不安全。POST:参数在请求体中,相对安全。
- 数据长度 :GET:URL 长度有限制,传输的数据量较小。不同浏览器和服务器对 URL 长度限制不同,一般不超过 2KB。POST:理论上无数据长度限制,可传输大量数据。
- 缓存 :GET:请求会被浏览器主动缓存,下次相同请求可能直接从缓存获取数据。POST:默认不会被缓存。
Cookie 和Session的区别
- Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的cookie
- Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的
- Web 页面之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去
Http和Https的区别
- 端口: http默认是80,https默认是443
- 安全性: http传输不加密不安全,https传输进行加密,相对安全
- 证书: http没有证书,https有权威机构发布的证书
Http1.0和Http1.1区别
- http1.0使用的是短连接,每个请求-响应都会新建一个 TCP 连接,请求结束后立即断开(无连接)
- http1.1使用的是长连接,支持持久连接,可复用 TCP 连接,减少建立连接的开销
- http1.0:仅支持 GET、POST、HEAD
- http1.1支持PUT、DELETE、OPTIONS、TRACE等请求
TCP和UDP有什么区别
- TCP面向连接的,UDP不是
- TCP保证可靠,UDP不保证(收到消息不确认)
- TCP传输字节流,UDP传输报文
- TCP传输准确性比较高的东西(文件,邮件),UDP适用一些比如视频,语音,直播
TCP三次握手,四次挥手
- 第一次握手:客户端发送SYN给服务端,告诉服务端,请求连接,客户端进入等待回复状态
- 第二次握手:服务端收到了请求,返回给客户端SYN+ACK包,说明可以进行连接,服务端进入等待
- 第三次握手:客户端收到了服务端返回来的可以连接信息,重新给服务端发送ACK,建立连接
- 第一次挥手:客户端发送报文告诉服务端需要断开连接,进入等待回复
- 第二次挥手:服务端接收到断开连接请求,发送给客户端收到了请求并告诉等一会,然后处理服务端自己的事情第三次挥手:服务端处理完事情,再次发送报文给客户端,告诉可以断开连接了
- 第四次挥手:客户端发送报文说可以断开了,服务端断开,客户端等一会也断开
浏览器输URL到页面展示过程
- 浏览器输入URL浏览器经过DNS解析出URL转换成IP地址
- 浏览器得到IP地址后,通过一个随机端口向服务端发起TCP连接(握手)
- 浏览器发送get请求,服务器接受到请求返回http响应报文浏览器收到报文后,渲染html