行业网站建设深圳公司,大什么的网站建设公司好,梅州在建高铁最新消息,门户网站的发展趋势JAVA篇
基础
1、自动拆箱和装箱
装箱#xff1a;装箱是将值类型#xff08;如int、double、struct等#xff09;转换为object类型或任何接口类型的过程。由于object是所有类型的基类#xff08;在.NET中#xff09;#xff0c;并且接口是引用类型#xff0c;因此装箱…JAVA篇
基础
1、自动拆箱和装箱
装箱装箱是将值类型如int、double、struct等转换为object类型或任何接口类型的过程。由于object是所有类型的基类在.NET中并且接口是引用类型因此装箱操作实际上是在堆Heap上分配一个新的对象并将值类型的值复制到该对象中。这个新分配的对象是对原始值类型值的引用包装。
例如
Integer i 19;
原因需要将值类型作为参数传递给接受object类型或接口类型的方法
拆箱拆箱是将之前装箱的对象转换回原始的值类型的过程。拆箱操作包括检查对象是否确实包含原始值类型的值并提取该值。
int n i;
实际案例
public static void main(String[] args) { // 创建一个ArrayList来存储Integer对象 ListInteger numbers new ArrayList(); // 装箱将int值添加到ArrayList中 numbers.add(5); // 这里自动发生了装箱int - Integer numbers.add(10); // 遍历ArrayList并打印每个元素 for (Integer number : numbers) { System.out.println(number); } // 拆箱从ArrayList中获取Integer对象并作为int值处理 // 假设我们知道列表中确实存储的是int值对应的Integer对象 int firstNumber numbers.get(0); // 这里自动发生了拆箱Integer - int System.out.println(第一个数字是 firstNumber); // 注意如果尝试从一个可能包含null的ArrayList中拆箱可能会引发NullPointerException // 因此在拆箱之前进行null检查是一个好习惯 }
2、接口和抽象类
共同点都不能直接实例化接口要通过实现类抽象类要通过继承才能创建具体的对象。
区别 接口主要是为了对类的行为进行约束而抽象类是为了代码复用强调从属关系。 一个类只能继承一个类包括抽象类但是可以实现多个接口一个接口也能继承多个接口。 接口中的成员变量只能是 public static final 类型的不能被修改且必须有初始值。抽象类的成员变量可以有任何修饰符private, protected, public可以在子类中被重新定义或赋值。
3、深拷贝和浅拷贝
浅拷贝浅拷贝在堆上创建一个新的对象但是如果当前对象内部属性是引用类型的话就直接拷贝引用的地址之后创建的新对象和原对象共用一个对象。
深拷贝完全复制整个对象包括这个对象内部的对象。
4、String、StringBuffer、StringBuilder
String对象因为有final修饰符修饰所以不可变可以理解为常量线程安全。而另外2个继承自AbstractStringBuilder类没有修饰符所以可变。而且提供了一些修改字符串的方法可以使用比如append、insert这些。其中StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁所以是线程安全的。StringBuilder 并没有对方法进行加同步锁所以是非线程安全的。
集合
1、Map
HashMap的实现
JDK1.8 之前 HashMap底层是数组和链表结合在一起使用也就是链表散列。HashMap通过key的 hashcode 经过扰动函数处理过后得到hash值然后通过 (n - 1)hash 判断当前元素存放的位置这里的 n 指的是数组的长度如果当前位置存在元素的话就判断该元素与要存入的元素的 hash 值以及 key 是否相同如果相同的话直接覆盖不相同就通过拉链法解决冲突。
JDK1.8 之后改为红黑树当链表长度大于阈值默认为 8将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树时将链表转化为红黑树以减少搜索时间。
HashMap和HashTable的区别
线程安全方面table内部方法都用synchornized修饰、效率、null key和null value、底层数据结构
扩容不指定的话默认table为11扩充到2n1map默认为16扩充到2n。指定的话table直接使用指定的大小map会扩充为2的幂次。
HashMap为什么不安全Table为什么安全
因为在JDK1.8前hashmap如果在多线程情况下好几个线程同时对链表进行扩容会造成死循环。1.8之后也会有数据丢失的问题因为多个键值对被分到一个桶中采用红黑树进行存储多个线程操作可能因为时间片的问题导致同样哈希值的一个操作覆盖另一个操作结果不安全。
ConcurrentHashMap 和 Hashtable 的区别
ConcurrentHashMap1.7的时候采用分段思想segment。之后采用Node数组树的方式使用synchornized和CAS来操作。
Hashtable同一把锁synchornized效率比较低。
并发
1、CAS
全称是比较和交换通常用于乐观锁之中。乐观锁与悲观锁区别在对于共享资源访问时候不同的上锁方式悲观是默认修改每次都上锁一次只给一个线程使用。乐观锁默认不修改但是其他线程提交前需要判断是否有修改。CAS 的思想很简单就是用一个预期值和要更新的变量值进行比较两值相等才会进行更新。CAS 是一个原子操作底层依赖于一条 CPU 的原子指令。
2、ThreadLocal
想实现一个线程有自己的专属本地变量绑定自己的值。如果创建了一个ThreadLocal变量那么访问这个变量的每个线程都会有这个变量的本地副本线程使用 get() 和 set() 方法来获取默认值或将其值更改为当前线程所存的副本的值从而避免了线程安全问题。
3、线程池
降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度当任务到达时任务可以不需要等到线程创建就能立即执行。提高线程的可管理性线程是稀缺资源如果无限制的创建不仅会消耗系统资源还会降低系统的稳定性使用线程池可以进行统一的分配调优和监控。