自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 Java集合面试题小结(3)

LinkedList 的双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList 增删操作要影响数组内的其他数据的下标。和 ListIterator 有什么区别?

2022-09-21 21:43:38 231 1

原创 Java集合面试小结(2)

例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出ConcurrentModificationException异常,从而产生fail-fast机制。原因:迭代器在遍历时直接访问集合中内容,并且在 遍历过程中使用一个modCount 变量,集合在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量。

2022-09-16 23:45:55 337

原创 Java 集合面试题小结(1)

JDK集合框架中为我们提供了 ArrayList 的这样一个实现:CopyOnWriteArrayList。但是如果不是写少读多的场景,使用 CopyOnWriteArrayList 开销比较大,因为每次对其更新操作(add/set/remove)都会做一次数组拷贝。ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。和 Vector 的区别是什么?常用的集合类有哪些?

2022-09-15 21:26:52 398

原创 HashMap和ConcurrentHashMap区别

ForwardingNode是一种临时结点,在扩容进行中才会出现,hash值固定为-1,且不存储实际数据如果旧table数组的一个hash桶中全部的结点都迁移到了新table中,则在这个桶中放置一个ForwardingNode读操作碰到ForwardingNode时,将操作转发到扩容后的新table数组上去执行;Jdk1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点)默认桶上的节点就是Node结点。

2022-09-14 19:57:55 568

原创 hashmap和hashtable区别

hashmap和hashtable区别

2022-09-13 23:41:22 78

原创 HashMap 、LinkedHashMap 和TreeMap

HashMap 、LinkedHashMap 和TreeMap区别:LinkedHashMap 是继承于HashMap,是基于HashMap和双向链表来实现的。HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,会把Entry移动到双向链表的表尾(先删除再插入)。LInkedHashMap是线程不安全的。

2022-09-07 22:16:49 840

原创 Java ArrayList LinkedList Vector区别

LinkedList:该类实现List接口,允许有null元素,主要用于创建链表数据结构,该类没同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是创建List时候构造一个同步List.但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。LinkedList:查找效率低,添加和删除数据比较快,随机增删效率高;ArrayList:随机访问和遍历元素时,提供了更好的性能;ArrayList:为同步,在多线程的情况不适用。

2022-09-06 23:08:43 172

原创 Java 进程

阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。就绪状态(Runnable):当调用线程对象的Start()方法,线程即进入就绪状态。可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。4).synchronized关键字是非公平锁,即,不能保证等待锁的那些线程们的顺序,

2022-09-05 22:19:42 203

原创 Java哈希表和哈希冲突

