Java的一些内容

transient的作用

transient是Java语言的关键字,用来表示一个成员变量不是该对象序列化的一部分。当一个对象被序列化的时候,transient型变量的值不包括在序列化的结果中。而非transient型的变量是被包括进去的。 注意static修饰的静态变量天然就是不可序列化的。 

long类型中放L和l的区别

在Java中,long 是一个基本数据类型,而 Long 是一个包装类。当你看到 1l1L,它们都是对 long 类型的常量进行字面量表示。lL 在这里只是标记,用来表示后面的数字是一个 long 类型,而不是 int 类型。

具体来说:

  • long a = 1l;Long b = 1L; 都是正确的,并且它们都表示一个 long 类型的整数常量。

  • lL 在这里没有其他区别。它们都是用来明确地表示数字是 long 类型的。

  • 使用 Long 包装类通常在需要进行null检查或者需要进行类型转换的情况下更有用。例如,当你从方法返回值中读取一个可能为null的 long 值时,使用 Long 可以更安全。

总之,1l1L 在功能上是等价的,只是风格上的选择。在Java中,通常推荐使用小写的 l 作为 long 常量的标记,因为大写的 L 可能会与数字的1混淆。

ArrayList

ArrayList实现了Serializable、RandomAccess、Cloneable、List。

  1. ArrayList的扩容机制

    1. ArrayList 是 Java 中的一个动态数组,它可以根据需要自动增长。当我们在 ArrayList 中添加元素时,如果当前容量不足以容纳新元素,ArrayList 会自动进行扩容。

      ArrayList 的扩容机制如下:

      1. 初始容量:当我们创建一个新的 ArrayList 实例时,它通常会指定一个初始容量(initial capacity)。这个容量决定了数组列表的初始大小。例如,如果我们创建一个 ArrayList 并指定初始容量为 10,那么它就会分配一个大小为 10 的数组。

      2. 自动扩容:当我们往 ArrayList 中添加元素时,如果当前容量已满,ArrayList 会自动进行扩容。扩容时,新的容量通常是旧容量的 1.5 倍(在 JDK 1.6 和 JDK 1.7 中)或两倍(在 JDK 1.8 及更高版本中)。扩容后的新数组会被复制旧数组的所有元素(使用的是Arrays.copyOf()方法)。

  2. ArrayList为什么可迭代

    1. ArrayList 是一个实现了 Iterable 接口的类,这意味着它可以被迭代。Iterable 接口是 Java 集合框架的一部分,它定义了一个方法 iterator(),该方法返回一个 Iterator 对象。Iterator 接口也定义了一些方法,如 next()hasNext(),用于遍历集合的元素。

      要理解为什么 ArrayList 是可迭代的,我们首先需要了解 IterableIterator 接口的作用。

      • Iterable 接口:这是所有集合类(如 ArrayList、LinkedList 等)应该实现的接口。它只有一个方法 iterator(),该方法返回一个 Iterator 对象。通过这个 Iterator 对象,我们可以遍历集合的所有元素。

      • Iterator 接口:它提供了一种迭代集合元素的通用机制。每个 Iterator 对象都知道如何从给定的集合中获取元素。

      当我们调用一个实现了 Iterable 接口的类的 iterator() 方法时,会返回一个 Iterator 对象。我们可以使用这个 Iterator 对象来遍历集合中的所有元素。在 Java 中,遍历集合元素通常使用 for-each 循环(也称为增强型 for 循环),这实际上就是通过 Iterator 来实现的。

  3. ArrayList实现可迭代

    1. ArrayList实现Iterable

    2. 写一个内部类实现Iterator

      public ArrayList<E> implements Iterable<E>{
          
          ...
          @Override
          public Iterator<E> iterator() {
              return new ArrayListIterator();
          }
      ​
          private class ArrayListIterator implements Iterator<E>{
      ​
              private int index;
      ​
              @Override
              public boolean hasNext() {
                  return index < size;
              }
      ​
              @Override
              public E next() {
                  if(!hasNext())
                      throw new NoSuchElementException();
                  return (E) elementData[index ++ ];
              }
          }
      }
  4. ArrayList删除元素的机制

    1. 注意System.copyarray()方法的使用

    /**
     * @description: 删除index位置的元素
     * @param: [int]
     * @return: E
     */
    public E remove(int index){
    ​
        if (!isValued(index)) {
            throw new ArrayListException("out of range");
        }
        modCount ++ ;
        E oldValue = get(index);
        int moveNum = size - 1 - index;
        if(moveNum > 0){
            //使用System.arraycopy
            System.arraycopy(elementData,index + 1,elementData,index,moveNum);
        }
        elementData[-- size] = null;
        return oldValue;
    }
