Java随手记

equals和==的区别

使用基本数据类型(char,int,long等)的时候,==比较的是它们的值
使用引用数据类型的时候,比较的是地址
equals如果不重写,那么和 == 是没差别的
下面来看String的比较,这里有个浅拷贝的知识点

public class StringDemo {
   public static void main(String args[]) {
       String str1 = "Hello";
       String str2 = new String("Hello");
       String str3 = str2; // 引用传递
       System.out.println(str1 == str2); // false
       System.out.println(str1 == str3); // false
       System.out.println(str2 == str3); // true
       System.out.println(str1.equals(str2)); // true
       System.out.println(str1.equals(str3)); // true
       System.out.println(str2.equals(str3)); // true
  }
}

这里str3 = str2的时候,只是进行了一个浅拷贝,也就是把str2的地址赋给了str3,它们两个指向的堆的地方是相同的

值传递和引用传递

一句话总结:Java的参数传递,只有值传递(实际上java函数中的参数可以粗暴理解为像是c++中的指针一样)

public class TransferTest2 {
     public static void main(String[] args) {
         Person person = new Person();
         System.out.println(person);
         change(person);
         System.out.println(person);
     }

     public static void change(Person p) {
         p = new Person();
     }
 }
 class Person {

 }

上面代码两次输出都是一致的,这是因为change函数中,Person p参数接收的其实是传进来的实例的内存地址(所以说类似指针),p = new Person()也只是把这个指针指向了另一个新的地址,原来地址的数据并没有变化
在这里插入图片描述

String s = new String(“xxx”)的时候创建了几个对象

因为“xxx”是个字符串常量,所以如果这个常量不存在,会先创建“xxx”这个常量,然后把这个常量的地址给String类,创建一个新String,就创建了两个对象
如果“xxx”常量存在,就只会创建一个String对象

序列Parcelable,Serializable的区别

Serializable是Java提供的序列化机制,而 Parcelable则是Android提供的适合于内存中进行传输的序列化方式。据说Parcelable的效率是Serializable的10倍以上,不知真假

使用Serializable修饰一个类的时候,类内的成员都要实现Serializable接口,否则会报错
如果只需要在内存中进行数据传输是,序列化应该选择Parcelable,而如果需要存储到设备或者网络传输上应该选择Serializable。这是因为Android不同版本Parcelable数据规则可能不同,所以不推荐使用Parcelable进行数据持久化。

泛型和泛型擦除

无论是java还是c++,泛型都有广泛的应用,但是在jdk中,泛型的实现其实是伪泛型,也就是说在编译的时候,泛型类会被替换成Object

extends和super

? extends T为上界通配符,也就是说限制类型只能是T 或者 T 的派生类

List<? extends Fruit> plates = new ArrayList<>();
plates.add(new Apple());  //Error
plates.add(new Banana()); //Error

Fruit fruit1 = paltes.get();
Object fruit1 = paltes.get();
Apple fruit1 = paltes.get(); //Error

? super T 为通配符下界,也就是说限制类型只能是T 或者T的超类

List<? super Fruit> plates = new ArrayList<>();
Fruit fruit = plates.get(0);//Error
Apple apple = plates.get(0);//Error
Object object = plates.get(0);

plates.add(new Apple());
plates.add(new Banana());

CAS(Compare and Swap)

Jdk中java.util.concurrent.atomic包下的类都是采用CAS来实现的。
CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
例如线程1和2都要对内存地址v存的值+1,旧值为10,线程1提交更新之前,线程2已经完成了值的更新,于是v的值变成了11
这时候线程1提交更新,将v的值与旧的预期值A比较,发现11!=10,提交失败了,于是线程1重新获取内存地址v中的当前值,然后重新计算想修改的新值,再次重复一遍之前的提交-比较流程,如果这一次比较后发现没有冲突,就执行Swap,把B的值换进地址v里

volatile

能否保证线程安全

不能,假如两个线程都想对i进行i++操作,它们同时调用++方法,线程A读取i为0并计算i+1结果为1,这时线程B也调用++方法,计算i+1结果为1,然后线程A把1写回i,线程B也把1写回i,最终i只增加了1而不是期望的2