public V put(K key, V value) { 以key存储value值,返回原始位置上的value值 先执行hash(key)根据key获取一个hash值, 参数2是要存储的key值,参数3是要存储的value,参数4表示如果当前位置已存在一个值 ,是否替换,false是替换,true是不替换。这种转换是一种压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。//树化阈值:即链表转成红黑树的阈值,在存储数据时,当链表长。

2022-09-01 21:37:09 345

原创 Java 集合Set和Map

​ linkedHashSet:作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历。不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。​ Hashset:作为Set接口的主要实现类:线程不安全的;无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据。​ TreeSet:可以按照添加对象的指定属性,进行排序;set存储时,初始化16长度的数组;存储无序、不可重复的数据。...

2022-09-01 19:39:51 183 1

原创 Java 复习 final和静态类方法不能被继承

1.final 用来修饰类:类不能被其他类继承例如: String System StringBuffer类。2.final 修饰方法:表明此方法不可被重写比如:Object类中getClass();3.final用来修饰变量:此时的“变量就称为是一个常量”1.final修饰属性:可以考虑赋值的位置:显示初始化、代码块中初始化、构造器中初始化2.final 修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。...

2022-08-29 18:03:36 1942

原创 Java 集合框架

Java 集合框架早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。集合框架被设计成要满足以下几个目标。该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。...

2022-08-26 22:16:27 102

原创 Java 基础 进程与线程

这些底层的同步函数操作会涉及到:操作系统用户态和内核态的切换、进程的上下文切换,而这些操作都是比较耗时的,因此重量级锁操作的开销比较大。可能获取锁时只有一个线程,或者是多个线程交替获取锁,在这种情况下,使用重量级锁就不划算了,因此引入了偏向锁和轻量级锁来降低没有并发竞争时的锁开销。调用 wait 时,节点进入`_WaitSet`链表的尾部。当线程获取锁失败进入阻塞后,首先会被加入到_cxq链表,_cxq链表的节点会在某个。当持有锁的线程释放锁后,_EntryList链表头结点的线程会被唤醒,该线程称为。

2022-08-24 21:52:31 274

原创 Java基础 进程与线程3

类的状态也就是类之间共享的变量,是存储在主内存中的,每次Java线程用到这些主内存中的变量的时候,会读一次主内存中的变量,并让这些内存在自己的工作内存中有一份拷贝,运行自己线程代码的时候,用到这些变量,操作的都是自己工作内存中的那一份。同步语句块使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令指向同步代码块的结束位置。因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于可以预测线程数量。

2022-08-24 20:41:46 114

原创 Java 进程和线程 2

锁状态的改变是根据竞争激烈程度进行的,在几乎无竞争的条件下,会使用偏向锁,在轻度竞争的条件下,会由偏向锁升级为轻量级锁,在重度竞争的条件下,会使用偏向锁,在轻度竞争的条件下,会由偏向锁升级为轻量级锁,再升级的重量级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。

2022-08-23 20:32:02 136

原创 Java 基础 进程与线程

并行与并发并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS(每秒钟处理的事务数)或者QPS(每秒钟处理的请求数)来反应这个系统的处理能力主线程线程是进程中的一个实体,用来描述进程的执行,它负责执行包括在进程的地址空间中的代码。创建一个进程的,它的第一个线程称为主线程,它由系统自动生成它是产生其他子线程的线程。

2022-08-23 20:14:12 191

原创 Java 基础(IO流 类的常用方法)续

所有Channel不应该通过构造器来直接创建,而是通过传统的节点InputStream、OutputStream 的getChannel方法来返回对应的Channel。常用的是FileInputStream、FileOutputStream的getChannel()返回的FileChannel。使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上 下文切换带来的开销。Channel中最常用的三个方法是map()、read()和write()

2022-08-22 19:58:06 163

原创 Java 基础(IO流 类的常用方法)

在多路复用IO模型中,会有一个线程(Java中的Selector)不断去轮询多个socket的状态,只有当 socket真正有读写事件时,才真正调用实际的IO读写操作。从JDK1.4开始Java引入了一系列改进的输入/输出处理的新功能,统称为NIO,即新IO,新增了许多用于 处理输入输出的类,新IO采用内存映射文件的方式处理输入输出,新IO将文件或文件的一段区域映射到 内存中,这样就可以像访问内存一样来访问文件,这种方式进行输入输出比传统的输入输出快的多。rws以读取、写入方式打开指定文件。...

2022-08-18 20:59:18 272

原创 Java基础 序列化

Java序列化就是将一个对象转化为一个二进制表示的字节数组,通过保存或则转移这些二进制数组达到持久化的目的。要实现序列化,需要实现java.io.Serializable接口。反序列化是和序列化相反的过程,就是把二进制数转化为对象的过程。在反序列化的时候,必须有原始类的模板才能将对象还原。当父类实现了Serializable接口的时候,所有的子类都序列化子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错)如果序列化的属性是对象,对象必须也能序列化,否则会报错。...

2022-08-15 19:57:40 243 1

原创 Java I/O 流 4

打印流PrintStream和PrintWriter都属于输出流,分别针对字节和字符PrintWriter 和PrintStream都提供了重载的println方法用于输出多类型数据输出引用类型,实际上是调用对象的同toString方法转换为String进行输出println表示输出后自动换行。...

2022-08-12 21:06:22 345 1

原创 Java I/O流 3

这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出 DataInputStram和DataOutputStream分别继承自InputStream和OuputStream,属于过滤流,需要分 别套接在InputStream和OutputStream类型的节点流上。如果读写的频率比 较高的时候,其性能表现不佳。缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到 缓存中的数据读取完毕,再到硬盘中读取。...

2022-08-11 21:41:54 160 1

原创 Java I/O流2

