Java编程小技巧和基础案例分享

一、java介绍

1.Java语言的特点

面向对象

面向对象(OOP)就是Java语言的基础,也是Java语言的重要特性。面向对象的概念:生活中的一切事物都可以被称之为对象,生活中随处可见的事物就是一个对象,我们可以将这些事物的状态特征(属性)以及行为特征(方法)提取并出来,并以固定的形式表示。

简单好用

Java语言是由C和C++演变而来的,它省略了C语言中所有的难以理解、容易混淆的特性(比如指针),变得更加严谨、简洁、易使用。

健壮性

Java的安全检查机制,将许多程序中的错误扼杀在摇蓝之中。 另外,在Java语言中还具备了许多保证程序稳定、健壮的特性(强类型机制、异常处理、垃圾的自动收集等),有效地减少了错误,使得Java应用程序更加健壮。

安全性

Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击,从而可以提高系统的安全性。

平台无关性

Java平台无关性由Java 虚拟机实现,Java软件可以不受计算机硬件和操作系统的约束而在任意计算机环境下正常运行。

支持多线程

在C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持。多线程机制使应用程序在同一时间并行执行多项任务,该机制使得程序能够具有更好的交互性、实时性。

分布式(支持网络编程)

Java语言具有强大的、易于使用的网络能力,非常适合开发分布式计算的程序。java中提供了网络应用编程接口(java.net),使得我们可以通过URL、Socket等远程访问对象。

编译与解释共存

Java 是编译与解释共存的语言

2.Java语法基础

标识符

用来标识类名、对象名、变量名、方法名、类型名、数组名、文件名的有效字符序列。

合法的标识符

由字母、数字、下划线“_”、美元符号“$”或者“¥”组成,并且首字符不能是数字。
不能把java关键字和保留字作为标识符。
标识符对大小写敏感。


关键字

Java语言中已经赋予了特定含义的

保留字

const、goto,Java版本中尚未使用,但以后版本可能会作为关键字使用

变量

程序运行期间可以被改变的量。在程序中使用变量,必须先创建它并为它取一个名字,并且指明它能够存储信息的类型,这称为“变量声明”,也叫容器的创建。

变量的使用

变量的声明:数据类型 变量名;
变量的赋值:变量名 = 数据;
变量的操作:放入打印语句进行输出或者进行运算

Java 中的注释

单行注释
多行注释
文档注释

二、提升代码质量的技巧

1.使用有意义的命名:为类名、变量名、方法名等使用描述性的名称,使代码易于阅读和理解。

示例:

// 不推荐:
int a;
 
// 推荐:
int studentAge;

2.遵循编码规范:遵循统一的编码规范,例如Java编码规范 (Java Code Conventions)。 

遵循编码规范可以提高代码的可读性和可维护性。以下是一些遵循Java编码规范的示例:

(1)类名应使用驼峰命名规则,并以大写字母开头。

public class EmployeeRecord {
    // 类的成员和方法
}

(2)方法名和变量名应使用驼峰命名规则,首字母小写。

public void calculateSalary() {
    // 方法的实现
}
 
int numberOfStudents;

(3)常量名应使用全部大写字母,并用下划线分隔单词。

public static final int MAX_STUDENT_COUNT = 50;

(4)使用缩进(一般为4个空格)来表示代码块的层次结构。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        System.out.println("偶数: " + i);
    } else {
        System.out.println("奇数: " + i);
    }
}

(5)使用花括号来明确代码块的开始和结束,并确保代码的风格一致。

if (condition1) {
    // 逻辑1
} else if (condition2) {
    // 逻辑2
} else {
    // 默认逻辑
}

(6)在二元操作符之间使用空格,使代码更易读。

int sum = num1 + num2;
int product = num1 * num2;

(7)使用注释来解释代码的意图、实现方式或注意事项。

// 计算并返回两个数的和
public int add(int num1, int num2) {
    return num1 + num2;
}

