Java基础
Java基础
想做产品经理的Java工程师
这个作者很懒,什么都没留下…
展开
-
1_重载和重写的区别
重载: 发生在同一个类中, 方法名必须相同,参数类型不同,个数不同, 顺序不同, 方法返回值和访问修饰符可以不同, 发生在编译时。重写: 发生在父子类中, 方法名,参数列表必须相同, 返回值范围小于等于父类, 抛出的异常范围小于等于父类, 访问修饰符范围大于等于父类; 如果父类方法访问修饰符为 private 则子类就不能重写该方法。重载重写同一个类中父子类中参数类型不同,个数不同, 顺序不同方法名,参数列表必须相同方法返回值和访问修饰符可以原创 2021-09-11 09:23:59 · 107 阅读 · 0 评论 -
2_&和&&的区别
&:逻辑与(and),运算符两边的表达式均为 true 时,整个结果才为 true。&&:短路与,如果第一个表达式为 false 时,第二个表达式就不会计算了。&&&逻辑与短路与两边的表达式均为 true第一个表达式为 false才为 true第二个表达式就不会计算...原创 2021-09-16 09:43:23 · 217 阅读 · 0 评论 -
3_面向对象的特征?
**封装** 将对象属性和方法的代码封装到一个模块中,也就是一个类中, 保证软件内部具有优良的模块性的基础,实现“高内聚,低耦合”。**抽象**: 找出一些事物的相似和共性之处,然后归为一个类, 该类只考虑事物的相似和共性之处。 抽象包括行为抽象和状态抽象。**继承**: 在已经存在的类的基础上进行,将其定义的内容作为自己的内容, 并可以加入新的内容或者修改原来的方法适合特殊的需要。**多态** 同一操作作用于不同的对象, 可以有不同的解释,产生不同的执行结果,就是多态, 简原创 2021-09-16 09:43:05 · 69 阅读 · 0 评论 -
4_Java 创建对象的方式有哪些?
1.使用 new 关键字2.使用反射机制创建对象: (1)使用 Class 类的 newInstance 方法 (2)java.lang.reflect.Constructor 类里也有一个 newInstance 方法可以创建对象。3.使用 clone 方法: 先实现 Cloneable 接口并实现其定义的 clone 方法4.使用反序列化1.使用 new 关键字2.使用反射机制创建对象:(1)使用 Class 类的 newInstance 方法(2)java.lang.refl原创 2021-09-16 09:42:52 · 77 阅读 · 0 评论 -
5_常见的数据结构有哪些?
数组集合链表列表堆栈队列数组:数组是最常用的数据结构,数组的特点是长度固定,可以用下标索引,并且所有的元素的类型都是一致的。数组常用的场景有:从数据库里读取雇员的信息存储为 EmployeeDetail[ ];把一个字符串转换并存储到一个字节数组中便于操作和处理等等。尽量把数组封装在一个类里,防止数据被错误的操作弄乱。另外, 这一点也适合其他的数据结构。列表:列表和数组很相似,只不过它的大小可以改变。列表一般都是通过一个固定大小的数组来实现的,并且会在需要...原创 2021-09-16 09:42:41 · 433 阅读 · 0 评论 -
6_成员变量和局部变量的区别?
1:成员变量直接定义在类中。 局部变量定义在方法中,参数上,语句中。 2:成员变量在这个类中有效。 局部变量只在自己所属的大括号内有效,大括号结束,局部变量失去作用域。3:成员变量存在于堆内存中,随着对象的产生而存在,消失而消失。 局部变量存在于栈内存中,随着所属区域的运行而存在,结束而释放。成员变量局部变量定义直接定义在类中定义在方法中,参数上,语句中有效在这个类中有效所属的大括号内有效存在堆内存栈内存随着对象的产生而存原创 2021-08-24 15:03:44 · 57 阅读 · 0 评论 -
7_static 关键字,是一个修饰符,用于修饰成员(成员变量和成员函数)
1、static 变量 按照是否静态的对类成员变量进行分类可分两种: 一种是被 static 修饰的 变量,叫静态变量或类变量; 另一种是没有被 static 修饰的变量,叫实例变量。 两者的区别是: 对于静态变量, 在内存中只有一个拷贝(节省内存), JVM 只为静态分配 一次内存,在加载类的过程中完成静态变量的内存分配, 可用类名直接访问(方 便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量, 没创建一个实例,就会为实例变量分配一次内存,原创 2021-08-24 15:15:54 · 185 阅读 · 0 评论 -
8_String 和 StringBuffer,StringBuilder 的区别是什么?
可变性简单的来说:String 类中使用 final 关键字字符数组保存字符串, private final char value[] ,所以 String 对象是不可变的。而 StringBuilder 与StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串 char[]value但是没有用 final 关键字修饰, 所以这两种对象都是可变的。线程安全性String 中的对象是不可变原创 2021-10-17 21:24:08 · 140 阅读 · 0 评论 -
9_自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来;拆箱:将包装类型转换为基本数据类型;装箱拆箱基本类型->引用类型包装包装类型->基本数据类型原创 2021-09-17 10:31:30 · 66 阅读 · 0 评论 -
10_== 与 equals
== : 它的作用是判断两个对象的地址是不是相等。即: 判断两个对象是不是同一个对象。 基本数据类型==比较的是值 引用数据类型==比较的是内存地址equals() : 它的作用也是判断两个对象是否相等。一般有两种使用情况情况 1:类没有覆盖 equals() 方法。 则通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象。 情况 2:类覆盖了 equals() 方法。 一般,我们都覆盖 equals() 方法来两个对象的内容相等; 若它们的内容相等,则原创 2021-09-10 14:08:18 · 50 阅读 · 0 评论 -
11_关于final 关键字的一些总结?
final 关键字主要用在三个地方:变量、方法、类。1.对于一个 final 变量, 基本数据类型的变量,则其数值一旦在初始化之后便不能更改; 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象 2. final 修饰一个类时,表明这个类不能被继承。 final 类中的所有成员方法都会被隐式地指定为 final 方法。 3.使用 final 方法的原因有两个。 第一个原因是把方法锁定,以防任何继承类修改它的含义; 第二个原因是效率。 在早期的 Java 实现原创 2021-09-10 14:08:32 · 90 阅读 · 0 评论 -
12_Java 中的异常处理?
在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable: 有两个重要的子类:Exception(异常)Error(错误)二者都是 Java 异常处理的重要子类,各自都包含大量子类。...原创 2021-09-10 14:08:49 · 37 阅读 · 0 评论 -
13_error 和 exception 的区别?
ErrorException与虚拟机相关的问题程序可以处理的异常仅靠程序本身无法恢复和和预防,建议让程序终止可以捕获且可能恢复Error 类和 Exception 类的父类都是 Throwable 类,他们的区别如下。Error 类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类 错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。Exception 类表示程序可以处理的异常,可以捕获且...原创 2021-09-10 14:08:59 · 73 阅读 · 0 评论 -
14_接口和抽象类的区别是什么
接口抽象类方法默认是 public所有方法在接口中不能有实现可以有非抽象的方法实例变量默认是 final 类型不一定一个类可以实现多个接口最多只能实现一个抽象类要实现接口的所有方法不一定不能用 new 实例化可以声明必须引用一个实现该接口的对象行为的抽象,是一种行为的规范对类的抽象,是一种模板设计1.接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非...原创 2021-09-10 14:09:10 · 94 阅读 · 0 评论 -
15_什么是单例模式?有几种?
单例模式:某个类的实例在 多线程环境下只会被创建一次出来。饿汉式: 线程安全,一开始就初始化。懒汉式: 非线程安全,延迟初始化。双检锁: 线程安全,延迟初始化。单例模式有饿汉式单例模式、懒汉式单例模式和双检锁单例模式三种。饿汉式:线程安全,一开始就初始化。懒汉式:非线程安全,延迟初始化。双检锁:线程安全,延迟初始化。...原创 2021-09-10 14:09:24 · 124 阅读 · 0 评论 -
16_手写冒泡排序
public class Sort {public static void sort() {Scanner input = new Scanner(System.in); int sort[] = new int[10];int temp;System.out.println(“请输入 10 个排序的数据:”); for (int i = 0; i < sort.length; i++) {sort[i] = input.nextInt();}for (int i = 0; i <.原创 2021-09-10 14:09:58 · 50 阅读 · 0 评论 -
17_BIO、NIO、AIO 有什么区别?
BIO: Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO, 它的特点是模式简单使用方便,并发处理能力低。NIO: New IO 同步非阻塞 IO,是传统 IO 的升级, 客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。AIO: Asynchronous IO 是 NIO 的升级,也叫 NIO2, 实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简原创 2021-09-10 14:09:44 · 59 阅读 · 0 评论 -
18_Java 集合体系有什么?
集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue) 和 map(映射)。1.Collection:Collection 是集合 List、Set、Queue 的最基本的接口。2.Iterator:迭代器,可以通过迭代器遍历集合中的数据。3.Map:是映射表的基础接口。1.Iterator 接口Iterator 接 口 是 一 个 用 于 遍 历 集 合 中 元 素 的 接 口 , 主 要 包 含hashNext(),next(),remov原创 2021-09-17 16:04:29 · 151 阅读 · 0 评论 -
19_List 的三个子类的特点?
ArrayList 底层结构是数组,底层查询快,增删慢LinkedList 底层结构是链表型的,增删快,查询慢Voctor 底层结构是数组 线程安全的,增删慢,查询慢ArrayList 底层结构是数组,底层查询快,增删慢LinkedList 底层结构是链表型的,增删快,查询慢Voctor 底层结构是数组 线程安全的,增删慢,查询慢...原创 2021-09-10 14:10:11 · 55 阅读 · 0 评论 -
20_List 和 Map、Set 的区别?
结构特点:List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;List 中存储的数据是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,Set 中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的 hashcode 决定,位置是固定的(Set 集合根据 hashcode 来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的);实现类List原创 2021-09-10 14:10:21 · 68 阅读 · 0 评论 -
21.1HashMap 底层实现原理?
HashMap根据键的 hashCode 值存储数据可以直接定位到它的值访问速度很快遍历顺序却不确定最多允许一个键为null允许多条记录的值为 null非线程安全多个线程同时写 HashMap,可能会导致数据的不一致HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值.因而具有很快的访问速度,但是遍历顺序却不确定的.HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null。H...原创 2021-09-17 11:28:48 · 87 阅读 · 0 评论 -
21.2谈一下 hashMap 中什么时候需要进行扩容,扩容 resize() 又是如何实现的?
调用场景:1.初始化数组 table2.当数组 table 的 size 达到阙值时进行扩容实现过程:<0>0通过判断旧数组的容量是否大于 0 来判断数组是否初始化过。如果小于 0:进行初始化,判断是否调用无参构造器。如果调用了无参构造器: 使用默认的大小和阙值<阈值 12.阀值=默认大小为 16 乘以负载因子 0.75。如果没有调用无参构造器: 使用构造函数中初始化的容量, 当然原创 2021-09-17 15:51:05 · 875 阅读 · 0 评论 -
22_ConcurrentHashMap 特点?
Segment 段ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些。整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分”或”一段“的意思,所以很多地方都会将其描述为分段锁。线程安全(Segment 继承 ReentrantLock 加锁)注意,行文中,我很多地方用了“槽”来代表一个 segment。简单理解就是,ConcurrentHashMap 是一个 Segment 数组,原创 2021-09-17 15:58:01 · 141 阅读 · 0 评论 -
23_HashTable?
Hashtable 是遗留类,很多映射的常用功能与 HashMap 类似,不同的是它承自 Dictionary 类,并且是线程安全的,任一时间只有一个线程能写Hashtable,并发性不如 ConcurrentHashMap,因为 ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用 HashMap 替换,需要线程安全的场合可以用 ConcurrentHashMap 替换。Hashtable 是遗留类,很多映射的常用功能与 H原创 2021-09-08 11:49:45 · 97 阅读 · 0 评论 -
24_HashMap 和 HashTable 有什么区别?
HashMapHashTable非线程安全线程安全Map 的一个实现类线程安全的一个集合键和值都允许有 null 值不允许键和值有 null 值因线程安全效率高多个线程访问时不需要自己为它的方法实现同步被多个线程访问的时候需要自己为它的方法实现同步不同步同步适合于单线程环境适合于多线程环境HashMap 是线程不安全的,是 Map 的一个实现类,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap 的...原创 2021-09-08 11:49:31 · 60 阅读 · 0 评论 -
25_HashMap,HashTable,ConcurrentHashMap 之间的区别?
性能:ConcurrentHashMap(线程安全) > HashMap > HashTable(线程安全)HashMapHashTableConcurrentHashMap非线程安全线程安全键和值都允许有 null 值不允许键和值有 null 值因线程安全效率高多个线程访问时不需要自己为它的方法实现同步被多个线程访问的时候需要自己为它的方法实现同步不同步同步适合于单线程环境适合于多线程环境Synchroniz原创 2021-09-08 11:49:14 · 64 阅读 · 0 评论 -
26_什么是线程?线程和进程的区别?
线程进程是进程的一个实体,具有一定独立功能的程序关于某个数据集合上的一次运行活动cpu 调度和分派的基本单位,比进程更小的可以独立运行的基本单位操作系统进行资源分配和调度的一个独立单位线程的划分尺度小于进程多线程程序拥有高并发性线程之间内存共享进程在运行时各自内存单元相互独立多线程编程可以拥有更好的性能和用户体验。多线程编程对于其它程序是不友好的,占据大量 cpu 资源线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比进程更小的可以...原创 2021-09-08 11:49:00 · 65 阅读 · 0 评论 -
27_创建线程有几种方式
1.继 承 Thread 类Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。2.实现 Runnable 接口如果自己的类已经 extends 另一个类,就无法直接 extends Thread,此时,可以实现一个 Runnable 接口。3.实现 Callable 接口Callabled 接口有点原创 2021-09-08 11:48:43 · 59 阅读 · 0 评论 -
28_线程的基本方法有什么?
线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。1.线程等待(wait)2.线程睡眠(sleep)3.线程让步(yield)4.线程中断(interrupt)5.Join 等待其他线程终止6.线程唤醒(notify)1.线程等待(wait)调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。2.线原创 2021-09-08 11:48:30 · 85 阅读 · 0 评论 -
29_在 java 中 wait 和 sleep 方法的不同?
waitsleep等待时会释放锁一直持有锁线程间交互暂停执行最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行。原创 2021-09-08 11:48:16 · 48 阅读 · 0 评论 -
30_线程池原理
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。线程复用:每一个 Thread 的类都有一个 start 方法。 当调用 start 启动线程时Java 虚拟机会调用该类的 run 方法。 那么该类的 run() 方法中就是调用了Runnable 对象的 run() 方法。 我们可以继承重写 Thread 类原创 2021-09-08 11:48:01 · 45 阅读 · 0 评论 -
31_线程执行的顺序?
1.当线程数小于核心线程数时, 会一直创建线程直到线程数等于核心线程数;2.当线程数等于核心线程数时, 新加入的任务会被放到任务队列等待执行;3.当任务队列已满, 又有新的任务时,会创建线程直到线程数量等于最大线程数;4.当线程数等于最大线程数, 且任务队列已满时,新加入任务会被拒绝。1.当线程数小于核心线程数时,会一直创建线程直到线程数等于核心线程数;2.当线程数等于核心线程数时,新加入的任务会被放到任务队列等待执行;3.当任务队列已满,又有新的任务时,会创建线程直到线程数量原创 2021-09-08 11:47:46 · 308 阅读 · 0 评论 -
32_线程池的核心参数有哪些?
1. 核心线程数2. 最大线程数3. 线程空闲时间4. 单位5. 任务队列容量6. 线程工厂7. 任务拒绝处理器(拒绝策略)corePoolSize = 1核心线程数maxPoolSize = Integer.MAX_VALUE最大核心线程数keepAliveTime = 60 秒线程空闲时间queueCapacity = Integer.MAX_VALUE任务队列容量allowCoreThreadTimeout = false允许核心线程超时rejectedExecuti原创 2021-09-17 10:54:55 · 111 阅读 · 0 评论 -
33_死锁产生的条件以及如何避免?
死锁产生的四个必要条件:**互斥:**一个资源每次只能被一个进程使用(资源独立)。**请求与保持:**一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁)。**不剥夺:**进程已获得的资源,在未使用之前,不能强行剥夺(抢夺资源)。**循环等待:**若干进程之间形成一种头尾相接的循环等待的资源关闭(死循环)死锁产生的四个必要条件:互斥:一个资源每次只能被一个进程使用(资源独立)。请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁)。不剥夺:进程原创 2021-09-08 11:47:26 · 124 阅读 · 0 评论 -
34_JVM 是什么,JVM 的基本结构?
JVM 是什么 虚拟机,一种能够运行 java 字节码的虚拟机JVM 的基本结构: - 类加载子系统 - 加载 .class 文件到内存。 - 内存结构 - 运行时的数据区。 - 执行引擎 - 执行内存中的.class,输出执行结果(包含 GC:垃圾收集器)。 - 本地方法的接口。 - 本地方法库。JVM 是什么虚拟机,一种能够运行 java 字节码的虚拟机JVM 的基本结构:- 类加载子系统- 加载 ...原创 2021-08-22 09:51:48 · 46 阅读 · 0 评论 -
35_JVM 内存结构?
*JDK1.7* **程序计数器** 就是一个指针,指向方法区中的方法字节码(用来存储指向下一个指令 的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个 非常小的内存空间,几乎可以忽略不计。 **Java 虚拟机栈** Java 线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行 的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出 口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程 一致。 **本地方法栈** 和栈原创 2021-08-22 09:47:46 · 41 阅读 · 0 评论 -
36_类的加载, 类加载器的种类, 类加载机制
类加载 1.加载将.class 文件从磁盘读到内存。 2.连接 2.1 验证: 验证字节码文件的正确性。 2.2 准备: 给类的静态变量分配内存,并赋予默认值。 2.3 解析: 类装载器装入类所引用的其它所有类。 3.初始化为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚 拟机默认的初始值,此处赋予的才是程序编写者为变量分配的真正的初始值,执行静态代码块。 4.使用 5.卸载 类加载器的种类 1. 启动类加载器(Bootstrap ClassLoad.原创 2021-08-22 09:41:10 · 96 阅读 · 0 评论 -
37_什么是GC
内存空间是有限的,那么在程序运行时如何及时的把不再使用的对象清除将内存释放出来,这就是 GC 要做的事。GC 的区域在哪里?JVM 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭, 栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理。因此, 我们的内存垃圾回收主要集中于 Java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。GC 的操作对象是什么?需要进行回收的对象就是已经没有存活的对象,判断一个对象是否存活常用的有两种办法:引用计数和可达分析。原创 2021-09-11 09:16:03 · 88 阅读 · 0 评论 -
38_JVM 调优的工具有哪些?
JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是jconsole和jvisualvm 这两款视图监控工具。 1.jconsole:用于对 JVM 中的内存、线程和类等进行监控; 2.jvisualvm:JDK 自带的全能分析工具, 可以分析:内存快照、线程 快照、程序死锁、监控内存的变化、gc 变化等JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是jconsole和jvisualvm 这两款视图监控工具1.jconsole:用于对 JVM 中的原创 2021-08-22 09:34:40 · 215 阅读 · 0 评论 -
39_常用的 JVM 调优的参数都有哪些?
XX 比 X 的稳定性更差,并且版本更新不会进行通知和说明。 -Xms:s 为 strating,表示堆内存起始大小。 -Xmx:x 为 max,表示最大的堆内存 (一般来说-Xms 和-Xmx 的设置 为相同大小,因为当 heap 自动扩容时,会发生内存抖动,影响程序的稳定性)。 -Xmn:n 为 new,表示新生代大小(-Xss:规定了每个线程虚拟机栈(堆栈)的大小)。 -XX:SurvivorRator=8 表示堆内存中新生代、老年代和永久代的比为 8:1:1。 -XX:Pretenu原创 2021-08-22 09:30:23 · 107 阅读 · 0 评论