final、finally、finalize

final:修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰方法时,也同样只能使用,不能在子类中被重写。 finally:通常放在try…catch的后面构造最终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。 finalize:Object类中定义的方法,Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作。

concurrentHashMap 如何保证线程同步的。

阿里面试题:ConcurrentHashMap为什么是线程安全的?_concurrenthashmap为什么线程安全-CSDN博客

jdk 1.7 时:

  1. 分段锁(Segment locking):ConcurrentHashMap将内部的数据结构分成多个段(segment),每个段维护着一个独立的哈希表。在读操作时,并不需要获取整个哈希表的锁,而是只需要获取对应段的锁。这样可以降低并发度限制,允许多个线程同时读取不同的段,从而提高读操作的并发性能。

  2. 使用volatile和CAS(Compare and Swap)操作:ConcurrentHashMap中的关键字段使用volatile修饰,保证了可见性,对于读操作不需要加锁。对于写操作,使用CAS操作来保证线程安全,通过原子方式更新数据。这样可以避免了全局锁的开销,提高了写操作的并发性能。

  3. 内部数据结构:ConcurrentHashMap使用了一种特殊的哈希表结构,即数组+链表+红黑树的结合体。当链表长度超过阈值时,会将链表转换为红黑树,提高查找、插入和删除操作的效率。这种数据结构的设计使得在单个段上的操作更加高效。

  4. 不会进行全局锁定:与Hashtable等旧版哈希表不同,ConcurrentHashMap的读操作不需要获取锁,只有在写操作时才需要进行锁定。这样可以允许多个线程同时读取数据,提高并发性能。

通过上述机制的结合,ConcurrentHashMap实现了高效的线程安全。它在读多写少的场景下,能够提供较好的并发性能,同时保障了数据的一致性和线程安全性。

jdk 1.8

jdk1.8ConcurrentHashMap是数组+链表,或者数组+红黑树结构,并发控制使用Synchronized关键字和CAS操作。下面会从源码角度讲解jdk1.8 ConcurrentHashMap控制线程同步的原理

Volatile关键字的作用

Volatile关键字的作用-CSDN博客

Volatile关键字的作用主要有如下两个:

  1. 线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

  2. 顺序一致性:禁止指令重排序。

volatile是如何保证可见性的呢? 在X86处理器下通过工具获取JIT编译器生成的汇编指令来查看对volatile进行写操作时,会多出lock addl。Lock前缀的指令在多核处理器下会引发两件事情:

将当前处理器缓存行的数据写回到系统内存。 这个写回内存的操作会使其他cpu里缓存了该内存地址的数据无效。 如果声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,就算写回到内存,如果其他处理器缓存的还是旧的,在执行操作就会有问题。所以,在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。 顺序一致性

在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。

当变量声明为volatile时,Java编译器在生成指令序列时,会插入内存屏障指令。通过内存屏障指令来禁止重排序。 JMM内存屏障插入策略如下: 在每个volatile写操作的前面插入一个StoreStore屏障,后面插入一个StoreLoad屏障。 在每个volatile读操作后面插入一个LoadLoad,LoadStore屏障。 单例模式就是一个volatile的一个例子

public class SafeDoubleCheckedLocking {
    private volatile static Instance instane;
    public  static Instance getInstane(){
        if(instane==null){
            synchronized (SafeDoubleCheckedLocking.class){
                if(instane==null){
                    instane=new Instance();
                }
            }
        }
        return instane;
    }
}

创建一个对象主要分为三个步骤:

  1. 分配对象内存空间。

  2. 初始化对象。

  3. 设置instance指向内存空间。

Volatile与Synchronized比较

  1. Volatile是轻量级的synchronized,因为它不会引起上下文的切换和调度,所以Volatile性能更好。

  2. Volatile只能修饰变量,synchronized可以修饰方法,静态方法,代码块。

  3. Volatile对任意单个变量的读/写具有原子性,但是类似于i++这种复合操作不具有原子性。而锁的互斥执行的

  4. 特性可以确保对整个临界区代码执行具有原子性。

  5. 多线程访问volatile不会发生阻塞,而synchronized会发生阻塞。

  6. volatile是变量在多线程之间的可见性,synchronize是多线程之间访问资源的同步性。

