Java入坑之语法糖

news2024/9/25 11:17:07

一、for和for-each

1.1for和for-each概念

for 循环是一种常用的循环结构,它可以通过一个变量(通常是 i)来控制循环的次数和范围。for 循环的语法格式如下:

for (初始化; 布尔表达式; 更新) {
  //代码语句
}

for-each 循环是 Java 1.5 的新特性之一,它可以方便地遍历数组或集合中的元素,而不需要使用下标或迭代器。for-each 循环的语法格式如下:

for (元素类型t 元素变量x : 遍历对象obj) {
  //引用了x的java语句;
}

for 和 for-each 循环的效率和适用性取决于遍历对象的数据结构。一般来说,对于数组或 ArrayList 这样基于数组的数据结构,使用 for 循环更快,因为它可以直接通过下标访问元素,而不需要额外的对象创建和类型转换。对于 LinkedList 这样基于链表的数据结构,使用 for-each 循环更快,因为它可以直接获取元素的值,而不需要每次都调用 get 方法进行遍历。

1.2for-each优缺点

二、枚举

 枚举是一种特殊的类,它用来表示一组有限的常量,比如季节、颜色、方向等。枚举可以提高代码的可读性和安全性,避免使用硬编码的字符串或整数来表示常量。枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

Java的enum类型
-所有的enum类型都是Enum的子类,也继承了相应方法

  1. ordinal()返回枚举值所在的索引位置, 从0开始
    // 定义一个枚举类型 Season,表示四个季节
    enum Season {
      SPRING, SUMMER, AUTUMN, WINTER;
    }
    
    // 在主方法中,使用 values() 方法获取所有的枚举值,并打印出它们的 ordinal 值
    public class Main {
      public static void main(String[] args) {
        // 获取所有的枚举值
        Season[] seasons = Season.values();
        // 遍历枚举值
        for (Season s : seasons) {
          // 打印出每个枚举值的 ordinal 值
          System.out.println(s + " 的 ordinal 值是 " + s.ordinal());
        }
      }
    }
    
  2. compareTo()比较两个枚举值的索引位置大小
    public class Test {
        public static void main(String[] args) {
            // 定义两个枚举值
            Season s1 = Season.SPRING;
            Season s2 = Season.WINTER;
            // 使用compareTo()方法比较它们的索引位置大小
            int result = s1.compareTo(s2);
            // 输出结果
            System.out.println(result); // -3
        }
    }
    
    // 定义一个枚举类Season
    enum Season {
        SPRING, SUMMER, AUTUMN, WINTER
    }
    
  3. toString()返回枚举值的字符串表示
    public class Test {
        public static void main(String[] args) {
            // 定义三个枚举值
            Color c1 = Color.RED;
            Color c2 = Color.GREEN;
            Color c3 = Color.BLUE;
            // 使用toString()方法获取它们的字符串表示
            System.out.println(c1.toString()); // 红色
            System.out.println(c2.toString()); // 绿色
            System.out.println(c3.toString()); // 蓝色
        }
    }
    
    // 定义一个枚举类Color,并重写toString()方法
    enum Color {
        RED, GREEN, BLUE;
    
        @Override
        public String toString() {
            switch (this) {
                case RED:
                    return "红色";
                case GREEN:
                    return "绿色";
                case BLUE:
                    return "蓝色";
                default:
                    return "未知颜色";
            }
        }
    }
    
  4. valueOf()将字符串初始化为枚举对象
    public class Test {
        public static void main(String[] args) {
            // 定义一个字符串
            String s = "GREEN";
            // 使用valueOf()方法将字符串转换为枚举值
            Color c = Color.valueOf(s);
            // 输出结果
            System.out.println(c); // GREEN
        }
    }
    
    // 定义一个枚举类Color
    enum Color {
        RED, GREEN, BLUE
    }
    
  5. values()返回所有的枚举值
    public class Test {
        public static void main(String[] args) {
            // 使用values()方法返回一个包含所有枚举值的数组
            Season[] seasons = Season.values();
            // 输出数组的长度和内容
            System.out.println(seasons.length); // 4
            for (Season season : seasons) {
                System.out.println(season); // SPRING, SUMMER, AUTUMN, WINTER
            }
        }
    }
    
    // 定义一个枚举类Season
    enum Season {
        SPRING, SUMMER, AUTUMN, WINTER
    }
    

三、不定项参数

