![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 63
旋尘
x_x
展开
-
引用变量和实例对象根本区别
引用变量和对象区别Person p=new Person();//p是一个引用存在活动栈帧中是一个局部变量,引用的对象new Person()是存在堆里面的//根对象指的是堆中像newPerson一样的对象,而不是栈帧里的局部变量引用//活动线程中引用堆里的对象可作为根对象...原创 2022-03-22 11:20:13 · 596 阅读 · 0 评论 -
i++,++i的JVM底层实现
i++,++i的底层i++和++i的区别:先执行iload指令还是innc指令假如i=4,s=i++时先执行iload 1,(i在局部变量表索引22的位置),将局部变量表索引22位置的i的值4压入操作数栈然后执行引擎对i执行自增运算(innc 22,1),innc指令是在局部变量slot(槽)上进行运算的,所以局部变量表上的i=5最后执行执行istore 2(s在局部变量表索引2的位置),所以s=4.假如i=4,s=++i时首先执行引擎对i执行自增运算(innc 22,1),innc原创 2022-03-22 11:18:29 · 542 阅读 · 0 评论 -
String与StringTable串池机制,string.concat()与intern()方法底层,intern()方法jdk1.6,1.8区别
String字符串concat方法拼接String x="a";String y="b"; x.concat(y)concat源码中容易得出,concat方法通过创建一个长度为两字符串长度之和的byte数组来存放两字符串,然后将两个字符串依次放入数组中,实现了字符串的拼接。至于为什么使用byte数组,上面讲过,String类型底层使用byte数组存储char数组,因此concat使用byte数组来存储字符串,如果用其他类型的数组就要进行类型转换。注意:concat方法并不会对原对象进行原创 2022-03-22 11:11:53 · 647 阅读 · 0 评论 -
LinkdekList ArrayList添加元素的本质
LinkdekList ArrayList添加元素的本质LinkdekList ArrayList添加元素的本质是添加引用,将泛型元素E,添加进Element对象,所以它里面的元素可能会变化当我们得到一个添加好元素的链表,不想它发生改变可以用List的构造器方法,创建生成新的List,构造器内传入旧List,它会创建一个复制旧list内容的全新list,这样对旧链表增删改不会引起新链表改变 LinkedList<List<Integer>> res = new LinkedLi原创 2022-03-22 11:04:31 · 513 阅读 · 0 评论 -
JVM、JRE、JDK区别详解
JVM、JRE、JDK区别 JDK Java Virtual Machine(Java虚拟机)-java程序的运行环境,JVM是一种用于计算设备的规范(所以可以有很多种JVM,甚至可以自己开发JVM),是虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加原创 2022-03-22 11:03:21 · 1179 阅读 · 0 评论 -
java深拷贝与浅拷贝区别和特点
java深拷贝与浅拷贝实现对象拷贝的类,需要实现 Cloneable 接口,并覆写 clone() 方法。浅拷贝就是创建出一个对象后,将原类的成员变量的地址赋以新的对象的成员变量,像Object对象的clone方法就是浅拷贝深拷贝,在拷贝引用类型成员变量时,为引用类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。(1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以是直接将属性值赋值给新的对象。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样原创 2022-03-22 11:02:01 · 765 阅读 · 0 评论 -
java线程与线程池,Thread方法讲解,线程池详解
Thread的方法wait():使一个线程处于等待状态,并且释放所持有的对象的lock。(78条消息) Java对象中等待(wait)和通知(notify)_坤少_jkson的博客-CSDN博客_java waitsleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,当线程调用interrupt(),去Lock那章看详细讲解,改变中断的标志,设置为true,它会让某些正在执行特定方法抛出异常,比如说sleep(),wait(),调用此方法要捕捉InterruptedException异常。原创 2022-03-22 11:00:32 · 332 阅读 · 0 评论 -
synchronized与Lock区别,用法,性能,锁机制
synchronized与Lock不同之处用法上的不同:synchronized既可以加在方法上,也可以加载特定代码块上,而lock需要显示地指定起始位置和终止位置。synchronized是托管给JVM执行的,lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义。性能上的不同:lock接口的实现类ReentrantLock,不仅具有和synchronized相同的并发性和内存语义,还多了超时的获取锁、定时锁、等候和中断锁等。在竞争不是很激烈的情况下,synchroni原创 2022-03-22 10:58:33 · 1214 阅读 · 0 评论 -
java Lock方法解析,实现类解析,lock.lockInterruptibly()底层源码实现
LockLock是一个接口public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newConditio原创 2022-03-22 10:56:29 · 1103 阅读 · 0 评论 -
synchronized使用特性详解,synchronized实现可重入原理
synchronized详解一、应用修饰实例方法,锁是实例对象修饰静态方法,锁就是当前类的 class 对象锁静态成员不专属于任何一个实例对象,是类成员,因此通过 class 对象锁可以控制静态成员的并发操作。一个线程 A 调用一个实例对象的非 static synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的 class 对象,而访问非静态原创 2022-03-21 00:51:59 · 2635 阅读 · 0 评论 -
java锁机制详解
java锁机制1. 乐观锁 VS 悲观锁 悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重原创 2022-03-21 00:50:27 · 5969 阅读 · 2 评论 -
并发编程三个重要概念,原子性、可见性、有序性详解
并发编程三个概念1.原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 例子:银行转账 再举个最简单的例子,大家想一下假如为一个32位的变量赋值过程不具备原子性的话,会发生什么后果?i = 9;假若一个线程执行到这个语句时,我暂且假设为一个32位的变量赋值包括两个过程:为低16位赋值,为高16位赋值。那么就可能发生一种情况:当将低16位数值写入之后,突然被中断,而此时又有一个线程去读取i的值,那么读取到的就是错误的数据。原创 2022-03-21 00:48:04 · 391 阅读 · 0 评论 -
java中volatile的作用,volatile保证可见性有序性原理,volatile不保证原子性
java中volatile的作用一、保证可见性 作用:一个共享变量被volatile修饰时,它会保证将修改后的值立刻更新会主存,当有其他线程需要读取它时,它会去内存读取新值 普通的共享变量不保证可见性,普通变量被修改后什么时候写回主存是不确定的,当其他线程去读取时,内存中可能还是原来的旧值,因此无法保证可见性 synchronized和Lock也能保证可见性,synchronized和Lock能够保证同一时间内只有一个线程获取锁然后执行同步代码,然后在释放锁后将变量的修改刷新到主存中原创 2022-03-21 00:46:47 · 2884 阅读 · 3 评论 -
java多态小总结
java中多态java中多态可以分为类的多态和方法的多态类的多态:一个父类可以有多个不同子类,每个不同子类表现出不同的行为,一个子类可以赋给不同的父类(父接口),表现出不同特性方法的多态:方法的重载,同一个方法名称不同实现...原创 2022-03-21 00:43:58 · 134 阅读 · 0 评论 -
快速失败和安全失败-java面经总结
快速失败和安全失败一、快速失败(fail-fast) 在用迭代器遍历一个集合对象时,如果在遍历过程中对集合对象内容进行了修改(增加、删除、修改),迭代器会抛出ConcurrentModificationException 原理:迭代器在遍历时访问集合内容,遍历过程中使用modCount变量观测集合内容有没有改变,当集合在遍历期间内容发生变化时就会改变modCount的值。每次迭代器使用hasNext()/next()遍历下一个元素前,都会检测modCount的值是否为expectedModCoun原创 2022-03-21 00:42:02 · 231 阅读 · 0 评论 -
为什么说java中只有值传递
为什么说java中只有值传递值传递和引用传递定义值传递(pass by value):在调用函数时将实际参数复制一份(即创建副本,基本类型复制它的值,引用类型复制它的地址)传到函数中,这样对参数进行修改(这里指改变形参指向的地址),不会影响到实参(但是改变形参对象内容–指向地址内的内容,还是能够改变实参–比如说改变实参对象的属性值)引用传递(pass by reference):调用函数时将实际参数的地址(即实际对象)直接传递到函数中,那么在函数中对参数进行修改(改变它的指向,比如说指向一个new的原创 2022-03-21 00:40:54 · 519 阅读 · 0 评论 -
HashMap、LinkedMap、TreeMap底层源码分析,jdk1.7,1.8区别
Map的实现类的结构:Map:双列数据,存储key-value键值对的数据HashMap:作为Map的主要实现类;线程不安全的,效率高;可以存储null的key和value ,如果有线程安全需求,可以用Collections的方法转变为线程安全的map,一般不会用Hashtable子类-LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。原因:在原有的HashMap底层存储键值对类的结构基础上,在里面添加了一对指针,指向前一个和后一个元素。(LinkedHashSet原创 2022-03-21 00:39:18 · 709 阅读 · 0 评论 -
set底层源码原理分析jdk1.7,1.8区别-java基础
setset接口实现类: 1.HashSet:Set接口主要实现类,线程不安全,可以存储null值public HashSet() { map = new HashMap<>();}public boolean add(E e) { //private static final Object PRESENT = new Object(); return map.put(e, PRESENT)==null;} 用HashMap的key不可重复的原理达原创 2022-03-21 00:35:16 · 1575 阅读 · 0 评论 -
List源码分析-List集合jdk1.7,1.8区别
List Collection接口:单列集合,用来存储一个一个的对象List接口:存储有序,可重复的数据 1.ArrayList:list接口主要实现类,线程不安全,效率高,插入、删除麻烦,因为其它元素要前移后移 jdk7源码分析Object[] elementData;//底层存储数据的结构//空参构造器,initialCapacity-初始容量//创建长度是10的Object[] 数组public ArrayList(){ this(initialCapacity:10)原创 2022-03-21 00:33:04 · 507 阅读 · 0 评论 -
java抽象类和接口根本区别总结
java抽象类和接口区别原创 2022-03-20 23:09:13 · 316 阅读 · 0 评论 -
java基础-java面经总结-1.基础内容
java基础-java面经总结-1基础内容原创 2022-03-20 23:06:50 · 320 阅读 · 0 评论