防止指令重排

jvm会对一些非原子指令进行重排,例如创建一个新对象的时候,会经历以下三个步骤
1、分配内存
2、初始化对象
3、将内存地址赋值给引用
如果2和3的顺序重排了,就会发生异常

public class SingletonClass {

 private volatile static SingletonClass instance = null;

 public static SingletonClass getInstance() {
   if (instance == null) {
     synchronized (SingletonClass.class) {
       if(instance == null) {
         instance = new SingletonClass();
      }
    }
  }
   return instance;
}
 private SingletonClass() {
}
}

这里的instance如果不加volatile关键字的话,多线程一起来getInstance就有可能会发生上面说的重排错误

volatile和synchronize的区别

volatile 只能作用于变量,synchronized 可以作用于变量、方法、对象。

volatile 只保证了可见性和有序性,无法保证原子性,synchronized 可以保证线程间的有序性、原子性和可见性。

volatile 线程不阻塞,synchronized 线程阻塞。

volatile 本质是告诉 jvm 当前变量在寄存器中的值是不安全的需要从内存中读取;sychronized 则是锁定当前变量,只有当前线程可以访问到该变量其他线程被阻塞。

volatile标记的变量不会被编译器优化, synchronized标记的变量可以被编译器优化。

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

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

相关文章

图像压缩神器:使用wxPython和Pillow快速压缩JPEG文件

导语&#xff1a; 在数字时代&#xff0c;我们经常处理大量的图像文件&#xff0c;无论是个人照片、网络图片还是工作中的设计素材。然而&#xff0c;随着图像数量的增多&#xff0c;存储和传输这些文件可能会成为一个挑战。幸运的是&#xff0c;我们可以利用Python编程和两个强…

混合测试写一写

题目 服务器IP地址规划&#xff1a;client&#xff1a;12.0.0.12/24&#xff0c;网关服务器&#xff1a;ens36:12.0.0.1/24、ens33&#xff1a;192.168.44.1/24&#xff0c;Web1&#xff1a;192.168.44.30/24&#xff0c;Web2&#xff1a;192.168.44.50/24&#xff0c;Nginx&am…

基于前后端分离技术做增删改查操作(SpringBoot+Mybatis Plus+Vue)

通过SpringBoot后端项目&#xff0c;mybatis plus&#xff0c;和前端Vue来实现前后端分离技术 第一步&#xff1a; 1、准备sql 本项目主要实现两张表的增删改查&#xff08;老师专业&#xff09;分页 CREATE TABLE teacher (id int(11) NOT NULL AUTO_INCREMENT,name varch…

日常超实用技巧(一)

目录 场景说明 mysql解决 excel解决 vscode插件解决 notepad解决 扩展解决 正则解决 自动录制宏解决 场景说明 平常在开发中有时会遇到一些字符串的规整或者格式化的操作,这点在操作数据库时经常常见,但是有的时候却有这种需求,就是我们的修改条件是某个查询条件的字…

第三方软件测评机构出具软件测试报告的流程简析

第三方软件测评机构是独立于软件开发方和需求方的第三者机构&#xff0c;负责对软件进行全面的评估和测试。独立存在使得出具的测试结果会更客观公正。相比之下&#xff0c;软件开发方进行的测评工作往往存在着主观性和局限性&#xff0c;很难全面评估软件的各个方面。 第三方…

Linux操作系统-06-进程与服务管理

使用ps命令查看进程。包括过滤进程信息 使用systemctl命令管理和运行Linux服务 进程&#xff08;Process&#xff09;&#xff1a;操作系统正在运行的应用程序。任意一个进程&#xff0c;都会消耗CPU和内存资源&#xff0c; 服务&#xff08;Service&#xff09;&#xff1a…

C# Onnx C2PNet 图像去雾 室外场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室外场景 介绍 github地址&#xff1a;https://github.com/YuZheng9/C2PNet [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing 效果 模型信息 Model P…

Docker安装Prometheus监控

环境初始化 关闭防火墙 setenforce 0 vim /etc/selinux/config ##################内部代码################### SELINUXdisabled #关闭防火墙 ############################################ 安装docker #卸载yum源之前的docker安装包 sudo yum remove docker docker-clie…