Java不定项参数是一种可以接受不确定个数的同类型参数的方法,它可以用于简化方法的重载和数组的传递。不定项参数的语法是在参数类型后面加上三个点(…),表示该参数可以接受零到多个值,编译器会将这些值封装成一个数组传递给方法。

//定义一个不定项参数的方法,用于求和
public static int sum (int... nums) {
    int total = 0;
    for (int num : nums) {
        total += num;
    }
    return total;
}

//调用不定项参数的方法,可以传入任意个数的int值
System.out.println (sum ()); //输出0
System.out.println (sum (1)); //输出1
System.out.println (sum (1, 2, 3)); //输出6
System.out.println (sum (new int [] {4, 5, 6})); //输出15,也可以直接传入一个数组

四、静态导入 

静态导入是Java 5中引入的一种新特性,它可以让你在不使用类名的情况下,直接访问类中的静态成员变量和方法。静态导入的语法是:

import static package.ClassName.fieldName|methodName;

或者

import static package.ClassName.*;

第一种语法可以导入指定类中的某个静态成员变量或方法,第二种语法可以导入指定类中的所有静态成员变量和方法。例如,如果你想使用Math类中的PI常量和sqrt方法,你可以使用静态导入:

import static java.lang.Math.PI;
import static java.lang.Math.sqrt;

 五、自动装箱和拆箱

自动装箱和拆箱是Java中的一种特性,它可以让基本数据类型和对应的包装类之间自动地相互转换。例如,int类型可以自动转换为Integer对象,Integer对象可以自动转换为int值。这样可以方便地在面向对象和基本类型之间进行切换,简化代码的编写。

六、多异常并列

多异常并列是Java 7中引入的一种特性,它可以让你在一个catch块中捕获多个不同类型的异常,并用同样的方式来处理它们。这样可以避免重复的代码和逻辑,简化异常处理的过程。

多异常并列使用时要注意以下几点:

  • 一个catch块中只能有一个异常对象,不能写成catch (ExceptionType1 e1 | ExceptionType2 e2 | … e3)这样的形式。
  • 多个异常类型之间不能有继承关系,否则会造成编译错误。例如,不能写成catch (IOException | FileNotFoundException e),因为FileNotFoundException是IOException的子类。
  • 如果有多个catch块,那么多异常并列的catch块应该放在最前面,否则会被其他catch块覆盖。例如,不能写成catch (Exception e) {…} catch (NumberFormatException | ArithmeticException e) {…},因为Exception是所有异常的父类。
public class Test {
    public static void main(String[] args) {
        try {
            int a = Integer.parseInt("abc"); //可能抛出NumberFormatException
            int b = 10 / 0; //可能抛出ArithmeticException
        } catch (NumberFormatException | ArithmeticException e) {
            //这个catch块可以捕获两种异常,并统一处理
            System.out.println("发生了数学错误:" + e.getMessage());
        } catch (Exception e) {
            //这个catch块可以捕获其他类型的异常,并单独处理
            System.out.println("发生了其他错误:" + e.getMessage());
        }
    }
}

 上面的代码中,第一个catch块使用了多异常并列的语法,可以同时捕获NumberFormatException和ArithmeticException,并输出它们的信息。第二个catch块可以捕获其他类型的异常,并输出它们的信息。这样就可以避免重复的代码和逻辑,简化异常处理的过程。

如果你把两个catch块的顺序颠倒,那么就会造成编译错误,因为第一个catch块会捕获所有类型的异常,包括NumberFormatException和ArithmeticException,那么第二个catch块就永远不会被执行。这就违反了多态和重载的规则,所以编译器会提示错误。

七、整数类型用二进制表示

7.1二进制

 7.2下划线

 八、接口

8.1接口的默认方法

接口的默认方法是Java 8中引入的一种新特性,它可以让接口中定义一些带有具体实现的方法,而不需要实现类去实现这些方法。这样可以方便地为接口添加新的功能,而不影响已有的实现类。接口的默认方法的语法是在方法名前面加上default关键字,

public interface MyInterface {
    // 普通的抽象方法
    void abstractMethod();
    // 默认方法
    default void defaultMethod() {
        System.out.println("这是一个默认方法");
    }
}

 接口的默认方法有以下几个作用:

  • 兼容性:接口的默认方法可以让接口在不破坏现有代码的情况下,向后兼容地添加新的方法。这样就不需要修改所有实现了该接口的类,而只需要在需要的地方重写或调用默认方法即可。
  • 多继承:接口的默认方法可以让一个类实现多个接口,而不用担心接口之间有相同的方法签名。如果一个类实现了多个接口,且这些接口有相同的默认方法,那么这个类必须重写这个默认方法,或者使用super关键字来指定调用哪个接口的默认方法。
  • 扩展性:接口的默认方法可以让接口提供一些通用的功能,而不需要在每个实现类中重复编写相同的代码。例如,List接口中就提供了一个sort方法,它可以对列表进行排序,而不需要每个列表类都实现自己的排序算法。

 8.2接口的静态方法

