精华内容
下载资源
问答
  • Java匿名对象的性能优势分析

    千次阅读 2019-06-02 23:40:10
    Java匿名对象的性能优势分析1. 匿名对象2. Java创建对象的过程3. 性能差异存储上的性能差异垃圾回收上的差异4. 继续 今天思考了一下java在使用匿名方式创建对象和普通的句柄方式对java传递对象的性能进行了一点简单...

    今天思考了一下java在使用匿名方式创建对象和普通的句柄方式对java传递对象的性能进行了一点简单的思考,可能不是很全面,在某些方面的理解也能有些偏差,欢迎各位大佬探讨指正!

    首先阐明结论:
    对于能够使用匿名对象进行对象创建和传递的时候,是具有一定性能优势的,尤其是对于大量对象创建的时候,差异更加明显。(抛开数量谈效率都是耍流氓)

    要分析Java使用匿名对象所带来的性能优势,我们首先要对java在内存中创建对象的过程有一定的了解,并对两种创建对象方式见存在的差异进行分析,才能够体会到一些些细小的细节所带来的不同。下面我们逐个分析。

    PS. 对于java内存模型不是很了解的朋友可以先读一下我之前的几篇文章,对知识有一个完整的体系,回过头来继续往下看也不迟!
    从Java的各种基本数据类型看Java内存区域结构划分
    Java包装类及自动装箱、拆箱

    1. 匿名对象

    顾名思义,匿名就是没有名字的对象,在创建对象时,只通过new的动作在堆内存开辟空间,却没有把堆内存空间的地址值赋值给栈内存的某个变量用以存储。

    2. Java创建对象的过程

    看过引文里的两篇文章之后,相信你已经对Java的内存模型有了一定的了解,让我们继续分析java在创建对象时的过程。

    1. 看下面这条语句:
    Student s = new Student();
    

    对应的再看下面这张图:

    在这里插入图片描述

    在执行上面那句代码的时候在栈内存中分配栈帧,并在堆内存中开辟Student对象的空间,并由栈内存指向堆内存中实际的对象地址。

    1. 匿名创建
    new Student().要执行的方法;
    

    在这里插入图片描述

    使用匿名的方法创建对象,仅在堆内存中为其分配了内存,并不存在由栈内存到堆内存中的对象引用。

    3. 性能差异

    存储上的性能差异

    观察上面的两张图我们可以看到,由于使用匿名对象不需要分配栈内存,且无需进行引用指向,在大量创建对象的时候能够节约很多的栈空间,且数量越多越明显。

    垃圾回收上的差异

    Java的GC机制根据对象的引用数量判断该对象是否可达,若对象不可达,则会判定该对象为垃圾,在下一次垃圾回收的时候进行回收。
    使用匿名对象的好处就是使用完毕就是垃圾,可以在垃圾回收器空闲时回收,节省内存空间。

    4. 继续

    既然匿名对象使用完了就回收了,为什么要使用呢?
    我们能够使用匿名对象调用方法。那么为什么说匿名对象调用方法有意义呢?方法存在于栈空间,当在内存中创建的对象调用方法时,JVM开始为局部变量开辟内存空间,方法开始执行,方法强调其功能,对象调用方法可以完成其功能,所以匿名对象调用方法有意义。

    那么为什么不声明为静态呢?
    静态的内容属于类,并不属于每一个具体的对象,在设计方面存在差异。、

    5. 总结

    在需要注意系统性能的应用中,使用匿名对象创建的方式能够减少栈帧的分配和指向,且在调用完毕后能够被GC机制快速的回收。但在具体使用的时候需要注意其使用场景,若后续仍需要使用该对象,那么匿名的方式可能就不是个好的选择了。

    展开全文
  • java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式。 int[] arr = {2,3,4,5,11,13}; 在使用这种语句时,不需要调用new。 也可以初始化一个匿名数组: new int[] {13,24,56,75} 这种表示方法将创建...

    以匿名数组为例

    一.
    在java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式,表明我们声明了一个数组。

    int[] arr = {13,24,45,67};
    

    这种写法不需要通过new来创建。
    我们把这种写法和我们最常见的写法对比一下:

    int[] arr = {13,24,45,67};
    System.out.println(arr[0]+"---"+arr[1]+"---"+arr[2]+"---"+arr[3]);
    
    int[] array = new int[]{13,24,45,67};
    System.out.println(array[0]+"---"+array[1]+"---"+array[2]+"---"+array[3]);
    

    得到结果如图:
    在这里插入图片描述
    发现这两种的方法都能够输出数组里面的元素。说明这两种声明数组的方法相同。


    二.
    也可以初始化一个匿名数组:

    new int[] {14,23,45,67}
    

    这种形式我们可以这样进行使用:

    1. 声明一个名为get()的静态的返回类型为一个int类型数组的函数,返回一个匿名数组。
    public static int[] get(){
            return new int[] {14,23 45,67};
        }
    
    1. 在主函数中声明一个数组调用get()函数,并输出数组中每个元素
    int[] bc = get();
    for(int i = 0 ; i < bc.length ; i++){
        System.out.println(bc[i]);
    }
    
    1. 得到如下结果:
      在这里插入图片描述
      这种表示方法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。
      而且,我们将匿名数组作为方法的返回值返回,我们在主函数中声明任意的数组都可以接收到这个匿名数组,是不是就比每次都new一个数组方便很多?
    int[] arr1 = get();
    System.out.println(arr1[0]+"---"+arr1[1]+"---"+arr1[2]+"---"+arr1[3]);
    int[] arr2 = get();
    System.out.println(arr2[0]+"---"+arr2[1]+"---"+arr2[2]+"---"+arr2[3]);
    int[] arr3 = get();
    System.out.println(arr3[0]+"---"+arr3[1]+"---"+arr3[2]+"---"+arr3[3]);
    int[] arr4 = get();
    System.out.println(arr4[0]+"---"+arr4[1]+"---"+arr4[2]+"---"+arr4[3]);
    

    得到结果:
    在这里插入图片描述
    结果显示我们的说法也是行得通的。


    对于题目中匿名对象来说同理
    我们要实现一个方法method(Student stu),需要传递一个对象来作为参数,这时候我们也是有两种方法:
    1.声明一个变量并初始化
    Student stu = new Student();
    method(stu);
    2.声明一个匿名对象 (方法中new A()就是匿名对象)
    method(new Student());
    先在类中创建一个method方法,在Student类中写好get、set方法。

    public static void method(Student stu){
           stu.setName("张三");
           System.out.println(stu.getName());
       }
    

    在main函数中输入:

    method(new Student());
    

    我们可以在控制台看到我们输出了“张三”。
    在这里插入图片描述


    总结:
    匿名数组这种语法形式可以在不创建句柄(新变量)的前提下节省了我们在栈内的空间分配
    这样我们就省略了一系列对栈的操作,减少了我们的代码量,最主要提升了程序的性能。

    展开全文
  • node.js和Java的区别以及优缺点

    千次阅读 2019-05-09 11:08:52
    最近有些人问我,为什么要选用Node.js,不选用Java,是怎么考虑的? 我自己也思考了一些,然后网上百度了一些,然后觉得有必要整理一下,强化记忆。 Node.js: Node.js本质上就是JavaScript,采用事件驱动,异步...

    最近有些人问我,为什么要选用Node.js,不选用Java,是怎么考虑的?

    我自己也思考了一些,然后网上百度了一些,然后觉得有必要整理一下,强化记忆。

    Node.js:

    Node.js本质上就是JavaScript,采用事件驱动,异步编程,为网络服务而生。而且JavaScript的匿名函数和闭包特性非常适合事件驱动、异步编程。Node.js的本质导致其特性就是开发快,运行效率高。

    Node.js非阻塞模式的IO处理带来了在相对较低的系统资源耗用下高性能和负载能力,非常适合用作依赖其他IO资源的中间层服务(非常重要,因为node一般作为页面的轻server使用)。

    Node.js轻量高效。在响应客户端之前,预计可能有很高的流量,但所需的服务器端逻辑不一定很多,可以说是数据密集型分布式部署环境的实时应用系统的完美解决方案。

    而Node.js的特性既是优点也是缺点,因为JavaScript不是静态类型语言,Node.js其实是一种解释语言,必然会导致在大项目中出现逻辑复杂,可维护性差等缺点。

    Java:

    面向对象的高级编程语言。发展至今丰富的组件,框架完全能胜任各种项目运行需求。但是因为技术庞杂,必然导致学习成本大、开发周期长等缺点。

    展开全文
  • 转载请标明出处: ... 本文出自:【李晓阳的博客】static关键字 static简介 特点 静态变量类变量和非静态变量实例变量的...匿名对象1.static关键字static简介 static是静态的意思,是一个修饰符,能够用于成员变量和成

    转载请标明出处:
    http://blog.csdn.net/lxy_cn/article/details/52788145
    本文出自:【李晓阳的博客

    1.static关键字

    static简介

    static是静态的意思,是一个修饰符,能够用于成员变量和成员属性。

    特点

    能够通过类名直接进行调用,被static修饰的成员属性变成了类属性,被static修饰的成员方法变成了类方法, 类属性 和 类方法能够不用创建对象直接被调用

    //普通类
    public class Persion {
        //static修饰后成为类属性
        public static String str="hello,sttaic";
        //static修饰后成为类方法
        public static void sleep(){
            System.out.println("好吧!,我睡了");
        }
    }
    
    //Main主线程
    public static void main(String[] args) {
        //能够不用创建对象直接调用
        //类名.成员变量
        String aa=Persion.str;
        //类名.成员方法
        Persion.sleep();
    }

    静态属性被该类的说有对象所共享

    静态变量(类变量)和非静态变量(实例变量)的区别

    a.内存中的位置

    类变量随着类的加载而存在于方法区中
    实例变量随着对象的创建而存在于堆内存中

    b.生命周期

    静态变量的生命周期最长,随着类的加载而加载,随着类的消失而消失;实例变量的生命周期随着对象的创建而产生,消失而消失,静态属性要早于对象而存在。

    c.所属关系不同

    类变量所属于整个类,被类的所有对象所共有。
    实例变量是对象的特有数据,仅仅属于某个对象。

    优缺点

    优点: 对于对象的共享数据提供单独的存储空间,节省了控件,没必要所有对象都存储一份。

    缺点: 生命周期过于长,访问有一定的局限性,(静态方法只能访问静态属性)


    2.代码块

    说明

    代码块就是被{ }包裹的部分,Java中的代码块分为:
    普通代码块,又称为局部代码块,存在于方法体中

    构造代码块,又称为初始化代码块,在使用new关键字创建对象时执行,且先于构造方法执行

    静态代码块,被static直接修饰的代码块,在类被加载时就执行,只执行一次

    public class CodeBlock {
        //1.静态代码块 类加载的时候进行执行
        static{
            System.out.println("这是静态代码块");
        }
        //2.构造代码块  创建对象的时候执行
        {
            System.out.println("这是构造代码块(初始化代码块)");
        }
    
        public CodeBlock(){
            System.out.println("这是构造方法");
        }
        public void hello(){
            //局部代码块   当方法被调用的时候开始执行
            {
                int i=100;
                System.out.println("这是普通代码块(局部代码块)");
    
            }
            int i=1;
        }
    
    
    
        //主函数
        public static void main(String[] args) {
            //1.在创建对象前 静态代码块首先执行
            //2.在创建对象时 构造代码块开始执行
            //3.在创建对象时 构造代方法开始执行(构造代码块先于构造方法执行)
            CodeBlock cb1=new CodeBlock();
            //4.方法被调用时 普通代码块执行
            cb1.hello();
            System.out.println("-------割-------");
            //静态代码块只在加载类的时候调用且只调用一次
            CodeBlock cb2=new CodeBlock();
            cb2.hello();
        }
    }
    

    当执行CodeBlock p = new CodeBlock(); 时,内存变化情况

    1,将Person.class文件加载进内存
    2,在方法区为静态属性分配内存并进行默认初始化
    3,执行静态代码块,静态方法进方法区
    4,p是对象(变量),那么在栈内存中开辟一个变量空间p
    5,在堆内存中给对象分配空间,并分配内存地址值
    6,普通方法进方法区
    7,非静态属性进堆内存,并进行默认初始化
    8,调用构造代码块(初始化代码块)
    9,调用对应的构造方法进行对象初始化,对象初始化完毕
    10,将对象内存地址赋值给p变量,让p变量指向该对象

    3.Main方法

    main方法是一个特殊的方法,作为程序执行的入口可以被JVM识别。

    main方法是静态的,所以可以被JVM直接调用,非常方便。

    main不是Java关键字,但用来被JVM识别为程序执行的入口。

    4.匿名对象

    1. 没有名字的对象
    2. CodeBlock p=new CodeBlock(); p只是一个对象的名字(引用), newCodeBlock()才是创建出来的对象

    3. new Person().eat();
      缺点:同一个对象只能调用一次方法

    4. 作用:传参
      a.自定义的类型也可以作为参数的类型去使用
      b.形参的类型是Person,那么实参的类型也必须是Person
      c.实参在传参时可以匿名
      d.实参这个对象传到方法中后,可以在方法里调用它的方法

    展开全文
  •  Java 8或许是 迄今为止最令人期待的Java版本,最初定于今年的9月份发布,但由于一系列的安全漏洞问题,目前已推迟到明年的3月份。      Java 8试图“创新”,根据 微软对这个词的定义,就是把其他框架或...
  • 创建一个线程对象, 通过匿名内部类实现Runnable接口重写run()方法, 完成后线程进入初始化状态 Thread t = new Thread(new Runnable() { //2. 重写run(), 执行具体的业务逻辑 @Override public ...
  • java 匿名类的使用

    2020-03-04 11:47:16
    class Damo{ public stacic void main(String[] args){ //正常创建对象的方式 ...而匿名对象是指s不 //要了直接用 new Person(); new Person().name="大正哥"; System.out.println(new Person()....
  • 但值得注意的是,并不是所有的新特性都适用于你的项目,它们也存在一些缺点Java 8或许是 迄今为止最令人期待的Java版本,最初定于今年的9月份发布,但由于一系列的安全漏洞问题,目前已推迟到明年的3月份。...
  • Java 8或许是 迄今为止最令人期待的Java版本,最初定于今年的9月份发布,但由于一系列的安全漏洞问题,目前已推迟到明年的3月份。   Java 8试图“创新”,根据 微软对这个词的定义,就是把其他框架或语言...
  • Java创建线程四种方式: 1. 继承Thread类; 2. 实现Runnable接口; 3. 实现Callable接口,实例化FutureTask类; 4. 创建线程池(以下用Executor框架实现) 说明:这四种方式都潜移默化都用到了Thread类(表示线程),...
  • Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别 数组: 长度固定 可以存储基本类型,也可以存储引用类型 存储元素类型一致 数组可以在内存中连续存储多个元素的构造,在内存中的分配也是连续的 ...
  • Java面向对象(知识点整理)

    万次阅读 多人点赞 2021-02-22 08:53:55
    文章目录面向对象类与对象匿名对象创建对象的内存分析栈(stack)堆(heap)方法区PC寄存器本地方法栈内部类成员内部类局部内部类匿名内部类静态内部类包装类拆箱和装箱操作字符串转换基本数据类型和包装类型的区别...
  • Java面向对象

    2017-02-08 01:59:03
    C语言是一种面向过程的语言,在现代软件开发过程中面临一些难以解决的问题,比如程序规模大到一定程度后难以团队开发和维护等,就产生了软件危机。...Java语言是一种非常受欢迎的面向对象的开发语言。类可以
  • Java面向对象学习笔记

    2017-11-19 20:56:00
    Java面向对象学习笔记/面向对象概念
  • 匿名对象-ArrayList

    2020-02-02 22:27:23
    匿名对象 创建对象的标准格式: 类名称 对象名 = new 名称(); 匿名对象 只有右边的对象,没有左边的名字和赋值运算 new 类名称(); **注意事项:**匿名对象只能使用唯一一次,下次再用不得不再创建一个新...
  • 细数Java缺点

    2017-05-29 10:08:45
    别误解,其实在我的职业生涯中,我已经编写了无数的Java代码;而且,我仍然认为Java一门伟大的(程序)语言。相对于C++和Smalltack,Java已经有了很大的改进;但现在,即使是Java,也已经开始感觉到了其15年的积重。
  • java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1...
  • Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别 数组: .长度固定 .可以存储基本类型,也可以存储引用类型 .存储元素类型一致 数组可以在内存中连续存储多个元素的构造,在内存中的分配也是连续的...
  • 一、匿名对象使用方式 1、当对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化;如果对一个对象进行多个成员调用,必须给这个对象起个名字。 2、可以将匿名对象作为实际参数进行传递;如上例中run...
  • 匿名对象优缺点: 优点:使用匿名对象成员后,该对象空间会变成垃圾空间等待JVM回收,无需设置 null值。 缺点匿名对象成员只能使用一次,再次使用时就不是原来对象了,因为被JVM回收 了,所以再次...
  • java 创建线程有三种方式: (1) 继承Thread 类 (2)实现Runnable接口  (3)实现Callable接口
  • java面向对象编程

    千次阅读 2012-07-30 17:46:00
    面向对象主要针对面向过程。 面向过程的基本单元是函数。   什么是对象:EVERYTHING IS OBJECT(万物皆对象)   所有的事物都有两个方面: 有什么(属性):用来描述对象。 能够做什么(方法):告诉外界...
  • Java 面向对象 第一部分(封装)

    千次阅读 2013-09-14 21:43:18
    Java面向对象 prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一.  面向对象的概述 面向对象是一种思想
  • 初识Java类和对象

    多人点赞 2020-10-20 00:33:45
    目录:1. 类与对象的初步认知 2.类和类的实例化 3. 类的成员:3.1字段/属性/成员变量 3.2 构造方法(重要) :3.2.1基本语法 3.2.2 this 关键字 4.static 关键字 :4.1...序列化和匿名对象:7.1 toString方法 7.2匿名对象
  • java-面向对象编程-内部类

    千次阅读 2017-02-18 20:44:34
    今天要介绍的是一个在面向对象编程中比较烧脑的一个知识点,叫做内部类。意思就是在一个类的内部再重新定义一个新的类,作为外部类的一个属性而存在。那么,我们常说:存在即合理,那么,既然有内部类的存在,就必定...
  • 很多小伙伴会疑问接口会不会创建对象,例如一下代码: public interface Runnable { void run(); } public static void main(String[] args) { Runnable r= new Runnable(){ // some implementation } } ...
  • Java基础-面向对象

    千次阅读 2020-01-16 17:50:17
    Java基础-面向对象 由于年前工作太忙、实在没时间整理Java基本知识。 但是可能长时间不更新不好看、再说我个人也没有半途而废的习惯。所以决定节前还是更新一篇吧。 这也算是Java的基本思想和一些偏进阶的东西。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,797
精华内容 8,718
关键字:

java匿名对象优缺点

java 订阅