java
Pr Young
一个踏实努力,充满激情的程序员!
展开
-
代理模式 静态代理 JDK动态代理 Cglib动态代理
该方法返回一个代理对象,该对象实现了指定接口列表中的所有接口,你要执行被代理类C的function1()方法,只需要执行代理对象的function1()方法即可。下面这张图也写得挺好的:很直观的表明了代理类就是被代理类的增强和扩展。而Cglib动态代理允许代理类和被代理类都不实现接口。动态代理要求被代理类实现接口,代理类可以不实现接口。代理类不需要实现接口,被代理类还是要实现接口。被代理的类C和代理类B都要实现同一个接口。静态代理要求代理类和被代理类都实现接口。代理类B中调用代理类C中相同的方法。原创 2023-05-24 23:41:17 · 511 阅读 · 0 评论 -
try-catch-finaly
如果 try 代码块中拋出异常,并被 catch 子句捕捉,那么在拋出异常的地方终止 try 代码块的执行,转而执行相匹配的 catch 代码块,之后执行 finally 代码块。如果 try 代码块中没有拋出异常,则执行完 try 代码块之后直接执行 finally 代码块,然后执行 try catch finally 语句块之后的语句。try里面的不算数,而是执行finally中的return,也就是说:当try、catch中有return时,finally中的代码依然会继续执行。原创 2023-04-25 13:46:05 · 137 阅读 · 0 评论 -
为什么重写equals时必须重写hashCode()
如果你重写了String类的equals方法,没有重写hashcode()方法,插入HashMap中第一步判断哈希值(因为不重写的话,哈希值就等于对象地址进行哈希运算得到的整数,地址不同,哈希值就不同)就不相等,那就会认为这是两条不同key-value,也就不会进行覆盖。重写了之后,equals()比较的是对象的内容值,如果hashCode()不重写,还是比较地址的话,就会出现equals()认为两个对象相同,但是hashCode()认为两个对象不相同。哈希值不等的两个对象一定不是同一个对象。原创 2023-04-25 11:12:45 · 1179 阅读 · 0 评论 -
String类为什么被设计成final,这样设计有什么好处
设计成final的好处是:1.hashmap存String类对象作为key比存其他类的对象作为key,查找value更快当创建字符串时,它的hashcode被缓存下来(String类有一个成员变量hash,对哈希码进行了缓存),不需要再次计算,所以相比于其他对象更快其他对象中一般不会存储该对象的hashCode值,在HashMap中储存时就得需要重新计算2.减少了对象的创建字符串常量池避免了重复String对象的创建,节省了内存资源。原创 2023-03-22 11:52:36 · 573 阅读 · 0 评论 -
java三大特征之封装
当类的属性被定义成私有private,就不能直接给类的属性进行赋值,比如说person.age=10这种方式就不被允许,而是需要调用person.setAge()方法。但是如果你如果直接使用person.age=10这种方式赋值,你赋一个非法值也行。(2)隐藏了实现细节(但是会对外提供接口,让外界可以访问)也就是说,这种情形下,封装可以避免给属性赋非法值。这样当你赋一个非法值的时候,就会提示报错信息。方法是一个最基本的封装体,类也是一个封装体。(1)提高了代码的复用性。原创 2023-02-23 21:25:58 · 86 阅读 · 0 评论 -
字符串内存分配
涉及三块区域,栈,堆,常量池(在方法区)原创 2023-02-15 14:52:24 · 409 阅读 · 0 评论 -
equals和==
从源码中可以看出:如果没有重写equals方法,equals方法就是直接调用==,因此实质上与==没有差别,都是用来比较两个对象的内存地址是否相等。equals是Object类里面的方法,由于所有类都继承Object类,所以所有类都有equals方法。String类重写了equals方法,所以比较的字符串对象的内容而不是地址。总结:equals方法没有重写,就跟==一样,比较的对象的内存地址。(2) 判断两个字符串的内容是否相等:s1.equals(s2)equals是类的方法,而==只是一个操作符。原创 2023-02-15 11:11:16 · 89 阅读 · 0 评论 -
深拷贝和浅拷贝
一个类(比如下面的Person类)中有普通属性(Person类中的name属性)和对象属性(Person类中的user属性)当你person1.user.id=456,你会发现person2.user.id也等于456了、浅拷贝就是拷贝出来的对象和原对象相比:普通属性的值完全拷贝一份,对象属性。深拷贝就是拷贝出来的对象和原对象相比:普通属性的值完全拷贝一份,对象属性。,而不是指向 “原对象的对象属性指向的对象”,而是指向 “原对象的对象属性指向的对象”原创 2023-02-14 21:27:11 · 110 阅读 · 0 评论 -
HashMap和HashTable之间的区别
(1)HashMap非线程同步,HashTable是线程同步的(也就是说HashTable的安全性更高,多线程访问的时候也不会出现问题),HashMap虽然不安全,但是效率比较高,比较快。(2)HashMap允许Key-Value键值对有空值,HashTable不允许键值对有空值。(3)初始大小和扩容机制不同。原创 2023-01-24 11:24:20 · 75 阅读 · 0 评论 -
解决java int型数据本身不溢出但是相加后溢出的问题
下面这样是不行的,因为a+b+c+d已经超过了Integer.MAX_VALUE,你对他们总和进行转型也没用。单看每一个数a,b,c,d都不超出Integer.MAX_VALUE,但是四个数加起来就超过了。需要按下面这样做:单独对每一个数单独转型。原创 2022-12-21 15:35:48 · 366 阅读 · 0 评论 -
Java中三种I/O模型 BIO,NIO,AIO
UNIX 系统下, IO 模型一共有 5 种: 同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。这也是我们经常提到的 5 种 IO 模型(1)同步阻塞I/O模型 应用程序发起read调用后,一直处于阻塞状态内核开始准备数据,直到把数据拷贝到应用程序,应用程序才被唤醒(2)同步非阻塞 IO 模型 应用程序会一直发起 read 调用,避免了一直阻塞直到数据就绪了,应用程序再次发起调用的时候,应用程序才进入阻塞状态,当数据拷贝完成,应用程序才被唤醒相比于同步阻塞 IO原创 2022-12-07 09:36:34 · 573 阅读 · 0 评论 -
lambda表达式
(参数列表)->{主体}比如(1)无参型:(2)有参型原创 2022-12-06 22:58:17 · 58 阅读 · 0 评论 -
java内存模型 (Java Memory Model) JMM
volatile,synchronized,final,concurrent包这些并发处理相关的关键字,并发类底层都是基于Java内存模型。也就是说线程不是直接操作主内存的变量,而是操作属于自己的工作内存中的变量副本。(4)线程对变量的所有操作必须在私有工作内存中进行,而不能直接操作主内存。(3)线程的私有工作内存保存了该线程中用到的主内存变量的副本。(5)不同线程之间无法直接访问对方的私有工作内存中的变量。(1)所有变量都存储在主内存中,每个线程都可以访问。(2)每个线程都有自己的私有工作内存。原创 2022-12-01 16:41:31 · 159 阅读 · 0 评论 -
ConcurrentHashMap
我们说ConcurrentHashMap是用在多并发环境下的HashMapJDK1.7segment数组+HashEntry数组+链表(即两个数组+挂一个链表)上锁的时候锁的是segment数组,采用分段锁,每一把锁只锁一个Segment,默认是这个数组大小为16,所以最多可以有16个线程进行并发操作segemnt数组中的元素下面对应的是HashEntry数组(这个数组是可以扩容的)JDK1.8的ConcurrentHashMap已经和HashMap的底层数据结构很相似了。原创 2022-12-01 16:13:32 · 875 阅读 · 0 评论 -
HashMap底层数据结构,扩容机制
加载因子为0.5时,虽然不容易产生碰撞,因此不容易产生链表,所以查询的次数也更少,查询效率高,但是需要频繁进行扩容,空间利用率太低了。装填因子为1的话,会容易产生碰撞,所以很容易产生链表,这样要查询的次数就更多,所以查询的效率很低。1.8,当链表中的元素达到了 8 个时,会将链表转换为红黑树,查找的时间复杂度降为O(logN)1.7 数组+链表时,顺着链表一个一个查的时间复杂度为O(n)没有哈希冲突的元素放在数组里面, 哈希冲突的元素用链表串起来。最大的容量为2的30次方,一个很大很大很大的数。原创 2022-12-01 00:39:31 · 692 阅读 · 0 评论 -
ArrayList和LinkedList
设ArrayList的容量为Capacity,如果你ArrayList array=new ArrayList(initial_capacity),那么ArrayList的初始容量就是initial_capacity,否则就为10。添加元素时:(1)如果 元素个数+1<=Capacity,那就放心添加元素;(2)元素个数+1>Capacity,那ArrayList就发生扩容,容量Capacity变为1.5Capacity(其实是Capacity=Capacity+Capacity&g原创 2022-04-04 19:39:46 · 3037 阅读 · 0 评论 -
final、finalize 和 finally
finally:finally关键字,与try和catch一起用于异常的处理,无论try块中是否有发生异常,finally块一定会被执行。finalize()方法:垃圾收集器在确定某个对象没有引用后,调用这个对象的finalize()方法,做一些。final修饰符,可以用来修饰变量,方法,类,如果修饰变量,那么这个变量的值一旦被初始化后就不能被改变。将对象从内存中清除出去之前必要的清理工作。原创 2022-11-30 23:00:21 · 261 阅读 · 0 评论 -
对象头(Object Header)
后四个字节Klass Word表示这个对象属于哪个类(比如Student类,或者Person类)如果是数组对象,则对象头有96位,还有32位用来表示数组长度。总共八个字节,64位。原创 2022-11-04 11:57:49 · 413 阅读 · 0 评论 -
基本数据类型的包装类
基本数据类型比较简单,但是不具有对象的特性将基本数据类型封装后,就产生了包装类包装类既然是类,就有属于类的方法比如包装类的valueOf()方法就可以将基本数据类型转化为包装类的对象又比如说包装类的toString()方法,可以返回一个String对象装箱:将基本数据类型转换为包装类拆箱:将包装类转化为基本数据类型Jave支持自动装箱和自动拆箱:基本数据类型和包装类之间的区别:(以int和Integer为例)(1)Integer是int的包装类,是一个类,int则是Java的一种基本数据类原创 2022-11-03 22:31:53 · 371 阅读 · 0 评论 -
a++和++a
对于第二个++x,先自增再取值,所以先x自增x=5,然后把x取出来,最后++x=5。对于第一个x++,先取值后自增,所以先取出3,然后x自增,x=4,最后x++=3。第一步:先取值,取出来的结果记作temp,temp=10。第三步:进行赋值i=取出来的结果,也就是i=temp。第一步:先取值,取出来的结果 temp=0。++a是先进行自增,再进行取值。第三步:赋值,b=temp=0。例子1:x=3,y=4。i++是先取值,再自增。第二步:自增,i=11。第二步:自增,b=1。原创 2022-11-03 20:21:07 · 501 阅读 · 0 评论 -
如何给java文件导入外部jar包(不借助maven的方法)
step2:下载好这个jar包之后,在java文件所在的文件夹中创建一个子文件夹lib。step1:去maven reposiety中搜索jar包名字。将jar包移至这个文件夹里面,然后右键,添加为库,完事。原创 2022-10-19 10:02:13 · 1129 阅读 · 0 评论 -
八种基本数据类型
4.long:64位,有符号的整数,取值范围为-2的63次方~2的63次方-1。2.short:16位,有符号的整数,取值范围为-32768~32767(也就是-2的7次方~2的7次方-1)1.byte:8位,有符号整数,取值范围为-128~127(也就是-2的7次方~2的7次方-1)3.int:32位,有符号的整数,取值范围为-2的31次方~2的31次方-1。也就是说,占n位,那取值范围就是-2的n-1次方~2的n-1次方-1。8.boolean:1位,只有两个取值,true和false。原创 2022-10-16 13:03:44 · 1710 阅读 · 0 评论 -
第八篇:I/O流
字节缓冲流:BufferedInputStream,BufferedOutputStream。字符缓冲流:BufferedReader,BufferedOutputReader。OutputStreamWriter (输出字符流转化为输出字节流的桥梁)原创 2022-09-29 00:35:27 · 68 阅读 · 0 评论 -
第七篇:通过重写compare()方法或者compareTo()方法对集合进行自定义排序
比较依据:堆内元素对应的哈希值。原创 2022-09-29 00:04:35 · 350 阅读 · 0 评论 -
第六篇:集合常见面试题
ArrayList采用数组存储,LinkedList采用链表存储,所以ArrayList支持高速随机元素访问,LinkedList支持高速随机元素访问。在JDK1.8之前,HashMap由数组+链表组成(拉链法解决哈希冲突的时候用到链表)4.HashSet,线程不安全,底层数据结构是哈希表(HashMap)LinkedHashSet ,线程不安全,底层结构是链表和哈希表。第一组:ArrayList 和LinkedList。注意这张图里面:绿色的是接口,蓝色是实现类。第四组:HashMap和TreeMap。原创 2022-09-28 23:44:27 · 265 阅读 · 0 评论 -
第五篇文章:String,StringBuffer,StringBuilder
如果堆里面已经有一个对象保存了“abc“这个对象的地址,那就只需要在栈中创建一个对象,保存堆中对象的地址即可,所以只需要创建一个对象。如果没有,那就要创建两个对象,先在堆中创建一个对象,保存字符串的地址,然后再在栈中创建一个对象,保存堆中对象的地址,总共创建两个对象。经常会问你总共创建了几个对象,就是问栈和堆里面总共有几个对象,其实就是栈和堆里面有几个不同的地址。2.String类的对象是不可变的,可以理解为常量,是线程安全的。对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。原创 2022-09-28 17:48:18 · 306 阅读 · 0 评论 -
第四篇文章:Object类(equals方法和hashcode方法)
如果有相等的hashcode值,HashSet会通过equals方法来进一步判断这两个hashcode值相等的对象是否真的相同。将对象加入HashSet的时候,HashSet会计算出对象的hashcode值,以此来判断对象加入的位置,对象相等,哈希值一定相等,而且equals()方法比较这两个对象返回结果是true。Object类中的equals方法比较的是对象的内存地址。,比较的是对象的值(只要值相等即可,不用内存地址相同)如果两个对象哈希值不相等,两个对象一定不相等。Object类是所有类的父类。原创 2022-09-28 15:06:59 · 227 阅读 · 0 评论 -
第一篇文章:面向对象三大特征
就是将类的属性是私有的,然后为每一个私有属性创建set和get方法。方法的重载(根据参数列表的不同来区分调用不同的方法)原创 2022-09-28 11:28:00 · 55 阅读 · 0 评论 -
第二篇文章:super关键字
总结:也就是说super.function()表示调用父类的function方法。原创 2022-09-28 10:48:59 · 78 阅读 · 0 评论 -
接口的作用:更加灵活
【代码】接口的作用:更加灵活。原创 2022-09-21 09:30:21 · 181 阅读 · 0 评论 -
一个类的toString方法
功能:输出对象的描述信息。原创 2022-08-23 16:23:53 · 119 阅读 · 0 评论 -
通过反射创建对象(动态创建对象)
使用构造方法创建对象(不管是有参数还是无参数的构造方法)的方式并不灵活。原创 2022-08-23 15:37:13 · 236 阅读 · 0 评论 -
通过反射动态调用类中的方法
如果是非静态的方法,必须使用先实例化一个类的对象出来,再调用这个对象。对于类中的方法,如果是静态的方法(static),可以直接使用类名调用(即不用实例化对象)(2)调用String类的equals函数,判断两个字符串内容是否相等。(1)调用Math类的sin()函数,求出sin(1)原创 2022-08-23 15:16:00 · 388 阅读 · 0 评论 -
通过反射查看类的成员
2.使用反射机制可以在无法查看源代码的情况下查看一个类的成员。(3)成员方法(普通方法)原创 2022-08-23 13:45:42 · 78 阅读 · 0 评论 -
利用反射查看类的声明
(1)用什么修饰符修饰类:public,protect,private,abstract,static,final。(5) 类实现哪个接口。(4)类继承自哪个类。原创 2022-08-23 12:52:44 · 62 阅读 · 0 评论 -
java int型数据表数范围不关于0对称
java int型数据原创 2022-08-21 15:56:23 · 125 阅读 · 0 评论 -
计算java程序的运行时间
【代码】计算java程序的运行时间。原创 2022-08-20 16:59:18 · 150 阅读 · 0 评论 -
getBytes方法
一个中文字符占24比特,也就是3个字节(其实不同编码方式,占几个字节不一样,我们这里采取的UTF-8编码方式,具体可以看下图:)而byte[ ] byte数组里面存的就是每个字节(8位)表示的数字。所以一个英文字符(8比特)只需要1个byte数组的元素就能存下来。而一个中文字符(24比特)需要3个byte数组的元素才能存下来。字符串中的字符变成一位一位的01比特流。一个英文字符占8比特,也就是一个字节。......原创 2022-08-17 11:45:21 · 1737 阅读 · 0 评论 -
BufferedReader和BufferedWriter
所以需要通过InputStreamReader()方法将字节流转化为字符流。new BufferReader将字符流放到字符流缓冲区之中。1.BufferedReader:从缓冲区中读取内容。用了BufferedReader:可以一次性。BufferedReader,需要一个一个。2.BufferedWriter:输出数据。但是System.in得到的是字节流。............原创 2022-08-05 00:21:18 · 802 阅读 · 0 评论 -
配置jdk环境变量
比如有一个java命令如果你不配置环境变量,在命令行窗口中,你就必须先进入到这个命令所在的目录,才能使用java命令如果配置了环境变量,在命令行窗口中,不用进入目录,在任意的路径就可以直接使用java命令java -vesion查看java版本就使用了java命令......原创 2022-06-29 22:28:44 · 375 阅读 · 0 评论