接口的静态方法是Java 8中引入的一种新特性,它可以让接口中定义一些带有具体实现的静态方法,而不需要实现类去调用这些方法。这样可以方便地为接口提供一些与接口相关的工具方法,或者一些通用的逻辑。接口的静态方法的语法是在方法名前面加上static关键字,例如:

public interface MyInterface {
    // 普通的抽象方法
    void abstractMethod();
    // 静态方法
    static void staticMethod() {
        System.out.println("这是一个静态方法");
    }
}

接口的静态方法有以下几个特点:

  • 接口的静态方法只能通过接口名来调用,不能通过实现类或者实现类的对象来调用。例如,MyInterface.staticMethod(); 可以调用静态方法,但是 MyClass.staticMethod(); 或者 new MyClass().staticMethod(); 都会报错。
  • 接口的静态方法不能被实现类继承或者重写,也不能被子接口继承或者重写。如果实现类或者子接口中定义了与接口中静态方法相同签名的方法,那么这个方法和接口中的静态方法没有任何关系,只是一个普通的方法。
  • 接口的静态方法可以访问接口中定义的常量,但是不能访问接口中定义的抽象方法和默认方法。如果需要在静态方法中调用抽象方法或者默认方法,可以通过传入一个实现类的对象作为参数来实现。

 8.3接口的私有方法

接口的私有方法是Java 9中引入的一种新特性,它可以让接口中定义一些带有具体实现的私有方法,而不需要实现类去实现或调用这些方法。这样可以方便地为接口提供一些与接口相关的工具方法,或者一些通用的逻辑。接口的私有方法的语法是在方法名前面加上private关键字,例如:

public interface MyInterface {
    // 普通的抽象方法
    void abstractMethod();
    // 私有方法
    private void privateMethod() {
        System.out.println("这是一个私有方法");
    }
}

接口的私有方法有以下几个作用:

  • 封装性:接口的私有方法可以让接口中的一些细节或者辅助功能被隐藏起来,而不暴露给外部。这样可以保护接口的内部逻辑,避免被误用或者滥用。
  • 复用性:接口的私有方法可以让接口中的一些重复或者相似的代码被抽取出来,而不需要在每个默认方法或者静态方法中重复编写。这样可以提高代码的复用性和可维护性。
  • 灵活性:接口的私有方法可以让接口中的默认方法或者静态方法更加灵活和简洁,而不需要包含过多的代码或者逻辑。这样可以提高代码的可读性和可扩展性。

 8.4接口与抽象类

 九、try-with-resources

try-with-resources是Java 7中引入的一种特性,它可以让你在一个try语句中声明一个或多个需要关闭的资源,比如文件,流,套接字等。try-with-resources语句可以确保在语句结束后,每个资源都会被自动关闭,无论是否发生异常。这样可以避免手动关闭资源的麻烦,也可以避免资源泄漏的风险。

try-with-resources语句的语法是:

try (ResourceType resource = new ResourceType(...)) {
    // 使用资源的代码
} catch (ExceptionType e) {
    // 处理异常的代码
}

其中,ResourceType是要关闭的资源的类型,它必须实现AutoCloseable接口,这个接口只有一个方法close(),用于释放资源。resource是要关闭的资源的对象,它必须在try语句中声明和初始化。你可以在一个try语句中声明多个资源,只要用分号隔开即可。例如:

try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
     PrintWriter pw = new PrintWriter(new FileWriter("output.txt"))) {
    // 读写文件的代码
} catch (IOException e) {
    // 处理异常的代码
}

这样,无论读写文件的代码是否正常执行,br和pw都会被自动关闭。

十、ResourceBundle

ResourceBundle是Java中的一个类,它可以用于实现国际化(i18n)的功能,也就是让程序能够根据不同的语言和地区显示不同的信息。ResourceBundle可以从不同的文件中加载语言和地区相关的数据,比如属性文件(.properties)或者Java类文件(.java)。ResourceBundle可以根据用户的Locale(语言和地区)自动选择合适的文件,也可以手动指定要加载的文件。ResourceBundle可以通过键值对的方式存储和获取数据,也可以通过下标的方式存储和获取数据。ResourceBundle有两个常用的子类:PropertyResourceBundle和ListResourceBundle,分别对应属性文件和Java类文件。 

