Java基础之toString的序列化 匿名对象 复杂度精解

目录
  • 序列化
  • 匿名对象
  • 复杂度
    • 时间复杂度
      • 大O的渐进表示法
      • 时间复杂度的分类
      • 计算时间 复杂度的方法
    • 空间复杂度

toString的序列化、匿名对象、复杂度

序列化

toString 方法的原理就是序列化,他可以帮助我们讲一个抽象的对象变得具体,譬如把对象里面的名字、年龄、身高等信息具象为字符串。(总之,序列化:将对象转化为字符串;反序列化:将字符串转化为对象)。

匿名对象

匿名对象适用于只想使用一次的情况,因为匿名对象是没有引用的,每次用都要重新new 一遍对象,很麻烦。

class Person {
    public void eat{
        //略
    }
    public void show{
        //内容略
    }
}
//主函数略写
new Person.eat();//此即为匿名函数的写法
new Person.show();

复杂度

复杂度是衡量一个计算机运行效率的东西,分为时间复杂度和空间复杂度,空间复杂度衡量的是一个程序所占用储存空间,时间复杂度衡量的是一个程序的运行时间(当然,不是那种真实的时间),但是当下,计算机的内存空间已经发展到了一定的高度,所以不需要再去关注这个东西了。

时间复杂度

我们是不可能能真正去测算一个程序的执行时间的,因为,每个计算机的性能不同,执行的时间快慢也不同。一个算法所花费的时间是正比于语句的执行次数的。

所以,算法中的基本操作的执行次数,为算法时间复杂度。

以下为时间复杂度示例,一起来具体分析。

上面已经讲过了,时间复杂度的定义就是 算法中的基本操作的执行次数,所以我们算一下上面这段代码每段语句的执行次数就可以求出(上面的图片已经标注),所以这段代码的时间复杂度为:N^2 + 2N + 10。(1 太小,可以忽略)。

大O的渐进表示法

用参数 1 取代式子中的常数项在修改后函数中只保留最高项如果最高项的系数不为 1 ,那么就把他前面的系数去掉

(其实归根到底就是 ,对于一个有不同项的式子(譬如:N^2+2N+10 变 N^2) ,去掉最高项以外的其他项 , 去掉最高项的常数,但是如果其时间复杂度仅仅是一个常数,直接转为O(1)即可)

时间复杂度的分类

时间复杂度被分为三类(可以以数组的查找为例)

第一类:最好情况(1次找到,即假定我们要找的是数组的第一个元素)

第二类:最坏情况(最后一个找到,即假设我们要找的是数组的最后一个元素,N次)

第三类:平均情况(中间找到,即假设我们要找到的是数组的中间元素,N/2次)

但是,平时我们嘴里面常说的时间复杂度其实是最坏的情况,所以,以上以查找数组为例的时间复杂度应该为:O(N)。

计算时间 复杂度的方法

既要看程序的执行次数,也要看程序的具体的执行内容而定。

示例 1

如上图,要求计算冒泡排序的时间复杂度。这里要算出 最好情况和最坏情况 ,最好情况也就是顺序,一次性的只有图中的第一个框子的程序进行执行,第二个框子里的程序根本没执行所以不纳入考虑范围。因此,最好情况为:O(N)。

但是最坏情况就是逆序,从大到小的那种,这样的话,第二个框子必须每次都执行。即为:N(N-1),因此根据刚刚上面的规则,去掉最高项以外的其他项之后,最坏情况为:O(N^2)。

示例 2

如上图,是二分查找的代码,这个代码要计算它的时间复杂度,就必须知道里面循环执行的次数,而下图,以四个元素的数组为例进行查找,最终发现规律(注意,这里要算的时间复杂度考虑最坏情况,也就是说我们不管数组里有几个元素查找的都是最后一个元素)。如图,分支处的判断与赋值其实就是进入循环里面所做的事情,也就是说有几个分支,循环就执行了几次,下图那个,四个元素,三个分支,所以,循环执行了三次,其时间复杂度也是 3 。最后的到用n 表示出来的n ,但是下图中的值其实并不准确,根据上面说过的原理,我们可以略去 1 那个常数。然后log 里面的 2 也是能够去掉的,用 log n 特指 二分查找的时间复杂度。

示例3

计算递归的时间复杂度,公式:时间复杂度 = 递归的次数 * 递归执行的次数。