3.注释清晰明了:使用注释解释代码的功能、目的和实现方式,方便他人理解和维护代码。

示例:

// 计算并返回两个数的和
public int add(int num1, int num2) {
    return num1 + num2;
}

4.编写简短而功能单一的方法:确保方法只有一个明确的功能,提高方法的可读性和可维护性。

编写简短而功能单一的方法可以将代码逻辑拆分为更小的部分,提高代码的清晰度和可维护性。以下是一个示例:

public class Calculator {
    public int add(int num1, int num2) {
        return num1 + num2;
    }
    
    public int subtract(int num1, int num2) {
        return num1 - num2;
    }
    
    public int multiply(int num1, int num2) {
        return num1 * num2;
    }
    
    public int divide(int num1, int num2) {
        if (num2 == 0) {
            throw new IllegalArgumentException("除数不能为零");
        }
        return num1 / num2;
    }
}

在上面的示例中,每个方法都只完成一个特定的数学运算,例如add方法用于执行加法操作,multiply方法用于执行乘法操作等。每个方法的功能明确,易于理解和维护。

如果将所有的运算逻辑都放在一个方法中,代码可能会变得冗长且难以阅读。通过将其拆分为多个简短的方法,可以使代码结构更清晰,同时也可以更方便地测试和重用这些独立的功能。

5.避免使用魔法数值:将常量或魔法数值定义为易于理解的变量,提高代码的可读性和可维护性。

示例:

// 不推荐:
if (score > 60 && score < 90) {
    // do something
}
 
// 推荐:
int passingScore = 60;
int excellentScore = 90;
if (score > passingScore && score < excellentScore) {
    // do something
}

6.处理异常并提供有意义的错误信息:避免捕获异常后忽略或无操作的情况,提供清晰明了的错误信息以便快速定位问题。

示例:

try {
    // 可能抛出异常的代码
} catch (Exception e) {
    logger.error("处理数据时出现错误:" + e.getMessage());
}

7.使用合适的数据结构:根据实际需求选择合适的数据结构,例如使用ArrayList代替数组,使用HashMap代替线性搜索等。

(1)使用ArrayList代替数组:

当需要处理可变长度的数据集合时,ArrayList是一种更常用的选择,因为它具有动态分配内存的能力,并且提供了许多有用的方法来操作集合数据。

import java.util.ArrayList;
import java.util.List;
 
public class Example {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
 
        System.out.println(names); // 输出: [Alice, Bob, Charlie]
    }
}

(2)使用HashMap代替线性搜索:


当需要根据键快速查找值时,HashMap是一种高效的数据结构。相比于线性搜索,HashMap可以通过哈希算法快速定位值,提供了更高的查找效率。

示例:

import java.util.HashMap;
import java.util.Map;
 
public class Example {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        scores.put("Alice", 90);
        scores.put("Bob", 80);
        scores.put("Charlie", 95);
 
        int score = scores.getOrDefault("Bob", 0);
        System.out.println("Bob的成绩是:" + score); // 输出: Bob的成绩是:80
    }
}

在实际开发中,根据具体需求选择合适的数据结构非常重要。例如,如果需要按照插入顺序访问元素,可以使用LinkedHashMap;如果需要保证唯一性,可以使用HashSet等。使用适当的数据结构可以提高代码的性能,并使代码更易于理解和维护。

三、基础案例分享

1.数值拆分

需求:一个三位数,将其拆分为个位、十位、百位后,打印在控制台

2.求三个整数的最大值

需求:定义三个整数,找出最大值并打印在控制台

分析

1.用三元运算符获取前两个整数的最大值, 并用临时变量保存起来

num1 > num2 ? num1 : num2;
2.用三元运算符,让临时最大值和第三个整数进行比较,并记录结果

temp > num3 ? temp : num3;
3.输出结果

3.键盘录入

需求:请完成Java程序与用户交互,比如录入用户输入的名称、年龄。

4.求和

需求:求1-5之间的数据和,并把求和结果在控制台输出

分析:

1.定义for循环使其能够依次访问到1、2、3、4、5.

2.在循环外定义一个整数变量sum用来累加这些数据

3.循环结束后,输出求和变量即是结果

public class Sum {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <=5 ; i++) {
            sum+=i;
        }
        System.out.println("1-5的和是"+sum);
    }
}

5.元素搜索---学生信息系统的数据搜索

需求:后台程序需存储学生信息并展示,然后要提供按学号搜索学生信息的功能

分析:

1.定义Student类,定义ArrayList集合存储学生对象信息,并遍历出来

2.提供一个方法,可以接收ArrayList集合,和要搜索的学号,返回搜索到的学生信息,并展示

3.使用死循环,让用户可以不停的搜索

public class Student {
    private String studyNumber;
    private String name;
    private int age;
    private String className;
 
    public Student() {
    }
 
    public Student(String studyNumber, String name, int age, String className) {
        this.studyNumber = studyNumber;
        this.name = name;
        this.age = age;
        this.className = className;
    }
 
    public String getStudyNumber() {
        return studyNumber;
    }
 
    public void setStudyNumber(String studyNumber) {
        this.studyNumber = studyNumber;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getClassName() {
        return className;
    }
 
    public void setClassName(String className) {
        this.className = className;
    }
}
public class Test {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("20180302", "叶孤城", 23, "护理一班"));
        students.add(new Student("20180303", "东方不败", 23, "推拿二班"));
        students.add(new Student("20180304", "西门吹雪", 26, "中药学四班"));
        students.add(new Student("20180305", "梅超风", 26, "神经科二班"));
        System.out.println("学号\t名称\t年龄\t班级");
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println(s.getStudyNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
        }
        //按照学号搜索功能
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入学号查询学生对象");
            String studentNumber = sc.next();
            Student s = getStudentById(students, studentNumber);
            if (s != null) {
                System.out.println(s.getStudyNumber() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getClassName());
            } else {
                System.out.println("查无此人");
            }
        }
    }
 
    /**
     * 根据学生的学号查询学生对象赶回
     *
     * @param students    存储全部学生对象的集合
     * @param studyNumber 搜索的学生的学号
     * @return 学生对象|null
     */
    public static Student getStudentById(ArrayList<Student> students, String studyNumber) {
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            if (s.getStudyNumber().equals(studyNumber)) {
                return s;
            }
        }
        return null;
    }
}

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 优化代码的小技巧 Java 是一种高级编程语言,它的执行效率往往受到程序设计的影响。因此,对 Java 程序进行优化可以提高程序的执行效率,减少内存占用,加快程序的响应速度。在本文中,我将介绍一些 Java 优化代码的小技巧,带着使用案例和截图,详细介绍哪些代码效率高。 1. 使用 StringBuilder 替代 String 在 Java 中,String 类型是不可变的,这意味着每次对字符串进行操作时都会创建一个新的字符串对象,从而导致内存占用增加。因此,如果需要频繁地对字符串进行操作,建议使用 StringBuilder 类型。StringBuilder 类型是可变的,可以对字符串进行修改,而不会创建新的字符串对象。 下面是一个使用 StringBuilder 的示例: ```java StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString(); ``` 在上面的示例中,我们使用 StringBuilder 类型创建了一个字符串,然后在循环中对其进行了修改。最后,我们将 StringBuilder 转换为 String 类型。 下面是一个使用 String 的示例: ```java String result = ""; for (int i = 0; i < 10000; i++) { result += i; } ``` 在上面的示例中,我们使用 String 类型创建了一个字符串,然后在循环中对其进行了修改。每次修改都会创建一个新的字符串对象。因此,这种方式会导致内存占用增加,效率低下。 下面是使用 StringBuilder 和 String 的示例的运行时间比较: ![String vs StringBuilder](https://i.imgur.com/tt4WdZj.png) 从上面的结果可以看出,使用 StringBuilder 的速度要比使用 String 快得多。 2. 使用数组代替 ArrayList 在 Java 中,ArrayList 类型是动态数组,可以自动扩容。但是,与数组相比,ArrayList 有一些缺点。例如,ArrayList 中的元素是对象类型,每个元素都需要占用一定的内存空间。此外,在添加和删除元素时,ArrayList 也需要进行数组的复制和移动操作,这会导致效率低下。 因此,如果需要处理大量数据时,建议使用数组类型。数组类型在创建时需要指定大小,但是它的元素类型是基本类型,不需要额外的内存空间。此外,在添加和删除元素时,数组不需要进行复制和移动操作,因此具有更高的效率。 下面是一个使用数组的示例: ```java int[] array = new int[10000]; for (int i = 0; i < array.length; i++) { array[i] = i; } ``` 在上面的示例中,我们使用数组类型创建了一个数组,然后在循环中对其进行了修改。 下面是一个使用 ArrayList 的示例: ```java List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { list.add(i); } ``` 在上面的示例中,我们使用 ArrayList 类型创建了一个动态数组,然后在循环中对其进行了修改。 下面是使用数组和 ArrayList 的示例的运行时间比较: ![ArrayList vs Array](https://i.imgur.com/cXqBQSu.png) 从上面的结果可以看出,使用数组的速度要比使用 ArrayList 快得多。 3. 使用局部变量代替全局变量 在 Java 中,局部变量和全局变量都可以被使用。但是,使用全局变量会导致内存占用增加,因为全局变量在程序启动时就会被创建,而且在整个程序中都可以被访问。此外,全局变量的作用域比较大,容易被误用。 因此,建议使用局部变量代替全局变量。局部变量只在方法中被创建,在方法结束后就会被销毁。这样可以减少内存占用,提高程序的响应速度。 下面是一个使用局部变量的示例: ```java public void test() { int count = 0; for (int i = 0; i < 10000; i++) { count += i; } System.out.println(count); } ``` 在上面的示例中,我们使用局部变量 count 计算一个数列的和。count 只在方法中被创建,在方法结束后就会被销毁。 下面是一个使用全局变量的示例: ```java int count = 0; public void test() { for (int i = 0; i < 10000; i++) { count += i; } System.out.println(count); } ``` 在上面的示例中,我们使用全局变量 count 计算一个数列的和。count 在程序启动时就会被创建,在整个程序中都可以被访问。 下面是使用局部变量和全局变量的示例的运行时间比较: ![Global vs Local](https://i.imgur.com/3J8aT1V.png) 从上面的结果可以看出,使用局部变量的速度要比使用全局变量快得多。 4. 使用多线程 在 Java 中,多线程可以让程序同时执行多个任务,从而提高程序的执行效率。多线程可以在多核处理器上并行执行任务,从而加快程序的响应速度。此外,多线程还可以避免一些长时间运行的操作阻塞程序的执行。 下面是一个使用多线程的示例: ```java public class TestThread extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.out.println(i); } } } public void test() { TestThread thread1 = new TestThread(); TestThread thread2 = new TestThread(); thread1.start(); thread2.start(); } ``` 在上面的示例中,我们创建了一个 TestThread 类,然后重写了 run 方法。在 test 方法中,我们创建了两个 TestThread 类的实例,并启动了两个线程。每个线程都会执行 run 方法中的循环,并输出 0 到 9999 的数。 下面是不使用多线程和使用多线程的示例的运行时间比较: ![Single vs Multi Thread](https://i.imgur.com/2kVbNtF.png) 从上面的结果可以看出,使用多线程的速度要比不使用多线程快得多。 总结 通过以上四个小技巧,可以有效地提高 Java 程序的执行效率。使用 StringBuilder 替代 String 可以减少内存占用,加快字符串的处理速度;使用数组代替 ArrayList 可以减少内存占用,加快数组的处理速度;使用局部变量代替全局变量可以减少内存占用,提高程序的响应速度;使用多线程可以让程序同时执行多个任务,提高程序的执行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值