10.1多语言支持

在Java程序中实现多语言支持的一种常用方法是使用ResourceBundle类,它可以从不同的文件中加载语言和地区相关的数据,比如属性文件(.properties)或者Java类文件(.java)。ResourceBundle类可以根据用户的Locale(语言和地区)自动选择合适的文件,也可以手动指定要加载的文件。ResourceBundle类可以通过键值对的方式存储和获取数据,也可以通过下标的方式存储和获取数据。

要使用ResourceBundle类,你需要按照以下步骤进行:

  • 第一步,创建一个或多个资源文件,每个资源文件都有一个基名和一个本地信息的附加部分,比如messages_zh_CN.properties表示基名为messages,本地信息为zh_CN(简体中文)的属性文件。每个资源文件中都定义了一些键值对,用来存储不同语言的文本信息。例如:
username=用户名
password=密码
  • 第二步,创建一个ResourceBundle对象,使用getBundle方法来加载资源文件,并传入基名和Locale对象。例如:
Locale locale = Locale.getDefault(); // 获取默认的语言和地区
ResourceBundle bundle = ResourceBundle.getBundle("messages", locale); // 加载资源文件
  • 第三步,使用ResourceBundle对象的getString方法来获取指定键对应的值,并显示在程序中。例如:
String username = bundle.getString("username"); // 获取用户名对应的文本
String password = bundle.getString("password"); // 获取密码对应的文本
System.out.println(username + ": " + password); // 输出文本

十一、var类型

var类型是Java 10中引入的一种特性,它可以让你在声明局部变量时不需要显式地指定变量的类型,而是让编译器根据变量的初始值来推断变量的类型。var类型可以简化代码的编写,避免重复的类型名称,也可以用于处理匿名类型或者复杂的表达式。不过,var类型也有一些限制和注意事项,比如只能用于局部变量,不能用于类的成员变量,必须在声明时赋初始值,不能赋null值,不能用于多个变量的声明等等。

 

 

十二、Switch

 

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

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

相关文章

数据库系统的三级模式和二级映射

数据库系统的三级模式结构基本概念模式(schema)外模式(external schema)内模式 (Internal Schema) 数据库系统的二级映射外模式/模式映象模式/内模式映象 总结感谢 💖 数据库系统的三级模式结构 数据库系统…

Web安全与攻防

Web安全概述 在Internet大众化及Web技术飞速演变的今天,在线安全所面临的挑战日益严峻。伴随着在线信息和服务的可用性的提升,以及基于Web的攻击和破坏的增长,安全风险达到了前所未有的高度。Web安全可以从以下三个方面进行考虑:…

Matlab图像处理-从RGB转换为HSV

从RGB转换为HSV HSV彩色系统基于圆柱坐标系。从RGB转换为HSV需要开发将(笛卡儿坐标系中的)RGB值映射到圆柱坐标系的公式。多数计算机图形学教材中已详细推导了这一公式,故此处从略。 从RGB转换为HSV的MATLAB函数是rgb2hsv,其语法为: hsv_imag…

商业综合体AI+视频安防监控与智能监管解决方案

一、方案背景 商业综合体需要具备更好的品质和环境才能吸引更多客流,如何有效地进行内部管理、外部引流,是综合体管理人员思考的重点。 传统的视频监控需要靠人盯牢屏幕或者发生报警后通过查看录像,才能找到意外事件相关人员与起因&#xf…

VMware启用共享文件夹

1. 启用 编辑虚拟机设置 - 选项 - 共享文件夹 - 总是启用 - 添加 2. 启动Ubuntu查看 正常情况/mnt目录会出现文件夹hgfs 如果不存在,可参考 这篇文章 操作 如果安装VMWare tools后/mnt中有hgfs但没共享文件,可参考 这篇文章 如果出现 mount: unkno…

Mac 安装软件各种报错解决方案

Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx",因为它不是从App Store下载三. 无法打开"xxx",因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…

执行 git remote add github git@github.com:xxxx/testGit.git时,git内部做了啥?

git remote add 往 .git/config 中写入了一个叫 [remote "origin"] 配置 url → 表示该远程名称对应的远程仓库地址fetch 参数分为两部分,以冒号 : 进行分割冒号左边 ☞ 本地仓库文件夹冒号右边 ☞ 远程仓库在本地的副本文件夹 ☞ 往里面添加数据的意思 可…

