Java随手记

news2024/12/23 4:34:37

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标记的变量可以被编译器优化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security自定义认证授权过滤器

自定义认证授权过滤器 自定义认证授权过滤器1、SpringSecurity内置认证流程2、自定义Security认证过滤器2.1 自定义认证过滤器2.2 定义获取用户详情服务bean2.3 定义SecurityConfig类2.4 自定义认证流程测试 3、 基于JWT实现无状态认证3.1 认证成功响应JWT实现3.2 SpringSecuri…

Kafka MQ 生产者和消费者

Kafka MQ 生产者和消费者 Kafka 的客户端就是 Kafka 系统的用户&#xff0c;它们被分为两种基本类型:生产者和消费者。除 此之外&#xff0c;还有其他高级客户端 API——用于数据集成的 Kafka Connect API 和用于流式处理 的 Kafka Streams。这些高级客户端 API 使用生产者和消…

如何保证消息的可靠传输

数据的丢失问题&#xff0c;可能出现在生产者、MQ、消费者中 生产者丢失&#xff1a; 生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题啥的&#xff0c;都有可能。此时可以选择用 RabbitMQ 提供的事务功能&#xff0c;就是生…

脚手架cli快速创建Vue2/Vue3项目

前言&#xff1a; 本文的nodejs版本是14.21.3 第一步 进入cmd窗口 1、全局安装webpack npm install webpack-g&#xff0c; npm install webpack-g 第二步 2、全局安装vue脚手架 npm install -g vue/cli 第三步 3、初始化vue项目 &#xff08;vue脚手架使用webpack模…

资料下载-嵌入式 Linux 入门

学习的第一步是去下载资料。 1. 有哪些资料 所有资料分 4 类&#xff1a; ① 开发板配套资料(原理图、虚拟机的映像文件、烧写工具等)&#xff0c;放在百度网盘 ② 录制视频过程中编写的文档、源码、图片&#xff0c;放在 GIT 仓库 ③ u-boot、linux 内核、buildroot 等比较大…

STM32CubeMX学习笔记18——FSMC(TFT-LCD屏触摸)

1.触摸屏简介 目前最常用的触摸屏有两种&#xff1a;电阻式触摸屏和电容式触摸屏 1.1 电阻式触摸屏 电阻式的触摸屏结构如下图示&#xff0c;它主要由表面硬涂层、两个ITO层、间隔点以及玻璃底层构成&#xff0c;这些结构层都是透明的&#xff0c;整个触摸屏覆盖在液晶面板上…

45、C++/基础练习20240311

一、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求 使用C风格字符串完成。 代码&#xff1a; #include <iostream>using namespace std;int main() {string buf;//定义字符串类型变量bufcout << &…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Stack容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Stack容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Stack容器组件 堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一…

软件测试需要学什么?学多久?软件测试技术进阶路线图

很多新手&#xff0c;不知道软件测试学习该如何开始&#xff0c;软件测试需要掌握哪些知识。下面是根据本人的理解&#xff0c;粗略整理的一个学习大纲&#xff0c;基本上涵盖了软件测试工程师需要掌握的全部技能&#xff0c;希望对刚入行或者准备学习测试的朋友提供一点指引。…

哈希表|1.两数之和

力扣题目链接 /*** Note: The returned array must be malloced, assume caller calls free().*/// leetcode 支持 ut_hash 函式庫typedef struct {int key;int value;UT_hash_handle hh; // make this structure hashable} map;map* hashMap NULL;void hashMapAdd(int key, i…

Qt教程 — 1.1 Linux下安装Qt

目录 1 下载Qt 1.1 官方下载 1.2 百度网盘下载 1.3 Linux虚拟机终端下载 2 Qt安装 3 安装相关依赖 4 测试安装 1 下载Qt 1.1 官方下载 通过官网下载对应版本&#xff0c;本文选择的版本为qt-opensource-linux-x64-5.12.12&#xff0c;Qt官方下载链接&#xff1a;htt…

【C++庖丁解牛】模拟实现STL的string容器(最后附源码)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.vs和g下string结构…

P5266 【深基17.例6】学籍管理题解

题目 您要设计一个学籍管理系统&#xff0c;最开始学籍数据是空的&#xff0c;然后该系统能够支持下面的操作&#xff08;不超过条&#xff09;&#xff1a; 插入与修改&#xff0c;格式1 NAME SCORE&#xff1a;在系统中插入姓名为NAME(由字母和数字组成不超过20个字符的字符…

如何使用群晖NAS结合cpolar内网穿透实现公网访问本地Office文件

文章目录 本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 本教程解决的问题是&#xff1a; 1.Word&#xff0c;PPT&#xff0c;Excel等重要文件存在本地环境&#xff0c;如何在编…

智能硬件 | AI手机是营销噱头吗?对哪些行业利好?

趁着AI浪潮&#xff0c;手机厂商争先抢滩AI手机领域&#xff0c;智能手机开始步入AI新时代。AI手机不需要借助第三方App&#xff0c;而是通过手机自身的算力&#xff0c;直接成为用户的智能助手。但手机的AI应用能有多少&#xff0c;是否只是手机厂商为促进销量的营销噱头&…

【框架设计】MVC和MVVM对比图

1. MVC&#xff08;Model-View-Controller&#xff09; 单向通信View和Model通过Controller承上启下 2. MVVM&#xff08;Model-View-ViewModel&#xff09; 数据绑定M -> VM -> V DOM事件监听 V -> VM -> M 1. MVC是单向的&#xff0c;MVVM是双向的&#xff0c;…

CUDA入门之统一内存

原文来自CUDA 编程入门之统一内存 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质…

Java——正则表达式详解

目录 Java正则表达式1、正则表达式语法1.1、基本的元字符1.2、数量元字符1.3、位置元字符1.4、特殊字符元字符1.5、回溯引用和前后查找1.6、大小写转换1.7、匹配模式 2、Java中的正则表达式2.1、概述2.2、获取匹配位置2.3、捕获组 3、匹配单个字符3.1、匹配纯文本3.2、匹配任意…

小程序对于人力资源行业的创新与变革

随着移动互联网的快速发展&#xff0c;小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说&#xff0c;开发一款定制化的小程序不仅可以提升服务效率&#xff0c;还可以增强品牌形象和用户粘性。那么&#xff0c;如何定制开发人力资源类的小程序呢&#xff1f;下面…