一、面向对象的特性有哪些?
-
封装(Encapsulation):将数据和方法封装在一个类中,通过访问修饰符控制数据的访问权限,提高程序的安全性和可维护性。
-
继承(Inheritance):可以从父类继承属性和方法,避免重复编写代码,简化程序设计和维护。
-
多态(Polymorphism):同一种类型的对象,可以以不同的方式处理,实现代码复用和灵活性。
二、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、线程:比进程更小的执行单位,一个进程在其执行的过程中可以产生多个线程。多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
十、threadlocal关键字? 可以让每个线程都拥有一个独立的变量副本,在多线程环境下避免了变量共享和竞争的问题。 十一、线程池?Java中的线程池(Thread Pool)是一种用于管理和重复利用线程资源的机制
使用线程池时,需要首先创建一个ThreadPoolExecutor对象,并设置相关的参数,例如核心线程数、最大线程数、线程空闲时间、任务队列等。然后,将需要执行的任务封装成Callable或Runnable接口的实现类,提交给线程池的execute()方法或submit()方法进行执行。
线程池会根据当前的线程数量、任务队列长度等因素来决定是否创建新的线程或者重复利用现有的线程,从而避免了频繁创建和销毁线程的开销,提高了系统的并发性能和响应速度。同时,线程池还可以控制线程运行的优先级、中断等行为,提高了程序的稳定性和可维护性。
需要注意的是,在使用线程池时,需要合理设置线程池参数和任务队列大小,避免出现线程饥饿或者任务堆积等问题;同时,也需要及时关闭线程池,释放资源,避免内存泄漏或者其他意外情况。
标签:面试题,java,实现,可以,线程,HashTable,抽象类,方法 From: https://www.cnblogs.com/coooookie/p/17445684.html