Java对象的创建方式以及对象的引用

news2024/10/7 6:39:21

日子就是这么的庸常,却有细碎的事物,如太阳碎碎的光芒,洒落其上
在这里插入图片描述

Java创建对象有几种方式

new创建新对象

new创建我们就很熟悉了,像Person p = new Person();等等

通过反射机制

这种创建对象的方式就是当我们编译时不知道要创建什么对象时,只有在运行时才能确定,这个时候就可以通过反射来创建对象

采用clone机制

clone复制机制一般分为浅拷贝和深拷贝

  • 浅克隆:原对象和克隆对象不同,但对象内的成员引用相同

  • 深克隆:原对象和克隆对象不同,且对象内的成员引用也不同

    不同:不是同一个对象,所占内存地址不同

    成员引用:类中为引用类型的成员

通过序列化机制

“序列化”是一种把对象的状态转化成字节流的机制,“反序列”是其相反的过程,把序列化成的字节流用来在内存中重新创建一个实际的Java对象。这个机制被用来“持久化”对象。通过对象序列化,可以方便的实现对象的持久化储存以及在网络上的传输

Java对象的引用----强软弱虚

  • 强引用

    强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:

    String str = new String("str");
    System.out.println(str) // str
    
  • 软引用

    软引用在程序内存不足时,会被回收,使用方式:

    // 注意:wrf这个引用也是强引用,他是指向SoftReference这个对象的
    // 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中的T
    SoftReference<String> wrf = new SoftReference<String>(new String("str"));
    

    可用场景:创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象

  • 弱引用

    弱引用就是只要JVM垃圾回收器发现了它,就会回收,使用方式:

    WeakReference<String> wrf = new WeakReference<String>(str);
    

    可用场景: Java源码中的 java.util.WeakHashMap 中的 key 就是使用弱引用,我的理解就是,一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。

  • 虚引用

    虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中。注意 哦,其它引用是被JVM回收后才被传入 ReferenceQueue 中的。由于这个机制,所以虚引用大多 被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有 ReferenceQueue , 使用例子:

    PhantomReference<String> prf = new PhantomReference<String>
      (new String("str"),new ReferenceQueue<>());
    

    可用场景: 对象销毁前的一些操作,比如说资源释放等。 Object.finalize() 虽然也可以做这 类动作,但是这个方式即不安全又低效

上诉所说的几类引用,都是指对象本身的引用,而不是指Reference的四个子类的引用 (SoftReference等)。

在这里插入图片描述

二分查找

题目:俄罗斯套娃信封问题

难度:🌟🌟🌟🌟🌟

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/russian-doll-envelopes

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

示例 1:

输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

示例 2:

输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

请先思考!!!!

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

答答答答答答答答答答答

案案案案案案案案案案案

往往往往往往往往往往往

下下下下下下下下下下下

翻翻翻翻翻翻翻翻翻翻翻

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

|||||||||||

class Solution {
    public int maxEnvelopes(int[][] envelopes) {
        // 如果我们控制了一列,那么这个问题就会变成找一维数组的最长子序列的问题
        // 加入我们控制宽度w按照省升序的方式排序,如果宽度w相同,那么就将高度h降序排序
        // 排序完就成了 [2,3],[5,4],[6,7],[6,4]
        // 此时我们就可以求高度h的最长子序列就可以找到问题的答案
        // 排序,这个地方采用了Arrays.sort()方法进行自定义排序
         Arrays.sort(envelopes, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                // 如果w相同就按照h的降序排序
                return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
            }
        });
        // 拍完序之后就h列作为新的数组来求LIS序列
        int[] arr = new int[envelopes.length];
        for( int i = 0 ; i < envelopes.length ; i++){
            arr[i] = envelopes[i][1];
        }
        // 计算LIS的个数
        return arrayLISNum(arr);
    }

    // 求最大的自序列
    public int arrayLISNum(int[] arr){
        int[] maxArr = new int[arr.length];
        int res = 0;
        for(int num : arr){
            int x = 0;
            // y就是代表maxArr数组的长度也就是res也是代表maxArr数组的长度
            int y = res;
            while(x < y){
                int mid = (x + y) >> 1;
                if(maxArr[mid] >= num){
                    y = mid;
                }else {
                   x = mid + 1;
                }
            }
            maxArr[x] = num;
            if(y == res){
                res++;
            }
        }
        return res;
    }
}