int read()读取一个字符并以整数的形式返回0-65535,如果返回-1则已到输入流末尾int read(char[] cbuf)读取一系列字符并存储到 一个数组中,返回实际读取的字符数,如果读到输入流末尾则返回-1;void close()关闭输入流并释放内存资源int read(char[] cbuf,int off,int len)读取len个字符并存到一个数组中,从off位置开始,返回实际读取的字符数,如果读取到输入流末尾则返回-1;......

2022-08-08 21:20:02 178

原创 Java IO流

Java把不同类型的输入、输出抽象为流,用统一的接口来表示Java开发环境中提供了包java.io,其中包括一系列的类来实现输入/输出处理InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。...

2022-08-07 23:30:19 100 1

原创 Java 输入输出

Input/Output: 指跨越出了JVM的边界,与外界数据的源头或者目标数据源进行数据交换Java程序会从各种地方输入数据,比如文件,磁盘,网络,其它程序中java会采用不同的方式输出执行结果,比如屏幕、文件、磁盘、网络等输入/输出是针对JVM而言课程计划和说明初步了解输入输出(IO)和流的基本概念;掌握常见的字节流和字符流的基本使用理解和使用文件与目录管理掌握文件的随机读写输入输出种的流模型。...

2022-08-04 21:25:30 489

原创 Java 基础

输入输出。

2022-08-04 00:04:25 61

原创 Java 内部类续

每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个接口的实现。方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。匿名内部类就是内部类的简写格式。方便编写事件驱动程序。内部类的使用场景和好处。......

2022-08-01 20:41:56 101 1

原创 Java 内部类

内部类一个类或者接口定义在另一个类后者接口的内部将一个类定义置入另一个类定义中,这就叫作"内部类“内部类之外的类称为外部类内部类的名称必须区别于它所在的外部类,和其它类之间没有要求内部类可以访问其外部类的所有变量和方法外部类不能直接访问内部类的实现细节内部类比外部类多了private/protected/static三个修饰符,这三个修饰符不能用在外部类上非静态内部类不能拥有静态成员内部类作用内部类提供更好的封装内部类可以直接访问外部类的私有成员外部类需构建内部类才能访问。...

2022-07-31 23:23:01 185

原创 Java 接口 续

接口中只能定义常量和抽象方法接口中只能定义公共常量,接口中的属性默认是publicstaticfinal类型的,必须是publicstaticfinal类型的接口中只能定义公共的抽象方法,只有在JDK1.8+中可以使用default关键字定义方法实现。接口中的方法默认是publicabstract类型的,而且必须是publicabstract类型的。只有在JDK1.8+中可以使用default关键字定义方法默认实现,同时允许在实现类中覆盖重新定义。...

2022-07-31 23:21:45 108

原创 Java 接口

需求需要飞到北京出差飞机、鸟和超人不能归于一个类属,但是具备有相同的特性会飞的。所以引入了一个新概念叫做接口。使用关键字interface定义接口接口不能直接使用,必须有对应的实现类通过接口定义变量,使用具体类的实例,进行调用引入接口的目的在于隔离实现使用接口而不是使用具体的类,则可以实现在实现接口的多个具体实现类之间进行更换,例如定义出超人类什么是接口在Java中不直接支持多继承,因为会出现调用的不确定性,所以Java将多继承机制进行改良,在Java中变成了多实现。没有属性,只能定义常量。...

2022-07-29 20:08:28 189

原创 Java 抽象类

面向对象编程的核心是面向抽象编程,一般依赖抽象不依赖具体包含了抽象方法的类叫作“抽象类”,所谓的抽象方法是指没有函数体的方法,抽象方法必须在子类中给出具体实现,而抽象类本身不能创建对象。如果一个类中有抽象方法则这个类一定是抽象类抽象类中可以定义的内容与普通类一样,只是可以定义抽象方法抽象类中可以没有抽象方法普通类继承抽象类必须实现抽象类中所有的抽象方法抽象类一般是用来定义规范的,该规范的实现是通过子类来实现的。...

2022-07-28 12:30:00 86

原创 Java 多态 续

