- 博客(22)
- 收藏
- 关注
原创 Object 有哪些常用方法?
配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥 有者,也就是具有该对象的锁。调用该方法后当前线程进入睡眠状态,直到以下事件发生。该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法,这个方法在一些具有哈 希功能的 Collection 中用到。配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是给 抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)。
2022-11-27 13:00:38
164
原创 java反射的作用于原理
2、多次创建一个类的实例时,有缓存会快很多 3、 ReflectASM工具类,通过字节码生成的方式加快反射速度 )在java中,只要给定类的名字,就可以通过反射机制来获得类的所 有信息。(1)Class:表示正在运行的Java应用程序中的类和接口 注意: 所有获取对象的信息都需要Class类 来实现。(4) 基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象。(2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限。(4)Method:提供类或接口中某个方法的信息。
2022-11-27 12:56:41
123
原创 线程、程序、进程的基本概念。以及他们之间关系是什么?
简单来说,一个进程就是一个执行中的程序,它在计算 机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空 间,文件,输入输出设备的使用权等等。从另一角度来说,进程属于操作系 统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同 时执行一个以上的程序段。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个 线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻 量级进程。
2022-11-27 12:49:37
89
原创 try里有return,finally还执行么?
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的 值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数 返回值是在finally执行前确定的;4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。2、当try和catch中有return时,finally仍然会执行;执行,并且finally的执行早于try里面的return。
2022-11-27 12:47:07
2684
原创 Java中synchronized 和 ReentrantLock 有什么不同?
在执行monitorenter指令时,首先要尝试获取对象锁。2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平 锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁 表现的性能不是很好。这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如 果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等 待,而进行线程阻塞和唤醒的代价是比较高的.
2022-11-24 14:38:02
102
原创 Java中interrupted 和 isInterruptedd方法的区别?
Java多线程的中 断机制是用内部标识来实现的,调用Thread.interrupt()来中断一个线程就会设置中断标识为true。当中断线程调用静态方法Thread.interrupted()来检查中断状态时,中断状态会被清零。无论如何,一个线程的中断状态有有可能 被其它线程调用中断来改变。interrupted() 和 isInterrupted()的主要区别是前者会将中断状态清除而后者不会。而非静态方 法isInterrupted()用来查询其它线程的中断状态且不会改变中断状态标识。
2022-11-24 14:32:59
455
原创 为什么wait和notify方法要在同步块中调用?
调用 notify()或notifyAll()方法的原因通常是,调用线程希望告诉其他等待中的线程:"特殊状态已经被设 置"。wait()方法强制当前线程释放对象锁。在调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁。因此,必须在某 个对象的同步方法或同步代码块中才能调用该对象的notify()或notifyAll()方法。1. 只有在调用线程拥有某个对象的独占锁时,才能够调用该对象的wait(),notify()和notifyAll()方 法。
2022-11-24 14:30:53
1037
原创 Thread 类中的start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的 效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start() 方法才会启动新线程。
2022-11-24 14:28:07
108
原创 Java中实现多线程有几种方法
通过继承Thread类或者实现Runnable接口、Callable接口都可以实现多线程,不过实现Runnable 接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法返回值,可以声明抛出异 常而已。这种方式下,多个线程 可以共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将 CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。缺点:因为线程类已经继承了Thread类,Java语言是单继承的,所以就不能再继承其他父类了。
2022-11-24 14:26:18
141
原创 类加载器有哪些?
3 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。2 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。1 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。4 用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实现。
2022-11-22 16:18:02
2878
原创 堆和栈的区别
3、异常错误不同 : 如果栈内存或者堆内存不足都会抛出异常。栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆 是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在 区域不连续,会有碎片。1、功能不同 : 栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变 量,还是类变量,它们指向的对象都存储在堆内存中。2、共享性不同 : 栈内存是线程私有的。4、空间大小 : 栈的空间大小远远小于堆的。
2022-11-22 16:14:42
217
原创 JVM的内存模型
1、方法区 线程共享的,用于存放被虚拟机加载的类的元数据信息,如常量、静态变量和即时编译器编译后的 代码。栈的大小决 定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机 栈大小),栈的大小可以是固定也可以动态扩展。刚创建的对象在新生代的 Eden区中,经过GC后进入新生代的S0区中,再经过GC进入新生代的S1区中,15次GC后仍存在就 进入老年代。一个线程对应一个虚拟机栈,一个虚拟机栈对应多个栈帧,每个栈帧的的入栈和出栈表示一个方法 的调用。
2022-11-22 16:11:43
257
原创 深拷贝和浅拷贝的区别是什么?
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向 被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的 对象都复制了一遍.浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指 向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.
2022-11-22 16:06:15
143
原创 Java自动装箱与拆箱
装箱就是自动将基本数据类型转换为包装器类型(int-->Integer);调用方法:Integer的 valueOf(int) 方法。拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。调用方法:Integer的 intValue方法。
2022-11-22 16:04:31
107
原创 hash冲突的解决方案
1 拉链法: 每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链 表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储.3 再哈希: 又叫双哈希法,有多个不同的Hash函数.当发生冲突时,使用第二个,第三个….等哈希函数 计算地址,直到无冲突.2 开放定址法: 一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总 能找到,并将记录存入。
2022-11-22 16:00:50
199
原创 强引用,软引用,弱引用,虚引用的区别?
虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中。可用场景: Java源码中的 java.util.WeakHashMap 中的 key 就是使用弱引用,我的理解就是, 一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。上诉所说的几类引用,都是指对象本身的引用,而不是指Reference的四个子类的引用 (SoftReference等)。可用场景: 创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建 的对象。
2022-11-22 15:57:04
329
原创 String,StringBuffer 和 StringBuilder 的区别是什么?
StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从 AbstractStringBuilder抽象类中我们可以看到他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和 StringBuilder来进行操作。另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所 以是线程安全的。从底层源码来看是一个final类型的 字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。
2022-11-22 15:49:37
132
原创 Hashcode的作用
这样一来,当 集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理 位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如 果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相 同就散列其它的地址。这种方式将集合分成若干个存储区域,每 个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的 哈希码就可以确定该对象应该存储的那个区域。前者有序可重复,后者无序不重复。
2022-11-21 14:00:55
84
1
原创 equals与==的区别
1、比较的是操作符两端的操作数是否是同一个对象。3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如: int a=10 与 long b=10L 与 double c=10.0 都是相同的(为true),因为他们都指向地址为10的堆。equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所 以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object 中的equals方法返回的却是==的判断。
2022-11-21 13:57:13
51
原创 面向对象和面向过程的区别
面向过程:字面意义上就是面向的是过程,先做什么、在做什么、最后做什 么,然后用函数把这些步骤一步一步地实现,在使用的时候一一调用则可。面向对象:字面意义上 就是面向的是对象,是把构成问题的事务分解成各个对象,但是建立对象的目的也不是为了完成一 个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向过程性能较高,所以单片机、嵌入式开发等一般采用面向过程开发。从性 能上来说,面向对象比面向过程要低。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展,可以设 计出低耦合的系统。
2022-11-21 13:53:37
197
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人