语言基础
面向对象和面向过程的区别
面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式
开发、Linux/Unix等一般采用面向过程开发,能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系
统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步
一步的实现。
简述在System.out.println()里面,System, out, println分别是什么
System是系统提供的预定义的final类,
out是一个PrintStream对象,
println是out对象里面一个重载的方法。
描述行( serial )收集器和吞吐量( throughput )收集器的区别 ?
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。
1:串行GC:
整个扫描和复制过程均采用单线程的方式,相对于吞吐量GC来说简单;适合于单CPU、客户端级别。
2:吞吐量GC:
采用多线程的方式来完成垃圾收集。
适合于吞吐量要求较高的场合,比较适合中等和大规模的应用程序。
java and GC
Java堆是Java虚拟机所管理的内存中最大的一块,它被用来存储对象实例和数组。Java堆是所有线程共享的内存区域,在虚拟机启动时创建,并且可以动态地扩展或缩小。Java堆通常被划分为新生代、老年代和永久代(Java 8之前)/元空间(Java 8及以后)。
当Java堆中的对象不再被引用时,它们就变成了垃圾。Java虚拟机的垃圾回收器会自动检测并回收这些垃圾对象,以释放内存空间。垃圾回收器通过扫描Java堆中的所有对象,查找那些不再被任何其他对象引用的对象,并将其标记为可回收的垃圾对象。然后,垃圾回收器会回收这些垃圾对象占用的内存空间,并将其加入到空闲列表中,等待下一次分配给新的对象。
Java堆的垃圾回收过程称为GC(Garbage Collection)。GC具有自动化的特点,这意味着程序员无需手动管理内存,而只需要关注如何编写高效的代码和使用适当的数据结构来避免产生不必要的垃圾。不同的垃圾回收算法和策略可以对性能产生影响,因此需要合适地选取垃圾回收器和参数来优化系统性能。
32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5 GB,Solaris 大约 3GB。64 位 JVM允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的
Java 中 WeakReference 与 SoftReference的区别
WeakReference适合用于只有在没有强引用时才能被回收的对象。
SoftReference适合用于在内存不足时才被回收的对象,通常用于实现缓存等功能。
1.WeakReference(弱引用)
WeakReference用于引用那些只有在没有强引用时才能被回收的对象。当一个对象只有WeakReference指向它而没有其他强引用时,垃圾收集器会在下一次进行垃圾回收时将其回收。这意味着,如果只有弱引用指向对象,那么该对象会被认为是不可达的,并在垃圾收集时被回收。
WeakReference通常用于构建高效的缓存、观察者模式等场景,其中需要及时回收对象而不会造成内存泄漏。当没有其他强引用指向对象时,这些弱引用指向的对象会被自动清理。
SoftReference用于引用可能还有用但并非必需的对象。与弱引用不同的是,当垃圾收集器执行垃圾回收时,只有在内存不足的情况下,才会回收被软引用指向的对象。这使得软引用非常适合实现缓存。
在内存充足的情况下,即使只有软引用指向对象,对象仍然保持在内存中。但当内存不足时,垃圾收集器会尝试回收这些被软引用指向的对象,以便释放更多内存
强引用
强引用(Strong Reference)是Java中最常见的引用类型,也是默认的引用类型。12
当一个对象被一个强引用变量所引用时,只要该变量还存在,垃圾收集器就不会回收这个对象。即使内存空间不足,Java虚拟机也宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会随意回收具有强引用的对象来解决内存不足的问题。强引用可以直接访问目标对象,且所指向的对象在任何时候都不会被系统回收。然而,如果强引用对象不再使用时,需要显式地将其设置为null,或让其超出对象的生命周期范围,这样垃圾回收器才能回收这个对象。
string为什么是不可变
Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串
java堆和栈的区别
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码 来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存 放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
string stringbuffe