Java 几种方法初始化 Set_java set初始化-程序员宅基地

技术标签: Java  java  开发语言  

  创建 Set 实例并初始化的方法有多种,举例如下。

一、利用 Set 接口的 add(E e) 方法
	public static void main(String[] args) {
    
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        System.out.println(set);  // [1, 2, 3]
    }

  这是很容易想到的方法,也是笔者最常用的方法。

二、利用匿名内部类和实例初始化代码块
	public static void main(String[] args) {
    
        Set<Character> set = new HashSet() {
      // 这个括号用来创建匿名内部类
            {
      // 这个括号表示是匿名内部类的实例初始化块
                add('a');
                add('b');
                add('c');
            }
        };
        System.out.println(set);               // [a, b, c]
        System.out.println(set.contains('a')); // true
    }

  这种初始化方法,比第一种要简单一些,利用的有两个 Java 知识点,一个是匿名内部类,一个是实例初始化代码块。
  所谓匿名内部类也就是没有名字的内部类,一般只使用一次。而匿名内部类的实现方式也就是当创建一个父类对象时,后边加一个大括号,例如:

Set set = new HashSet(){
    };

  当定义一个类的时候,一般会定义构造函数,有时候还会定义静态代码块和实例初始化代码块,比如:

package com.example.demo;

public class TestClass {
    
	// 构造函数
    TestClass() {
    
        System.out.println("I am a constructor");
    }
	// 静态代码块,特点:随着类的加载⽽执⾏,⽽且只执⾏⼀次。
	// 执⾏优先级⾼于⾮静态的初始化代码块,它会在类初始化的时候执⾏⼀次,执⾏完成便销毁,它仅能初始化类变量,即 static 修饰的成员变量。
    static {
    
        System.out.println("I am a static method");
    }
	// 实例初始化代码块,本质上是代码块。特点:随着类的加载⽽执⾏,⽽且只执⾏⼀次。
	// 执⾏的时候如果有静态代码块,先执⾏静态代码块再执⾏⾮静态代码块,在每个对象⽣成时都会被执⾏⼀次,它可以初始化类的成员变量。
	// ⾮静态初始化代码块会在构造函数执⾏时,在构造函数主体代码执⾏之前被运⾏。
    {
    
        System.out.println("Instance initializer block invoked");
    }

    public static void main(String[] args) {
    
        TestClass testClass = new TestClass();
        // 分别输出以下三行
        // I am a static method
        // Instance initializer block invoked
        // I am a constructor
    }
}

  实例初始化代码块用于初始化实例成员,它在每次创建类的实例时运行。
  那么既然之前我们定义了一个匿名内部类,那么它和正常的类一样,也会执行相应的初始化操作(匿名内部类没有构造函数),这也就是我们初始化 Set 时的第二个大括号,这个大括号定义了实例初始化代码块,所以在创建对象的时候就会被执行。

三、探究:实例初始化代码块和构造函数哪个先调用?

  看下方例子。

package com.example.demo;

public class B {
    
    B() {
    
        System.out.println("constructor");
    }

    {
    
        System.out.println("instance initializer block");
    }

    public static void main(String[] args) {
    
        B b = new B();
        // 输出如下结果:
        // instance initializer block
        // constructor
    }
}

  上述代码在执行过程中输出结果为:

instance initializer block
constructor

  在上面的例子中,似乎首先调用实例初始化代码块,但是其实不是。 实例初始化代码块在对象创建时被调用。 java 编译器在构造函数中复制实例初始化块。 首先,调用构造函数,执行实例初始化代码块,再执行原构造函数方法。 让我们看下编译后的 B.class 文件来理解它。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.example.demo;

public class B {
    
    B() {
    
        System.out.println("instance initializer block");
        System.out.println("constructor");
    }

    public static void main(String[] args) {
    
        new B();
    }
}

  注意:java 编译器在每个构造函数中会自动复制实例初始化代码块的代码。

文章参考
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/piaoranyuji/article/details/125261678

智能推荐

《osgChina站长文集》_osg站长-程序员宅基地

文章浏览阅读677次。《杨石兴osg博客》《osgChina站长文集》_osg站长

2023年下半年网络工程师上午真题及答案解析-程序员宅基地

文章浏览阅读1.3k次,点赞29次,收藏32次。1.当计算机突然断电时,( )中存储的信息会丢失。A.光盘 B.ROM C.RAM D.硬盘2.进程的状态有就绪态、运行态、阻塞态,其中( )的变化是不可能直接发生的。A.就绪态到运行态 B.阻塞态到就绪态 C.运行态到阻塞态 D.阻塞态到运行态3.分布式存储系统规划时至少要设计( )个节点。4.在CPU和主存之间设计 Cache的目的是( )。A.增大主存的带宽 B.扩大主存容量。_2023年下半年网络工程师上午真题

微信小程序底部tabbar自定义带弧度效果完整版案例_微信小程序定制底部菜单怎么做 中间是一个弧形-程序员宅基地