Object中常用的方法
  1. protected Object clone()--->创建并返回此对象的一个副本。

  2. boolean equals(Object obj)--->指示某个其他对象是否与此对象“相等

  3. protected void finalize()--->当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

  4. Class<? extendsObject> getClass()--->返回一个对象的运行时类。

  5. int hashCode()--->返回该对象的哈希码值。

  6. void notify()--->唤醒在此对象监视器上等待的单个线程。

  7. void notifyAll()--->唤醒在此对象监视器上等待的所有线程。

  8. String toString()--->返回该对象的字符串表示。

  9. void wait()--->导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

  10. void wait(long timeout)--->导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll()方法,或者超过指定的时间量。

  11. void wait(long timeout, int nanos)--->导致当前的线程等待,直到其他线程调用此对象的 notify()

整个集合结构

 

 

LinkeList 和 ArrayList的区别
  1. linkedList的底层是双向链表(jdk1.7之前是双向循环链表)链表实现,ArrayList的底层是Object的动态数组数组,且默认长度是10,每次扩容为原来的1.5倍。

  2. ArrayList具有随机访问的特性,所以在查和改的操作上效率很高,但是对于增和删的操作,涉及对数组的动态扩容,效率较低;LinkedList对数据的操作则都是通过指针的移动来进行的。

HashMap和HashTable的区别
  1. HashMap的底层实现(jdk1.8之后),数组 + 链表 + 红黑树,HashTable的底层实现是数组 + 链表。

  2. HashMap的key和value都可以是null,HashTable的key和value都不能是null

  3. HashMap的初始链表长度是16,到数组的使用到达 0.75 时候,会进行扩容,长度扩展二倍,HashTable的初始长度是11,扩容的为原来容量的 2倍加一。

  4. HashMap是线程不安全的,HashTable是线程安全的;如果想要保证线程安全,可以使用concurrentHashMap

创建一个线程的方式
  1. 继承Thread类创建线程

  2. 实现Runnable接口创建线程

  3. 使用Callable和Future创建线程 有返回值

  4. 使用线程池创建线程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/712892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python **运算符(python**kwargs:参数解包)(kwargs:keyword arguments)

文章目录 Python中的 ** 运算符&#xff1a;参数解包参数解包基础语法和示例 在函数定义中使用 **示例代码 使用场景和好处1. 灵活性&#xff1a;使用 **kwargs 允许函数设计得更加灵活&#xff0c;可以接受未来可能增加的新参数而无需修改函数定义。2. 可读性和可维护性&#…

C#开发-集合使用和技巧(四)集合中常用的查询方法

集合中常用的查询方法 测试数据准备&#xff1a;查询方法详解**Where**条件查询定义和注释&#xff1a;功能详细说明&#xff1a;应用实例查找所有设备类型为“生产设备”的对象 结果测试&#xff1a;查询所有测试结果大于90的设备多条件查询&#xff1a;类型为生产设备同时测试…

# RocketMQ 实战:模拟电商网站场景综合案例(六)

RocketMQ 实战&#xff1a;模拟电商网站场景综合案例&#xff08;六&#xff09; 一、RocketMQ 实战 &#xff1a;项目公共类介绍 1、ID 生成器 &#xff1a;IDWorker&#xff1a;Twitter 雪花算法。 在 shop-common 工程模块中&#xff0c;IDWorker.java 是 ID 生成器公共类…

Centos7系统下Docker的安装与配置

文章目录 前言下载Docker安装yum库安装Docker启动和校验配置Docker镜像加速卸载Docker 前言 此博客的内容的为自己的学习笔记&#xff0c;如果需要更具体的内容&#xff0c;可查看Docker官网文档内容 注意&#xff1a;以下命令在root管理员用户下运行&#xff0c;如果在普通用…

基于单片机的无线遥控自动翻书机械臂设计

摘 要&#xff1a; 本设备的重点控制部件为单片机&#xff0c;充分实现了其自动化的目的。相关研究表明&#xff0c;它操作简单便捷&#xff0c;使残疾人在翻书时提供了较大的便利&#xff0c;使用价值性极高&#xff0c;具有很大的发展空间。 关键词&#xff1a; 机械臂&…

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复&#xff0c;数据库服务器生成的一致性标志点&#xff0c;称为检查点&#xff0c;其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…

零基础入门学用Arduino 第三部分(二)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

即时聊天系统