//阶乘递归
long factorial(int n) {
    return n < 2 ? n :factorial(n-1)*n;
}//求此段代码的时间复杂度
//  n     a
//  2     2*1
//  3     3*1
//综上,找出的规律说明输入多少
//时间复杂度就是多少。
//因此,答案为O(N)
//计算斐波那契数列的时间复杂度
int fibonacci(int n) {
    return n < 2 ? n :fibonacci(n-1)+fibonacci(n-2);
}
//

空间复杂度

空间复杂度不是看程序占多少字节,这个是没有意义的,但是如果我们要计算空间复杂度的话,其实求的是变量的个数。

如上图,冒泡排序的空间复杂度是O(1),之所以是这样子的是因为函数参数里面的那个 int[] array,他其实并不算在内,因为这是一个必须空间,就是说,要存这N 个数据就必须是要开辟的,这种必须空间不纳入考虑范围。但是循环里面的那个 sort 变量是纳入考虑范围,因为这才是实实在在创建的变量,又因为这个变量在for 循环里面,仅仅是每次循环赋一次值,并不是每次循环都创建一次,所以 时间复杂度为 1。

同样的,上图起到决定空间复杂度的变量即为图中画红线的变量。容量一律用N 来表示,故为O(N)。

此处递归代码的空间复杂度为O(N),因为每次递归都会开辟函数的栈帧,这个栈帧里面存有值,因为上面的代码的递归次数是 N 次,所以它也就开辟了 N 次,也就有了N 个值。