针对一个类对象有两种类型,一种称之为编译期类型,编译时系统识别对象的类型,”动物x=new猫()”在编译时,系统识别x是动物类别的,所以只能调用动物类定义的方法,而不能调用猫中特殊的方法。因为子类的构造器中没有显式调用父类构造器,所以子类构造器方法中第一句是super()表示调用父类中的无参构造器,但是父类中没有无参构造器,所以报错。首先上溯子类的所有祖先类,然后再从上向下逐步执行各个层次父类的构造器Object—爷爷的构造器—父亲的构造器;执行规则new谁运行谁的方法,和声明的类型无关。......

2022-07-27 19:30:22 86 3

原创 Java 基础 多态

多态性通过允许同一界面指定一类动作减少了程序的复杂度,编译器工作就是选择适用于各个情况的特定动作,而程序员则无须手动进行选择,使用者仅仅是记得以及利用这个统一的界面。多态性是一种允许使用一个界面来访问一类动作的特性,特定的动作可以由不同的具体情况而定(传入不同的参数)。一个对象x有两种形态,猫这类事物即具有猫的形态,又具有着动物的形态,这就是对象的多态性。运行时多态JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。多态引用时,构造子类对象时的构造方法的调用顺序。...

2022-07-26 19:34:52 251

原创 Java 基础

this关键字三种用法。new关键字三种用法。

2022-07-24 22:58:00 97 1

原创 Java特殊关键字

包是类的组织方式,提供名空间和访问控制类似于文件系统的组织声明包中的类package语法package包名称声明包要求是源代码文件的第一个语句,包定义之前可以添加注释信息。程序中最多只能有一条package语句,没有包定义的源代码文件成为默认包中的一部分程序中如果有package语句,该语句必须是第一条语句包的命名规则全小写使用域名反转的方式定义。如果细分还可以引入功能定义部分。...

2022-07-23 15:17:27 165 1

原创 Java Number类

一般地,当需要使用数字的时候,我们通常使用内置数据类型,如byte、interesting、long、double等。然而,在实际过程中,我们经常遇到需要使用对象,而不是内置数据的情形。为此Java语言为一个内置数据类型提供了对应的包装类。所有包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类Number的子类。这种由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。编译器也可以把一个对象拆箱为内置类型。...

2022-07-22 17:06:42 809

原创 Java基础 构造器

构造器通常也叫构造方法、构造函数,构造器在每个项目中几乎无处不在。当你new一个对象时,就会调用构造器。

2022-07-21 22:36:16 229

原创 Java 基础 面向对象

Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如B类继承A类,C类继承B类,所以按照关系就是B类是C类的父类,A类是B类的父类,这是Java继承区别于C++继承的一个特性。继承可以使用extends和implements这两个关键字来实现继承,而且所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在java.lang包中,所不需要import)祖先类。...

2022-07-20 21:29:38 118

原创 Java 基础 面向对象(续)

4、面向对象的思想已经涉及到软件开发的各个方面,如面向对象的分析(OOA,ObjectOrientedAnalysis),面向对象的设计(OOD,ObjectOrientedDesign)、以及经常说的面向对象的编程实现(OOP,ObjectOrientedProgramming)对象是要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象是一个客观存在的、唯一的实体,是一个类的动态实例,拥有自己的标识、数据与行为。...

2022-07-19 22:28:04 148

原创 Java基础 面向对象

它能够直接反映现实生活中的事物,例如人、车、小鸟等,将其表示为程序中的对象。每个对象都具有各自的状态特征(也可以称为属性)及行为特征(方法),Java就是通过对象之间行为的交互来解决问题的。定义一个数组来存放每个月的天数(平年);在输入年份后判断是否是闰年,如果是就将arr[1]中对应2月的天数改为29;面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为。将字符串中各个符号用charAt()取出进行判断,看属于字母、数字、空格、其余。.....

2022-07-18 21:29:32 93

原创 Java基础 数组续

2.ArrayIndexOutOfBoundsException索引值越界原因访问了不存在的索引值。数组角标越界异常,注意数组的角标从0开始。现有一个小数数组{12.9,53.54,75.0,99.1,3.14}。原因引用类型变量没有指向任何对象,而访问了对象的属性或者是调用了对象的方法。Java常见排序算法有冒泡、插入、选择、快速、希尔、归并和堆7种。随机生成20个整数,使用冒泡排序,然后打印输出。快速排序O(NlogN)不稳定。冒泡排序O(n**2)稳定。...

2022-07-15 23:04:57 109

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除