题解:

这个问题的难点就在于怎么进行排序来求出LIS序列,一般遇到问题的时候我们就要思考,一维数组我们很好控制,那么能不能将二维数组转换为一维数组来进行判断,首先我们就想到,要想将二维数组的问题转换为一维数组那么我们就要控制好一个纬度,然后操作另一个纬度,在本次俄罗斯套娃问题中就很好的体现,我们控制好宽度或者高度然后去操作高度或者宽度,就可以复杂的问题简单化,具体思路已经在注释上体现了。

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

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

相关文章

java面试,redis面试,java面试大全

LEARNING_CONTENT 一个分布式锁的解决方案&#xff0c;另一个是分布式事务的解决方案 -2 flink 链接&#xff1a;flink参考文章 -1 linux of view 参考链接&#xff1a; linux常见面试题 linux查看占用cup最高的10个进程的命令&#xff1b; 参考文章&#xff1a;linux查看…

uboot 启动内核代码分析

0、uboot和内核区别 uboot的本质就是一个复杂点的裸机程序。内核本身也是一个"裸机程序“&#xff0c;和uboot、和其他裸机程序并没有本质区别。 区别就是操作系统运行起来后在软件上分为内核层和应用层&#xff0c;分层后两层的权限不同&#xff0c;在内存访问和设备操作…

iptables 防火墙进出控制

iptables 防火墙进出控制 iptables简介 iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则&#xff0c;iptables 默认维护着 4 个表和 5 个链&#xff0c;所有的防火墙策略规则都被分别写入这些表与链中。 “四表”是指 iptab…

ES是如何解决高可用

https://www.cnblogs.com/crazymakercircle/p/15433680.html ES是一个分布式全文检索框架&#xff0c;隐藏了复杂的处理机制&#xff0c;核心数据分片机制、集群发现、分片负载均衡请求路由。 ES的高可用架构&#xff0c;总体如下图&#xff1a; 说明&#xff1a;本文会以pdf…

SQL 招聘网站岗位数据分析

数据清洗 1.删除包含空字段的行 create view v_data_clean_null as select * from data d where job_href is not null and job_href ! and job_name is not null and job_name ! and company_href is not null and company_href ! and company_name is not null and com…

OpenAI ChatGPT Unity接入

OpenAI ChatGPT Unity接入 OpenAI ChatGPT Unity接入OpenAi-API-Unity 方法OpenAi-API-Unity 下载本地配置Unity 模块URL接入gz 接入json 接入Open AIOpenAi-Api-Unity 插件文档 OpenAi 本地化接入 Unity 方法Unity 关键字识别语音合成 & 文字转语音音频记录 & 实时音频…

基于物联网及云计算技术的智慧充电桩平台设计方案

针对目前的充电桩监管难题&#xff0c;如何逐一击破各个痛点&#xff1f; TSINGSEE可提供基于"智能充电设备&#xff0b;云平台&#xff0b;APP小程序"一体化完整的解决方案&#xff0c;解决当前充电桩运营商面临的各种运营和管理难题。 一、方案介绍 方案充分利用…

容器技术的发展

容器技术的发展 近年来&#xff0c;随着计算机硬件、网络以及云计算等技术的迅速发展&#xff0c;云原生的概念也越来越受到业界人士的广泛关注&#xff0c;越来越多的应用场景开始拥抱云原生&#xff0c;其中容器技术的发展起着至关重要的作用。本章将介绍容器技术的基础知识…

瘦身必备!四款低卡美食狂掉20斤肥肉

夏天来了&#xff0c;想要减肥瘦身&#xff0c;却总是被高卡路里的食物所困扰&#xff1f;别担心&#xff0c;今天我为大家介绍四款低卡掉秤减脂美食&#xff0c;让你轻松享受美食的同时还能达到减肥的目的。 这四款美食简单易做&#xff0c;口感也十分好吃&#xff0c;适合各…

《花雕学AI》ChatGPT 的 Prompt 用法,不是随便写就行的,这 13 种才是最有效的

ChatGPT 是一款基于 GPT-3 模型的人工智能写作工具&#xff0c;它可以根据用户的输入和要求&#xff0c;生成各种类型和风格的文本内容&#xff0c;比如文章、故事、诗歌、对话、摘要等。ChatGPT 的强大之处在于它可以灵活地适应不同的写作场景和目的&#xff0c;只要用户给出合…