到此这篇关于Java基础之toString的序列化 匿名对象 复杂度精解的文章就介绍到这了,更多相关Java toString内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一篇文章带你了解java Object根类中关于toString,equals的方法

    目录 toString: 代码案例: equals: 代码案例: 总结 toString: 概念:拼接对象的地址值:toString()方法用于返回表示对象值的字符串(返回的是String对象). 快捷写法:Alt+Insert,直接会显示toString的方法,选取需要返回的对象就行. 代码案例: 定义一个person类,属性如下: (1)身份证号,性别,姓名,年龄,户籍,出生日期(Data类型,需要引用java.uitl.Data)功能: (2)自我介绍:介绍格式:(toString) 身份

  • java基础之 Arrays.toString()方法详解

    在实际项目中,如果想要把数组中的内容打印出来,直接使用toString方法只会打印出数组的地址,因此需要使用Arrays的toString方法, 可以从其内部实现中看出来,该方法支持入参可以是long,float,double,int,boolean,byte,object 型的数组. 补充:java中arrays.toString(int [ ] arr)方法的底层原理 我就废话不多说了,大家还是直接看代码吧~ /** *@author:肖佳嘉 * */ * public static Str

  • Java toString方法重写工具之ToStringBuilder案例详解

    apache的commons-lang3的工具包里有一个ToStringBuilder类,这样在打日志的时候可以方便的打印出类实例中的各属性的值. 具体用法如下: import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; public class Message { private String from; private Stri

  • Java自动添加重写的toString方法详解

    Java怎么自动添加重写的toString方法,这里我们将给大家介绍详细的解决方法. 首先,添加一个任意的类,具体的类型没有要求,然后在主程序中创建对象,这里要求构造方法的位置要求必须是可实例化的类或其子类对象. 然后在主程序中创建对象,这里要求构造方法的位置要求必须是可实例化的类或其子类对象. 然后,在该程序中点击鼠标右键,找到鼠标右键,找到source选项. 在第三步中找到source选项中,找到generate toString( )方法. 进入之后,什么都不用选择,直接点击界面最下方的o

  • Java Object toString方法原理解析

    在Java中,所有的对象都是继承自Object,自然继承了toString方法,在当使用System,out.println()里面为一个对象的引用时,自动调用toString方法将对象打印出来.如果重写了tostring方法则调用重写的toString 方法. 先看下面一段代码 public class ToStringTest { static int i = 1; public static void main(String[] args) { System.out.println("lo

  • Java基础之toString的序列化 匿名对象 复杂度精解

    目录 序列化 匿名对象 复杂度 时间复杂度 大O的渐进表示法 时间复杂度的分类 计算时间 复杂度的方法 空间复杂度 toString的序列化.匿名对象.复杂度 序列化 toString 方法的原理就是序列化,他可以帮助我们讲一个抽象的对象变得具体,譬如把对象里面的名字.年龄.身高等信息具象为字符串.(总之,序列化:将对象转化为字符串:反序列化:将字符串转化为对象). 匿名对象 匿名对象适用于只想使用一次的情况,因为匿名对象是没有引用的,每次用都要重新new 一遍对象,很麻烦. class Per

  • 浅析Java常用API(Scanner,Random)匿名对象

    API:即Application programming Interface,应用编程接口. Java中封装了许许多多的API供用户使用,Scanner与Random便是其中之一,API实际就是类,已经封装好了Scanner类,Random类,我们只需按照其语法编写即可,无需了解其根本源代码 Scanner类: 1.使用Scanner类需导入其所在包,import java.util.Scanner或import java.util.*(前者是导入util中的Scanner类,后者是导入util

  • Java基础入门总结之序列化和反序列化

    目录 基本概念 序列化 反序列化 序列化和反序列化总结 自定义序列化策略 Externalizable transient 静态变量 序列化ID 破坏单例 总结 基本概念 Java中创建对象时,一旦程序终止,创建的对象可能就不存在.要想使得对象能够在程序不运行的状态下依然能够保存对象的信息,这时就需要用到序列化机制 序列化机制: 一个对象可以被表示为一个字节序列,包括: 对象的数据 对象的类型信息 存储在对象中的数据类型 将可序列化对象写入文件后,可以从文件中读取出来,根据对象的各种信息在内存中

  • Java中通过Class类获取Class对象的方法详解

    前言 本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 阅读API的Class类得知,Class 没有公共构造方法.Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的 获取Class对象的三种方式(实例采用Person类) 方式1:通过Object类的getObject()方法 Person p = new Person(); Class c

  • Java 基础语法让你弄懂类和对象

    目录 Java 基础语法 一.类与对象的初步认知 二.类和类的实例化 三.类的成员 1. 字段/属性/成员变量 2. 方法 3. static 关键字 四.封装 1. private 实现封装 2. getter 和 setter 方法 五.构造方法 1. 基本语法 2. this 关键字 六.认识代码块 1. 什么是代码块 2. 本地代码块 3. 实例代码块 4. 静态代码块 七.补充说明 1. toString 方法 2. 匿名对象 八.总结 Java 基础语法 其实在学习 C 语言时就一直

  • 详解Java基础篇--面向对象1(构造方法,static、this关键字)

    面向对象,面向过程的区别.拿下五子棋来说: 面向过程分析: 开始游戏 黑棋先走 绘制画面 判断输赢 轮到白棋 绘制画面 判断输赢 返回步骤2 输出结果 面向对象分析: 黑白双方,双方行为是一模一样的 棋盘系统,负责绘制画面 规则系统,判断犯规.输赢 传统的面向过程编程是思考问题的解决步骤,这种思维方式适用于问题规模较小时.可是当问题规模大,要求程序有更好的可扩展性,能更快速地查错时面向对象设计思想就能体现出其优势.面向对象更接近人类地自然思维方式,将现实世界中的事物抽象为对象和对象的方法. 面向

  • Java基础之序列化与反序列化详解

    目录 1.什么是序列化与反序列化? 2.Java如何实现序列化和反序列化? 3.如何自定义序列化和反序列化呢? 4.writeObject和readObject方法 5.serializable接口 1.什么是序列化与反序列化? 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是XML等格式.而字节的或XML编码格式可以还原完全相等的对象.这个相反的过程又称为反序列

  • 深入理解JAVA基础类库中对象Object类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类. 例如: public class Dog{ ...... } 等价于: public class Dog extends Object { ...... } Object常用方法 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在

  • Java利用序列化实现对象深度clone的方法

    本文实例讲述了Java利用序列化实现对象深度clone的方法.分享给大家供大家参考.具体实现方法如下: ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(obj); ByteArrayInputStream byteIn = new ByteArrayInputStream(by

  • Java基础教程之对象的方法与数据成员

    在Java基础教程之从Hello World到面向对象一文中,我们初步了解了对象(object).对象中的数据成员表示对象的状态.对象可以执行方法,表示特定的动作. 此外,我们还了解了类(class).同一类的对象属于相同的类型(type).我们可以定义类,并使用该定义来产生对象. 我们进一步深入到对象.了解Java中方法与数据成员的一些细节. 调用同一对象的数据成员 方法可以调用该对象的数据成员.比如下面我们给Human类增加一个getHeight()的方法.该方法返回height数据成员的值

随机推荐