java基础
文章平均质量分 74
拾光师
瞧一瞧,看一看,好吃还不贵。量大管饱
多年java开发经验,现征战于互联网广告行业
分享各种java相关知识,每周至少五更
展开
-
java集合之PriorityQueue详解
PriorityQueue是优先级队列,底层使用数组存储,是基于二叉堆的一个无界队列,可以使用默认排序或者提供Comparator比较器使得队列中的元素有序。根节点的元素最小是小顶堆(小于左右子节点的值)根节点的元素最大是大顶堆(大于左右子节点的值)PriorityQueue详解。还是以默认的比较器为例。以使用默认比较器为例。原创 2023-12-20 10:07:18 · 392 阅读 · 0 评论 -
java集合之hash算法
结果是31个1,而它是一个有符号数,第一位为0,所以0x7FFFFFFF表示的是01111111111111111111111111111111,hash & 0x7FFFFFFF 表示的就是取hash值的绝对值(因为hash值是一个int类型的数字,而int的取值范围是-2^31 ~ 2^31 - 1是存在负数的,所以先取绝对值得到正数),然后再与数组长度取模,来保证均匀分布。在HashMap和Hashtable中为了减少哈希碰撞,分别采用了不同的hash方法(使用的版本为JDK1.8)原创 2023-12-14 14:15:44 · 375 阅读 · 0 评论 -
如何解决hash冲突
基于线性探测法进行改进,使得其可以双向探测,d~i~=1^2^,2^2^,3^2^…在使用hash表时肯定会遇到hash冲突的情况(看你设计的hashCode如何,设计的好,冲突就少一些)对于冲突的数据,都存放到另一个溢出表中,在查找时,先在散列表中进行查找,如果没有则去溢出表中顺序查找。但是冲突再少也会存在冲突,那就需要有处理冲突的方法,下面列出来一些处理hash冲突的方法。使用不同的散列函数来进行散列,一个冲突则使用另一个,不过这样做也增加了计算的时间。原创 2023-12-18 10:11:59 · 333 阅读 · 0 评论 -
java集合之ConcurrentHashMap详解
哈希函数根据hashCode计算出哈希值,这里的hash值与HashMap的计算方式稍微有点不同,在低十六位异或高十六位之后还需要与HASH_BITS在进行与运算,HASH_BITS的值是0x7fffffff,转为二进制是31个1,进行与运算是为了保证得到的hash值为正数。CAS包含三个操作数,---内存中的值(V),预期原值(A),新值(B) 如果内存中的值和A的值一样,就可以将内存中的值更新为B。CAS是compare and swap的缩写,即我们所说的比较交换,CAS属于乐观锁。原创 2023-12-12 10:09:28 · 792 阅读 · 0 评论 -
java基础之TreeMap详解
从继承结构可以看到TreeMap除了继承了AbstractMap类,还实现了NavigableMap接口,而NavigableMap接口是继承自SortedMap接口的,所以TreeMap是可以进行排序的。TreeMap是Map接口的一个实现类,底层基于红黑树的实现,按照key的顺序存储。原创 2023-12-10 13:39:59 · 769 阅读 · 0 评论 -
java集合之HashMap详解
在计算数组下标时使用的是(n - 1) & hash来计算的,当n为2次幂时,n-1的低位将全是1,哈希值进行与操作时保证低位不变,最终得到的index结果,完全取决于key的hashCode的最后几位,从而保证分布均匀,效果等同于取模,且性能比取模高。假如HashMap到达了扩容的临界点,此时有两个线程在同一时刻对HashMap进行put操作,两个线程都会进行扩容可能会形成链表环,一旦形成环形数据结构,Entry的next节点永远不为空,使得下一次读操作出现死循环。初始大小用来规定哈希表数组的长度。原创 2023-12-08 10:21:53 · 734 阅读 · 0 评论 -
java集合之Map
HashMap如果出现hash冲突的话,会在放到链表中,但是如果hash冲突过多的话,会导致链表太长,查询时性能会下降,在链表长度超过一定值时,会进行结构改造,将链表转换为树状结构,这里TREEIFY_THRESHOLD是8。Hashtable是在java1.0中实现的最早的Map,继承自Dictionary类,底层使用的哈希表,是线程安全的,因为该类中的方法都是用了synchronized修饰,但是也因此存在了效率问题。ConcurrentHashMap是并发包下的类,属于线程安全的HashMap。原创 2023-12-06 09:56:02 · 581 阅读 · 0 评论 -
java基础之HashSet详解
HashSet是基于HashMap实现的一个单列存储的集合类,将所有的数据存在HashMap的key值中,而value全部使用一个Object对象存储。继承了AbstractSet类,实现了Set接口、Cloneable接口和Serializable接口,所以HashSet是支持克隆和序列化的。HashSet的方法实现都非常简单,直接使用封装的HashMap来操作数据,真正执行的是HashMap的方法。原创 2023-12-04 10:37:54 · 588 阅读 · 0 评论 -
LinkedList详解
LinkedList使用的迭代器是其父类AbstractSequentialList中的iterator方法,其迭代器是双向的,可以正向也可以反向。继承了AbstractSequentialList,实现了List接口、Deque接口、Cloneable接口、Serializable接口。以java8为例来了解一下LinkedList的源码实现。LinkedList是List接口的一个主要的实现类之一,基于。LinkedList的remove方法比较。LinkedList详解。原创 2023-12-02 14:10:11 · 656 阅读 · 0 评论 -
ArrayList详解
由于ArrayList的默认初始值为10,扩容为1.5倍,如果集合中所需要存储的元素数量多的话,需要进行多次扩容,重新申请内存并进行赋值,比较耗时,所以如果在进行实例化时指定初始容量,可以减少扩容次数,提升性能。ArrayList是线程不安全的,并发情况下可能会导致ArrayIndexOutOfBoundsException,在扩容时,由于没有锁的保护,导致一个线程访问到了另一个线程的不一致状态,导致越界。List中使用最多的就是ArrayList,基本上大家在实例化一个List的时候都是。原创 2023-11-30 10:06:28 · 539 阅读 · 0 评论 -
java基础之集合概览
HashMap在Map.Entry静态内部类实现存储键值对,HashMap使用哈希算法,在put和get方法中,使用hashCode和equals方法,使用put方法时,使用key的hashcode和哈希算法来找出存储键值对的索引,Entry存储在LinkedList中,如果存在entry,使用equals检查传递的key是否存在,如果存在,会覆盖掉value,如果不存在,会创建一个新的entry然后保存。元素必须定义hashCode()和equals()方法,遍历元素时,会按照添加的进去的顺序。原创 2023-11-28 10:02:00 · 1137 阅读 · 0 评论 -
JDBC获取元数据
描述结果集的元数据,可以得到结果集的基本信息,可以得到结果集中有哪些列,列名,列的别名。DatabaseMetaData描述数据库的元数据,可以得到数据库本身的一些信息。原创 2023-11-26 13:24:09 · 202 阅读 · 0 评论 -
JDBC操作事务
REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读仍存在(Mysql默认的事务隔离级别)SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可以避免,但是性能低下。脏读 对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取到的内容就是临时无效的。原创 2023-11-24 10:16:45 · 260 阅读 · 0 评论 -
JDBC基本操作
在使用该PreparedStatement执行插入操作时,可以使用statement.getGeneratedKeys()来返回一个新生成主键的ResultSet对象,结果集中只有一列GENERATED_KEY,存放的新生成的主键值。JDBC是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口,定义了用来访问数据库的标准的Java类库。该接口为Statement的子接口,属于预处理操作,可以传入带有占位符的SQL,然后再进行补充占位符,索引值从1开始。executeUpdate方法。原创 2023-11-22 10:19:30 · 452 阅读 · 0 评论 -
函数式编程
3、类::实例方法,指向任意类型实例方法的方法引用 当lambda表达式第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,可以使用。方法引用其实也是lambda表达式,要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同。lambda表达式,由箭头->分隔开参数和函数体,箭头左边是参数,右边是lambda返回的表达式,即函数体。java8的方法引用,由::区分,在::左边是类或对象的名称,在::的右边是方法的名称,但是没有参数列表。Supplier 供给型接口。原创 2023-11-20 10:27:13 · 88 阅读 · 0 评论 -
java Stream操作
https://zhhll.icu/2020/java基础/java8/1.java Stream操作/](https://zhhll.icu/2020/java基础/java8/1.java Stream操作/)Stream又称为流,可以将集合转换为一种流,对集合中的每个元素进行一系列的流式操作,流并不存储元素,对流的操作也不会修改数据源。像count()、max()、min()、sum()这些内部其实也是使用的reduce。数据源 ------转换为--》流----》进行中间操作----》终止操作。原创 2023-11-17 10:29:04 · 161 阅读 · 0 评论 -
反射之Type类
Type getOwnerType() 返回的是类型所属的类型,这个所属类型就像是 Map.Entry的所属类型是MapType[] getActualTypeArguments() 获取参数化类型的类型变量或是实际类型列表,如List。D getGenericDeclaration() 获取声明该类型变量的原始类型,例如class Test。Type getRawType() 返回参数化类型中的原始类型,如List。Type接口是所有类型的父接口,有四个子接口和一个实现类。原创 2023-11-15 11:46:34 · 95 阅读 · 0 评论 -
一文搞定反射基本API
Java提供反射来在运行时状态下动态的获取类的属性、方法等信息,在框架中很多地方都应用到了反射。获取Class对象的四种方式。原创 2023-11-13 10:32:59 · 123 阅读 · 0 评论 -
java网络IO
服务器端也是如此,在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待,直到服务器端的处理线程线程上一个请求的处理。同步和非同步是操作系统级别的,主要描述操作系统在收到程序请求网络IO操作后,如果网络IO资源没有准备好,该如何响应程序。同一时间,服务器只能接收一个客户端的请求信息,第二个客户端需要等待服务器接收完第一个请求数据后才会被接收。阻塞和非阻塞是程序级别的,主要描述程序请求操作系统IO操作后,如果网络IO资源没有准备好,程序如何处理。同步IO不响应程序,直到网络IO资源准备好。原创 2023-11-08 10:08:31 · 225 阅读 · 0 评论 -
java如何使用zip压缩
zip文档可以以压缩格式存储一个或多个文件,可以使用ZipInputStream读取Zip文档,使用ZipOutputStream来写入到Zip文件中。ZipOutputStream写入。ZipInputStream读取。原创 2023-11-06 10:13:11 · 138 阅读 · 0 评论 -
NIO基本操作
从buffer中读取数据,由于切换为读模式时,limit为写入的position值,所以使用buf.limit就可以获取到写入的数据长度,读取时会根据读的数据来更新position值,标记读取的位置。NIO的缓冲区(字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区就是只可以读,直接缓冲区是为了加快I/O速度,以一种特殊的方式分配其内存的缓冲区。但是一个缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。在写入数据时,它是写入到缓冲区的。原创 2023-11-03 10:37:37 · 187 阅读 · 0 评论 -
java基础之IO操作
flush()方法用来强制要求OutputStream对象将暂存于内部缓冲区的数据立即进行实际的写入(一般情况下不需要手动的调用该方法,在内部缓冲区填充满了之后,会自动执行实际的写入操作,在调用close()方法时也会自动调用flush()方法)注意:该方法可能在向后移动的时候,没有达到指定字节就到达了流的末尾,所以并不一定会跳过指定的字节,该方法返回值为实际跳过的字节数。主要的方法是writeObject,存储对象的类、类的签名以及这个类及其父类中所有非静态和非瞬时的字段的值。原创 2023-11-01 10:32:24 · 91 阅读 · 0 评论 -
java基础之注解
Retention 表示注解信息保存的生命周期 SOURCE(注解被编译器丢弃)、CLASS(注解在class文件中可用,会被VM丢弃)、RUNTIME(VM在运行期也保留注解,可通过反射机制读取注解的信息)注解处理器用来处理注解进行工作,对于RUNTIME的注解可以在运行期操作,可以使用反射,而SOURCE和CLASS就只能在注解处理器Processor来操作了。注解处理器项目需要添加maven插件 该项目编译时不加载注解处理器,不然会报错。准备使用注解处理器修改源文件,之后再研究。原创 2023-10-30 09:55:54 · 86 阅读 · 0 评论 -
java基础之泛型
泛型是在JDK1.5增加的功能,在没有泛型之前,从集合中取出来的每一个对象都必须进行强制类型转换,如果有人插入了错误类型的对象,在运行时的转换就会出现问题,有了泛型之后,这些问题就会在编译期暴露出来。可以对泛型的类型变量进行上下限的限定,使用extends来进行上限的限定,使用super来进行下限的限定。通常使用E表示集合的元素类型,K和V分别表示表的关键字和值的类型,T表示任意类型。在编译期间检测类型,避免了运行期出现的ClassCastException。在运行时不会产生类型检查的字节码指令。原创 2023-10-28 17:07:06 · 221 阅读 · 0 评论 -
java基础之异常
checked异常,编译时异常,是由于编程与环境互动造成程序出错,如果出现此类异常,需要手动捕获处理,否则不能通过编译,如IOException、MalformedURLException、ClassNotFoundException等。当异常发生时,该线程会暂停,逐层退出方法调用,直到遇到异常处理器,异常处理器可以catch到异常对象,进行相应的处理。throw关键字用在方法内部,只能用于抛出一种异常,用来抛出一种异常,用于抛出方法或代码块中的异常。throw和throws。原创 2023-10-26 13:21:26 · 68 阅读 · 0 评论 -
java基础之你所不知道的字符串
在jdk6+中,当调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用,否则,如果该字符串对象已经存在于java堆中,则将堆中此对象的引用添加到字符串常量池中,并且返回该引用;其在jdk6中,当调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用,否则,将此字符串对象添加到字符串常量池中,并返回该字符串对象的引用。在使用字符串拼接之后生成的字符串如果调用intern()方法,就会返回该字符串所对应的常量池中字符串的地址值。原创 2023-10-22 11:39:06 · 99 阅读 · 0 评论 -
java基础之final关键字
当编译器看到final方法调用时,可以根据自己的判断,略去一般通过方法调用机制插入代码的方式。类中所有的private方法都是隐式的指定为final,因为不能访问private方法,所以不能重写它。使用final关键字修饰的变量会被认为是常量,final修饰的成员变量必须要进行初始化,任何在程序中试图改变常量值的操作,都会导致编译错误。final方法会告诉编译器对于final方法的调用不需要动态绑定,在运行时,不需要进行解析方法调用。final方法的作用是防止子类通过重写改变方法的行为。原创 2023-10-20 10:52:57 · 77 阅读 · 0 评论 -
java操作时间的方式
java操作时间的方式。时间格式化中的字符含义。原创 2023-10-18 10:25:35 · 97 阅读 · 0 评论 -
java基础之内部类
在创建成员内部类对象时,它会与创建它的外围对象有某种联系隐式引用(内部类对象会秘密的捕获一个指向外部类的引用,通过这个引用可以用来访问外部类的成员),通过这个隐式引用可以访问外部类的所有成员。静态内部类,内部类对象与外部类对象之间没有联系,将内部类声明为static,普通的内部类对象隐式的保存了一个引用,指向创建它的外部类对象,当内部类是static的时候,意味着。内部类是一种较为特殊的类形式,定义在另一个类中的类,叫做内部类,是主类的一部分,可以把一些逻辑相关的类组织在一起,并控制位于内部的类的可见性。原创 2023-10-16 09:55:30 · 75 阅读 · 0 评论 -
java基础之数组
数组的本质是一个相同数据类型的元素集合。元素是数组的组成部分,数组中每一个元素都可以使用唯一的索引值来访问,这个索引值也可以叫做数组下标。上面说的数组是一个一维数组,java可以构建多维数组,其实本质上来说还是一维数组,只是数组中的元素存储的还是数组而已。由于第二个索引代表的是该索引位置对应的一维数组,每个索引下的数组长度不同时就是非矩形数组。静态初始化是指在初始化数组时为数组的每个元素赋值,由元素的个数来决定数组的长度。在进行数组初始化时,有静态初始化和动态初始化两种方式。注意:数组的索引是从0开始的。原创 2023-10-14 12:31:18 · 114 阅读 · 0 评论 -
java基础之接口和抽象类
抽象类可以包含实例变量,可以是public的也可以是private的,且可以包含非final的,非抽象方法可能引用这些变量。接口中的所有方法隐式为抽象的(java8出现了默认方法,为非抽象的);默认方法允许在不破坏已使用接口的代码的情况下,在接口中新增方法,必须用default修饰符来修饰方法。在java8之前的接口只允许有抽象方法,是一个完全抽象的类,没有提供任何实现。在java8之前只能有抽象方法,java8之后可以有默认方法和静态方法。抽象类中可以包含具体的方法,当然也可以不包含抽象方法。原创 2023-10-12 14:17:14 · 61 阅读 · 0 评论 -
java基础之重载与重写
必须符合以上两点的原因是因为多态的机制,在使用子类对象指向父类引用时,调用父类的方法被认为是合法的,但是如果子类的访问权限比父类小,或者子类抛出的异常比父类多,这在编译上是不允许的,与多态机制是矛盾的。重写是指子类中的方法与父类中的某个方法名称和参数完全相同,通过子类创建的实例对象将父类中的这个方法覆盖掉,是面向对象多态性的一种表现。java中父类和子类中如果有相同的字段的话,会进行字段隐藏,字段是没有进行动态绑定的,在哪里被调用,就返回对应值。只能比父类抛出更少的异常,或者抛出父类抛出异常的子异常。原创 2023-10-10 12:13:42 · 103 阅读 · 0 评论 -
java基础之组合和继承
field被分配了不同的存储空间,Child其实是存在两个filed属性的:本身的以及父类的,但是在引用Child的field的时候,默认的field属性是来自于本身的,如果要获取父类的该实例变量,需要使用super.field来显示地指定获取父类实例变量。java采用后期绑定,在运行时根据对象的类型进行绑定,在运行时判断对象的类型,从而调用方法,在编译时编译器不知道对象的类型,由于每次调用方法都要进行搜索,时间开销较大,所以虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。原创 2023-10-08 10:29:22 · 70 阅读 · 0 评论 -
java基础之对象
对象引用存储在栈内存中,但对象保存在堆内存中。创建一个对象时,只需new关键字实例化对象,执行代码时,会自动在堆中进行内存分配。boolean、char、byte、short、int、long、float、double这些都是基本数据类型,基本数据类型不需要使用new关键字来创建对象,直接存储值,存储在栈内存内。这些存储的方式是将对象转存于另一个介质中,并在需要时恢复成常规的、基于RAM的对象。上例中,引入了一个新的类型,我们可以通过new关键字来创建一个这种类型的对象,创建对象的过程称为类的实例化。原创 2023-10-03 07:27:11 · 72 阅读 · 0 评论 -
java基础之访问权限
如 java的util包下有一个类是ArrayList ,在使用这个类的时候需要java.util.ArrayList来使用,但是这种写法太过于长,所以使用import关键字。从最大访问权限到最小访问权限依次是:public、protected、包访问权限(default)、private。protected 本类、同包中的类以及子类可以访问。包内包含一些类,被组织在一个单独的命名空间下。private 只能由本类中的代码进行访问。default 本类或者同包中的类可以访问。类的全名是包名+类名。原创 2023-10-05 20:32:28 · 52 阅读 · 0 评论 -
java基础之初始化顺序
的值是一个编译期常量的话(如Initable1.COUNT),获取这个值时不需要对Initable1进行初始化就可以读取,如果用static final的值不是一个编译期常量(如Initable.COUNT),访问这个变量会强制对该类进行初始化。在创建任何java对象时,都是依次调用父类非静态初始化块、父类构造器执行初始化、本类的非静态初始化块、本类构造器执行初始化。注意:如果没有显式的编写构造器的话,java编译器会默认提供一个无参构造器,但是如果提供了自己的构造器,编译器将不会再生成默认构造器。原创 2023-10-06 14:09:35 · 135 阅读 · 0 评论 -
java基础之构造器
注意:在构造器中的第一条语句要么是调用父类的构造器(使用super()),要么是调用本类中的另一个构造器(使用this());每一个java类中都必须至少有一个显式或隐式的构造器,很多时候看到类中并没有定义构造器,有人会认为构造器不是必须的,其实那是编译器隐式的提供了一个无参构造器,否则在进行实例化的时候就无法成立。如果父类中只有一个有参构造器,而没有无参构造器的话,就需要子类必须提供一个构造器去显式的调用父类的有参构造器方法,否则就会出现编译错误。原创 2023-10-04 09:50:56 · 204 阅读 · 0 评论 -
java zip压缩
原文链接 [https://zhhll.icu/2022/java基础/IO/3.zip压缩/]## zip压缩zip文档可以以压缩格式存储一个或多个文件,可以使用ZipInputStream读取Zip文档,使用ZipOutputStream来写入到Zip文件中原创 2022-04-26 10:42:11 · 1283 阅读 · 1 评论 -
java异常
原文链接 [https://zhhll.icu/2020/java基础/面向对象/13.java基础之异常/]## 异常当异常发生时,该线程会暂停,逐层退出方法调用,直到遇到异常处理器,异常处理器可以catch到异常对象,进行相应的处理原创 2022-04-22 14:27:04 · 489 阅读 · 1 评论 -
java字符串
原文链接 [https://zhhll.icu/2020/java基础/面向对象/12.java基础之字符串/]String是一个final修饰的不可变类,其属性也是final的,底层使用char数组存储原创 2022-04-21 15:56:35 · 251 阅读 · 1 评论