pgzrun 拼图游戏制作过程详解(6,7)

6. 检查拼图完成 初始化标记成功的变量Is_Win Is_WinFalse 当鼠标点击小拼图时,判断所有小拼图是否都在正确的位置,并更新Is_Win。 def on_mouse_down(pos,button): # 当鼠标被点击时# 略is_win Truefor i in range(6):for j in range(4):Square S…

今天早上在使用Layui的时候,排查出了自己的BUG

昨天使用的时候,一直渲染不出来,今天,翻看了文档找到了问题特意,留了一个,field写成了filed,辛辛苦找了半天 ... /委屈差点错怪了Layui

【Transformer系列】深入浅出理解Tokenization分词技术

一、参考资料 NLP技术中的Tokenization是什么?核心任务是什么? 二、Tokenization相关介绍 1. Tokenization的概念 NLP技术中Tokenization被称作是“word segmentation”,直译为分词。具体来说,分词是NLP的基础任务&#xff0c…

如何优化你的Vue.js应用以获得最佳性能

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

C++版本的OpenCV实现二维图像的卷积定理(通过傅里叶变换实现二维图像的卷积过程,附代码!!)

C版本的OpenCV库实现二维图像的卷积定理过程详解 前言一、卷积定理简单介绍二、不同卷积过程对应的傅里叶变换过程1、“Same”卷积2、“Full”卷积3、“Valid”卷积 三、基于OpenCV库实现的二维图像卷积定理四、基于FFTW库实现的二维图像卷积定理五、总结与讨论 前言 工作中用…

基于matlab实现的弹簧振动系统模型程序(动态模型)

完整代码: clear all; %System data m1.0; zeta0.01; omega01.0; Dt1.0; f01.0; x00.0; dotx00.0; xmaxsqrt(x0^2(dotx0/omega0)^2)min([0.5*abs(f0)*Dt/(m*omega0) f0/omega0^2]); omegadomega0*sqrt(1-zeta^2); dt00.1*pi/omega0; nstep500; a0.70; b0.…

Python爬虫(二十)_动态爬取影评信息

本案例介绍从JavaScript中采集加载的数据。更多内容请参考:Python学习指南 #-*- coding:utf-8 -*- import requests import re import time import json#数据下载器 class HtmlDownloader(object):def download(self, url, paramsNone):if url is None:return Noneuser_agent …

Echarts 雷达图的详细配置过程

文章目录 雷达图 简介配置步骤简易示例 雷达图 简介 Echarts雷达图是一种常用的数据可视化图表类型,用于展示多个维度的数据在同一坐标系下的分布情况。雷达图通过不同的坐标轴表示不同的维度,数据点的位置表示了各个维度的数值大小。 Echarts雷达图的…

035:vue项目中 radio和checkbox美化方法

第035个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

基于matlab实现的中点放炮各类地震波时距曲线程序

完整程序&#xff1a; clear all dx50;x-500:dx:500;%炮检距 h100;V11500; theta25*pi/180; V2V1/sin(theta); t1sqrt(x.*x4*h*h)/V1;%反射波时距曲线 t2abs(x)./V1;%直达波时距曲线 %折射波时距曲线 xm2*h*tan(theta);%求盲区 k1; for i1:length(x) if x(i)<-xm …

JVM 篇

一、知识点汇总 其中内存模型&#xff0c;类加载机制&#xff0c;GC是重点方面。性能调优部分更偏向应用&#xff0c;重点突出实践能力。编译器优化和执行模式部分偏向于理论基础&#xff0c;重点掌握知识点。 内存模型&#xff1a;各部分作用&#xff0c;保存哪些数据。类加载…

Python if条件分支结构

视频版教程 Python3零基础7天入门实战视频教程 如果 Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上向下依次执行。 但是现实生活中&#xff0c;我经常遇到一些需要做判断的业务流程。比如去银行ATM取款&#xff0c;如果密码输入正确&#xff0c;则可以…

基于matlab实现的额特征线法管道瞬变流计算程序

完整曲线&#xff1a; % 假设阀门瞬间关闭 % 初始数据: clear tic L3000; % 管线长度 Hr70; % 泵压力 N10; % 分段数 NSN1; % 节点数 e0.001651; % 壁厚m,0.065 D0.00635-2*e; % 管道内径 K2.1e9; % 流体体积弹性系数 Rho…