功能描述 该项目是一个前后端分离的即时聊天项目&#xff0c;前端采用vue2、后端使用springboot以mysql8.0作为数据库。 项目功能包含了单聊、群聊功能。在此基础上增加了对好友的功能操作&#xff0c;如备注设为通知、视频聊天、语音聊天、置顶、拉入黑名单、清空聊天记录等。…

如何在两个不同的conda环境中实现jupyter notebook共同使用,避免重复下载

前提&#xff1a;有2个conda环境&#xff0c;yes和py38_pytorch 其中&#xff0c;yes已经安装了jupyter notebook;py38_pytorch没有jupyter notebook 现在&#xff0c;实现在py38_pytorch用jupyter notebook 步骤&#xff1a; 1、激活py38_pytorch conda activate py38_p…

gma 2.0.10 (2024.06.16) | GmaGIS V0.0.0a4 更新日志

安装 gma 2.0.10 pip install gma2.0.10网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

HTML5的未来:掌握最新技术,打造炫酷网页体验

引言 随着互联网技术的飞速发展&#xff0c;HTML5已经成为构建现代网页和应用的核心技术之一。HTML5不仅提供了丰富的语义化标签&#xff0c;还引入了多项前沿技术&#xff0c;使得网页体验更加丰富多彩。本文将探讨HTML5的最新技术&#xff0c;并结合行业实践&#xff0c;提供…

基础算法--双指针算法

文章目录 什么是双指针算法例题1.移动零2.复写零3.快乐数4.盛最多水的容器5.有效三角形的个数6.三数之和7.四数之和 什么是双指针算法 通常我们讲的双指针就是用两个指针&#xff0c;两个指针可以是快慢指针&#xff0c;解决成环的问题&#xff0c;也可以是指向收尾的两个指针…

快速压缩前端项目

背景 作为前端开发工程师难免会遇到需要把项目压缩成压缩文件来传送的情况&#xff0c;这时候需要压缩软件进行压缩文件处理 问题 项目中的依赖包文件非常庞大&#xff0c;严重影响压缩速度&#xff0c;即使想先删除再压缩&#xff0c;删除文件也不会很快完成 解决 首先要安…

Unity中实现ScrollRect 滚动定位到视口内

Demo链接: https://download.csdn.net/download/qq_41973169/89439428https://download.csdn.net/download/qq_41973169/89439428 一、前言 Unity版本:2020.1.x 如果需要资源请联系我我会分享给你 因为本人也要存储一下Demo所以上传到这里了但是又不能设置不需要积分 在Un…

零基础直接上手java跨平台桌面程序,使用javafx(六)查询sqlite数据显示到TableView中

我们使用jdbc查询sqlite的一个表显示到TableView中 在hello-view的onMouseClicked里面填上“openclick2”&#xff0c;然后在HelloController写上openclick2的相关代码FXML protected void openclick2() { }。我们要先配置好sqlite的jdbc驱动&#xff08;略&#xff09;。openc…

【34W字CISSP备考笔记】域1:安全与风险管理

1.1 理解、坚持和弘扬职业道德 1.1.1.(ISC)职业道德规范 1、行为得体、诚实、公正、负责、守法。 2、为委托人提供尽职、合格的服务。 3、促进和保护职业。 4、保护社会、公益、必需的公信和自信&#xff0c;保护基础设施。 1.1.2.组织道德规范 1、RFC 1087 &#xff0…

[大模型]XVERSE-7B-chat WebDemo 部署

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;参数规模为 70 亿&#xff0c;主要特点如下&#xff1a; 模型结构&#xff1a;XVERSE-7B 使用主流 Deco…

HTML静态网页成品作业(HTML+CSS+JS)——游戏天天酷跑网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片切换轮播&#xff0c;共有4个页面。 二、…

怎么找抖音视频素材?在哪里找爆款热门的素材呢?

在短视频时代&#xff0c;拍摄和分享短视频已经成为一种潮流。但是&#xff0c;许多人都会面临一个问题&#xff0c;那就是——视频素材从哪里来&#xff1f;今天&#xff0c;我将为大家介绍几个优质的网站&#xff0c;让你的视频素材不再愁。 蛙学府&#xff1a;https://www.…

自动化测试git的使用

git是一款分布式的配置管理工具。本文主要讲git如何在自动化测试中安装&#xff0c;上传及拉取下载代码。 1 、git 介绍 每天早上到公司&#xff0c;从公司的git服务器上下载最新的代码&#xff0c;白天在最新的代码基础上&#xff0c;编写新的代码&#xff0c;下班时把“代码…