文章浏览阅读2.4k次。这是运行的效果:新建components组件文件夹,里面新建tabbarComponent文件夹,结构如下:tabbar.js代码:// tabBarComponent/tabBar.jsconst app = getApp();Component({ /** * 组件的属性列表 */ properties: { tabbar: { type: Object, value: { "backgroundColor": "#f_微信小程序定制底部菜单怎么做 中间是一个弧形

centos下的vim安装_centos. vim. setnu-程序员宅基地

文章浏览阅读3.3w次,点赞4次,收藏12次。一 . 大家的都知道Linux下是自带vi ,那么我们如何对vi使用呢?在centos下打开terminal,通过 touch aa.txt //新建一个名称为aa的文本文件。2. 用vi打开该文本 vi aa.txt3. 对文本进行操作,常用操作自行查找二. centos下安装vim,因为vi的功能没有vim丰富用yum查找源中的VIM包,不知安装哪个合适。yum search_centos. vim. setnu

文件系统缓存中两个重要参数: dirty_ratio与dirty_background_ratio-程序员宅基地

文章浏览阅读7.3k次,点赞4次,收藏11次。这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio两个参数的大小来实现。看了不少相关博文的介绍,不过一直弄不清楚这两个参数的区别在哪里,后来看了下面的一篇英文博客才大致了解了它们的不同。v..._dirty_background_ratio

iOS多线程编程指南(一)关于多线程编程-程序员宅基地

文章浏览阅读342次。第一章 关于多线程编程多年来,计算机的最大性能主要受限于它的中心微处理器的速度。然而由于个别处理器已经开始达到它的瓶颈限制,芯片制造商开始转向多核设计,让计算机具有了同时执行多个任务的能力。尽管Mac OS X利用了这些核心优势,在任何时候可以执行系统相关的任务,但自己的应用程序也可以通过多线程方法利用这些优势。1.1 什么是多线程多线程是一个比较轻

随便推点

warning: multi-character character constant-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏10次。warning: multi-character character constant 2011-05-14 16:33:57| 分类: C/C++|举报|字号 订阅 Dev-C++提示以上错误,经查是char类型字符只能存放一个单字符的原因,错误代码如下:'. '这个点符号后面跟了个空格,编译的时候会提示警告,但仍编译成功。运行的时候_warning: multi-character character constant

C++的n叉树族谱详细信息管理系统(可以查到谁是老师)_c++族谱总结-程序员宅基地

文章浏览阅读976次,点赞5次,收藏23次。#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0;//配偶typedef struct TreeNode{ int Num; //记录这个人拥有几个儿女 char Name[20]; //记录这个人的姓名 char Kind; //标._c++族谱总结

树莓派Pico迷你开发板扩展按键接口的方法及MicroPython编程_pico按钮原理图-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏8次。本文介绍利用一块树莓派Pico开发板、一块面包板、两个按键、1个LED发光二极管和7跟导线等少量元器件实现树莓派Pico扩展按键接口的方法,并给出所对应按键接口的MicroPython编程示例。一、树莓派Pico扩展按键接口的方法运用树莓派Pico开发板扩展按键的方法有两种。1、使用Pico开发板RP2040 MCU片内上拉电阻扩展按键接口Pico开发板主芯片采用的是树莓派基金会自研的MCU芯片,其型号是RP2040。使用Pico开发板RP2040 MCU片内上拉电阻扩展按键接口方法原理图见图1所示_pico按钮原理图

Android 4.0使用Kotlin调用C语言以及汇编语言-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏8次。如今,Google早已将Kotlin编程语言作为了头等语言(first-class programming language)用于Android开发中,并且在Android Studio中获得了非常全面的支持。与此同时,我们看到Google从Android Studio 3.0开始就已经支持了Java 8,过了这么多年仍然不对Java语言进行升级就能看到Google当前对Java已经持有相当冷淡的态度了,预计Java 8将是Android Studio最高能支持的Java版本了(*^_^*)。或许这跟Ora_kotlin调用c语言

Burp常见问题-程序员宅基地

文章浏览阅读753次,点赞20次,收藏23次。本文举例了几个常见的软件工具使用问题,文末会提供一些我自己整理和使用的工具资料。"在追逐零 Bug 的路上,我们不断学习、改进,更加坚定自己的技术信念。让我们相信,每一个 Bug 都是我们成长的机会。更多有关于VMware、Burp、Xshell、kali的问题可以关注博主后,在私信处拿链接,以后工具故障看这个就行给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。

SparkStreaming教程_sparkstreaming读取file文件java-程序员宅基地

文章浏览阅读334次。概要Spark流是对于Spark核心API的拓展,从而支持对于实时数据流的可拓展,高吞吐量和容错性流处理。数据可以由多个源取得,例如:Kafka,Flume,Twitter,ZeroMQ,Kinesis或者TCP接口,同时可以使用由如map,reduce,join和window这样的高层接口描述的复杂算法进行处理。最终,处理过的数据可以被推送到文件系统,数据库和HDFS。imag..._sparkstreaming读取file文件java