一、面向对象的特性有哪些?
-
封装(Encapsulation):将数据和方法封装在一个类中,通过访问修饰符控制数据的访问权限,提高程序的安全性和可维护性。
-
继承(Inheritance):将多个类共有的属性和方法抽象出一个父类,通过子类继承父类的方法实现代码复用。
-
多态(Polymorphism):一个对象有多种状态,编译类型和运行类型可以不一致,具体表现为指父类的引用指向子类的对象,但实际实现是看子类重写后的方法。实现多态的基本原理是动态绑定。
动态绑定:java程序在运行过程中根据对象的运行类型来确定要调用的方法
Animal cat = new Cat();
cat.eat(); // 这里会调用 Cat 类中的 eat() 方法
在 Java 中,每个类都有一个对应的函数表。当子类重写了父类的方法时,它会覆盖父类在函数表中的条目,并将自己的方法地址写入表格中。
当调用一个类的方法时,程序会通过函数指针来访问该对象的函数表,并根据函数名和参数列表来查找要调用的方法。如果找到了对应的方法,则直接调用该方法;否则,程序会沿着继承链向上查找,直到找到对应的方法为止。这个过程称为动态绑定或者运行时绑定。
二、Java 中重写和重载是什么意思?
-
重写(Override):指在子类中重新定义与父类中同名的方法,具有相同的方法名、返回类型和参数列表。
-
重载(Overload):指在一个类中定义多个同名的方法,但是方法的参数类型、数量或顺序不同,也称为方法的签名。重载可以让方法名在程序中具有更广泛的应用场景,提高程序的灵活性和可维护性。在进行方法调用时,会根据传入参数的类型和数量匹配到最合适的方法实现。
三、构成重载的条件有哪些?
- 方法名必须相同。
- 参数列表必须不同,可以是参数类型、参数数量或者参数顺序不同。
- 方法的返回值类型可以相同也可以不同。
- 方法的修饰符可以相同也可以不同。例如public、private、protected、default等。
- 重载方法可以抛出不同的异常。
四、抽象类和接口的区别?
Java中的抽象类(Abstract Class)和接口(Interface)都是用于实现抽象和多态的机制,但是它们之间有以下几个主要区别:
-
实现方式不同:抽象类是一种基于继承的机制,即只能通过继承抽象类来实现其子类;而接口则是一种独立的概念,可以被多个类实现,实现类与接口之间不存在继承关系。
-
方法的实现:抽象类可以拥有构造器、普通方法和抽象方法,其中抽象方法必须在子类中实现;而接口只能定义抽象方法和常量,所有抽象方法必须在实现类中进行实现。
-
访问修饰符:抽象类中的方法可以使用public、protected、private等访问修饰符进行限定;而接口中的方法都是public的,不能使用其他访问修饰符进行限定。
-
变量的定义:抽象类中可以定义普通变量和静态变量,并且可以对变量进行初始化;而接口只能定义常量,而且必须在定义时进行初始化。
-
多重继承的支持:由于Java语言不支持多重继承,因此一个类只能继承一个抽象类,但是可以实现多个接口。
五、常见的集合有哪些?
-
列表(List):以线性方式存储数据,允许重复元素,可以根据下标进行访问和修改。常见的列表实现类包括ArrayList、LinkedList、Vector等。
-
集合(Set):不允许重复元素,可以用于去重和判重等场景。常见的集合实现类包括HashSet、TreeSet、LinkedHashSet等。
-
映射(Map):将键值对关联起来,可以按照键进行查找和更新。常见的映射实现类包括HashMap、TreeMap、LinkedHashMap等。
-
栈(Stack):先进后出(FILO)的数据结构,常用于实现撤销和回退等功能。常见的栈实现类包括Stack和ArrayDeque。
-
队列(Queue):先进先出(FIFO)的数据结构,常用于实现消息队列和处理任务等。常见的队列实现类包括LinkedList、PriorityQueue、ArrayBlockingQueue等。
六、HashMap 和 HashTable 的区别有哪些?
-
线程安全性:HashTable是线程安全的集合类,所有的方法都被synchronized修饰,可以保证在多线程环境下不会出现并发问题;而HashMap则不是线程安全的集合类,需要通过一些手段(例如使用Collections.synchronizedMap()方法或者使用ConcurrentHashMap)来保证线程安全。
-
null键和null值的支持:HashTable不允许key或value为null,否则会抛出NullPointerException异常;而HashMap则允许key和value为null,并将其视为特殊的键值对进行处理。
-
初始容量和加载因子:HashTable的初始容量为11,负载因子为0.75;而HashMap的初始容量为16,默认负载因子也为0.75。因此,在存储大量数据时,HashMap比HashTable具有更好的性能和扩展性。
七、ConcurrentHashMap 和 HashTable 的区别?
ConcurrentHashMap和HashTable都是Java中线程安全的哈希表实现类,但是它们之间有以下几个主要区别:
-
分段锁机制:ConcurrentHashMap采用分段锁机制,将整个哈希表分成多个段(Segment),每个段都可以独立地加锁和解锁,可以并发地进行读写操作,提高了并发性能;而HashTable则使用全局的synchronized锁来保证线程安全,所有的方法都是串行执行的,会影响并发性能。
-
null键值的支持:ConcurrentHashMap允许key和value为null,与HashMap一样;但是HashTable不允许key或value为null,否则会抛出NullPointerException异常。
八、List 和 Set 的区别是什么?
List和Set都是Java中常见的集合类型,但它们之间有以下几个主要区别:
-
元素重复性:List允许元素重复,可以按照插入顺序进行访问,支持根据索引进行快速访问、修改和删除;而Set不允许元素重复,不能根据索引进行访问,通常用于去重或判重等场景。
-
排序方式:List可以按照元素的插入顺序或者自定义排序规则进行排序;而Set不保证元素的顺序,具体顺序取决于具体实现类。
九、线程和进程的区别是什么?
1、进程:程序的一次执行过程,是系统运行程序的基本单位,启动 main 函数时其实就是启动了一个 JVM 的进程
2、线程:比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程。多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
Java中的线程池(Thread Pool)是一种用于管理和重复利用线程资源的机制
使用线程池时,需要首先创建一个ThreadPoolExecutor对象,并设置相关的参数,例如核心线程数、最大线程数、线程空闲时间、任务队列等。然后,将需要执行的任务封装成Callable或Runnable接口的实现类,提交给线程池的execute()方法或submit()方法进行执行。
线程池会根据当前的线程数量、任务队列长度等因素来决定是否创建新的线程或者重复利用现有的线程,从而避免了频繁创建和销毁线程的开销,提高了系统的并发性能和响应速度。同时,线程池还可以控制线程运行的优先级、中断等行为,提高了程序的稳定性和可维护性。
需要注意的是,在使用线程池时,需要合理设置线程池参数和任务队列大小,避免出现线程饥饿或者任务堆积等问题;同时,也需要及时关闭线程池,释放资源,避免内存泄漏或者其他意外情况。
1、string类是用final修饰,不可继承
2、char[]数组是私有且final修饰,保证value一旦被初始化,就不可改变其引用。
1)线程安全
2)节省空间——字符串常量池
通过使用常量池,内容相同的字符串可以使用同一个对象,从而节省内存空间。
十三、java与python的区别
1、Java是编译与解释并存的语言,Java的运行依赖JVM,而python是解释型语言,需要解释器一条一条翻译成机器码,因此java执行速度快
2、python是动态数据类型,java是静态数据类型,在使用变量前要声明变量的类型,而python不需要,而且数据类型是动态可变的
3、Java通常用于开发大型企业级应用,而Python主要用于数据分析、人工智能等。
4、java的多线程依赖操作系统,可以充分利用多核cpu并行执行任务,而python是伪多线程,因为Python的标准解释器具有全局解释器锁,所以python同一时间只能运行一个线程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)