【STM32】定时器PWM模式详解

PWM模式&#xff1a; PWM模式1&#xff0c;向上计数时&#xff0c;PWM信号从有效电平变为无效电平 PWM模式2&#xff0c;向上计数时&#xff0c;PWM信号从无效电平变为有效电平 PWM极性&#xff1a; 极性为高时&#xff0c;高电平为有效电平&#xff0c;低电平为无效电平 极性…

【Android取证篇】Android设备USB调试打开方式(开发者模式)

【Android取证篇】Android设备USB调试打开方式(开发者模式) Android各个版本系统手机开启”USB调试”的入口不全相同&#xff0c;仅供参考—【蘇小沐】 1、【Android1.0-3.2】 路径&#xff1a;在应用列表选择「设置」->「应用程序」->「开发」->勾选「USB调试」选…

拿来吧你——一个类帮你搞定SpringBoot中的请求日志打印

拿来吧你——一个类帮你搞定SpringBoot中的请求日志打印 日常开发工作中避免不了要打印请求日志&#xff0c;这个功能几乎在所有的项目中都需要编写一次&#xff0c;重复的次数多了&#xff0c;难免会感觉繁琐&#xff0c;因此打算搞一个通用类把这块功能拆出来。 废话不多说—…

虹科方案|使用 HK-TRUENAS支持媒体和娱乐工作流程-1

一、摘要 开发和交付能够随时随地触及受众的媒体内容变得越来越重要和复杂。 在当今高度互联、娱乐驱动的世界中&#xff0c;媒体和娱乐 (M&E) 公司需要保持竞争力才能取得成功。 这些组织需要制作各种不同格式的信息和娱乐内容&#xff0c;以便在移动设备、台式机、工作站…

MySQL---基本操作DDL(SQL特点,数据类型,对数据库的操作,对表的操作)

1. SQL的特点 具有综合统一性&#xff0c;不同数据库的支持的SQL稍有不同 非过程化语言 语言简捷&#xff0c;用户容易接受 以一种语法结构提供两种使用方式 2. 对数据库的常用操作 功能 SQL 查看所有的数据库 show databases&#xff1b; 创建数据库 create databa…

设备驱动模型:总线-设备-驱动

1 设备驱动模型简介 参考 以下内容&#xff1a; Linux 笔记&#xff1a; https://xuesong.blog.csdn.net/article/details/109522945?spm1001.2014.3001.5502正点原子-左盟主 驱动开发网络资料&#xff1a;https://www.cnblogs.com/lizhuming/category/1859545.html 1.1 概…

Github的加速访问

文章目录 概述Steam的下载Steam的安装使用 概述 GitHub打开访问速度比较慢&#xff0c;这儿介绍一种加速访问的方式&#xff0c;是正规的方式&#xff0c;采用 Steam 来加速。 Steam的下载 浏览器输入框输入Watt Toolkit进行搜索&#xff0c; 选择官网进入&#xff0c;网址 …

蚂蚁安全科技 Nydus 与 Dragonfly 镜像加速实践 | 龙蜥技术

编者按&#xff1a;本文详细介绍蚂蚁安全科技使用龙蜥社区技术进行镜像加速的实践过程&#xff0c;可以让您了解如何基于龙蜥社区推出的容器镜像&#xff0c;Nydus 与 Dragonfly 镜像加速技术和 LifseaOS 为容器的启动加速。文章转自金融级分布式架构&#xff0c;以下为全文。 …

计算材料学有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是一些计算材料学领域的SCI期刊推荐&#xff1a; Computational Materials Science&#xff1a; 该期刊发表计算材料科学的理论、计算和实验研究&#xff0c;包括材料结构、热力学、物理和化学性质以及材料的设计、制备和性能等方面的内容。 Materials Horizons&#xff1…

JavaWeb——HTML中的常用标签详解

目录 一、HTML 1、HTML标签结构 2、HTML文件结构 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、标签层次结构 二、HTML常见标签 1、注释标签 2、标题标签 3、段落标签 4、换行标签 5、格式化标签 6、图片标签 &#xff08;1&#xff09;、定义 &a…