打算考PMP,需要准备什么?

PMP是什么考试&#xff1f;是PMI设立的项目管理资格认证考试&#xff0c;旨在评估和确认候选人是否具备在各种项目环境中领导和管理项目的能力。 pmp考试不算简单&#xff0c;考前也需要更详细的了解考试情况才能更好的备考。文章不是很长&#xff0c;主要是可以让你快速的了解…

TSINGSEE青犀视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的各个领域&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;AI的应用正在改变着我们的生活方式。而数据、算法和算力&#xff0c;正是构成…

IntelliJ IDEA Dev 容器

​一、dev 容器 开发容器&#xff08;dev 容器&#xff09;是一个 Docker 容器&#xff0c;配置为用作功能齐全的开发环境。 IntelliJ IDEA 允许您使用此类容器来编辑、构建和运行您的项目。 IntelliJ IDEA 还支持多个容器连接&#xff0c;这些连接可以使用 Docker Compose …

3588板子部署yoloV5

一 &#xff1a;准备 ubuntu linux X86_64系统 a.安装anaconda b.创建虚拟环境 python3.8 二&#xff1a; 下载rknn-toolkit2 传送门 unzip 解压文件夹 三&#xff1a;pt转onnx模型 四&#xff1a;onnx转rknn模型 a:cd到rknn-toolkit2-master/rknn-toolkit2/packag…

C++学习笔记:红黑树

红黑树 什么是红黑树红黑树的规则红黑树节点的定义红黑树的插入空树插入非空插入条件判断新插入的节点 cur 不为 root 且 parent->_col 为红就需要调整父节点为左 grandf->left parent当uncle节点为红色时,只需要进行颜色调整,即可当uncle为空 或 者存在但是为黑parent …

cnetos7 清理 journal 日志

journal 日志如果长时间不清理&#xff0c;会占用系统很多空间&#xff0c;所有需要清理占用过多的一些日志。 1、查看journal日志当前使用情况&#xff0c;包括占用的磁盘空间、日志数量 journalctl --disk-usage 2、清除 journal 日志中超过 100MB 大小的内容 journalctl -…

Lord 3DMCV7-AHRS 时间同步硬件触发设置

目的:通过FPGA发送脉冲触发IMU采集数据。FPGA发送脉冲时,IMU才有数据产生。 FPGA与IMU的硬件接线就不讲了,这里主要说明的是IMU的设置以及ROS驱动的config文件更改。 1. WIN上位机设置 通过IMU在WINDOWS的上位机SensorConnect对IMU的GPIO、波特率等基本功能进行设值,具体…

项目解决方案:视频监控接入和录像系统设计方案(下)

目 录 1.概述 2. 建设目标及需求 2.1建设总目标 2.2 需求描述 ​2.3 需求分析 3.设计依据与设计原则 3.1设计依据 3.2 设计原则 4.建设方案设计 4.1系统方案设计 4.2组网说明 5.产品介绍 5.1视频监控综合资源管理平台介绍 5.2视频录像服务器和存储 5.2.…

SpringController返回值和异常自动包装

今天遇到一个需求&#xff0c;在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。 例如原系统的接口 public String myIp(ApiIgnore HttpServletRequest request);返回的只是一个IP字符串"0:0:0:0:0:0:0:1"&#xff0c;目前接口…

Django入门 整体流程跑通

Django学习笔记 一、Django整体流程跑通 1.1安装 pip install django //安装 import django //在python环境中导入django django.get_version() //获取版本号&#xff0c;如果能获取到&#xff0c;说明安装成功Django目录结构 Python310-Scripts\django-admi…

噬菌体展示文库类型与应用-卡梅德生物

噬菌体展示抗体库构建的途径&#xff1a;目前主要有两种&#xff1a;一是有机合成法&#xff0c;二是基因合成法。前者是直接合成含有各种可能序列的短肽&#xff0c;构建至噬菌体载体。基因工程方法是将目的基因构建至载体&#xff0c;与噬菌体的pⅢ外壳蛋白融合表达。 卡梅德…

数据结构——堆的应用 堆排序详解

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…