목차
1. 클래스 멤버 및 메소드의 가시성을 최소화하세요
2.使用位移操作替代乘除法
3.尽量减少对变量的重复计算
4.不要捕捉RuntimeException
5.使用局部变量可避免在堆上分配
6.减少变量的作用范围
7.懒加载策略
8.访问静态变量直接使用类名
9.字符串拼接使用StringBuilder
10.重写对象的HashCode
11.HashMap等集合初始化
12.循环内创建对象引用
13.遍历Map 使用 EntrySet 方法
14.不要在多线程下使用同一个 Random
15.自增推荐使用LongAddr
16.程序中要少用反射
Java java지도 시간 Java 코드를 최적화하는 방법과 직장에서 사용할 수 있는 실용적인 팁은 무엇입니까?

Java 코드를 최적화하는 방법과 직장에서 사용할 수 있는 실용적인 팁은 무엇입니까?

May 09, 2023 am 08:16 AM
java

1. 클래스 멤버 및 메소드의 가시성을 최소화하세요

예: 프라이빗 메소드인 경우 삭제하려면 삭제하세요.

퍼블릭 서비스인 경우 메소드나 공개 멤버 변수는 크게 생각하지 말고 삭제하세요. publicservice方法,或者一个public的成员变量,删除一下,不得思考很多。

2.使用位移操作替代乘除法

计算机是使用二进制表示的,位移操作会极大地提高性能。

> 右移相当于除以 2;

>>> 无符号右移相当于除以 2,但它会忽略符号位,空位都以 0 补齐。

a = val << 3;
b = val >> 1;
로그인 후 복사

3.尽量减少对变量的重复计算

我们知道对方法的调用是有消耗的,包括创建栈帧、调用方法时保护现场,恢复现场等。

//反例
for (int i = 0; i < list.size(); i++) {
  System.out.println("result");
}
//正例
for (int i = 0, length = list.size(); i < length; i++) {
  System.out.println("result");
}
로그인 후 복사

list.size()很大的时候,就减少了很多的消耗。

4.不要捕捉RuntimeException

RuntimeException 不应该通过 catch 语句去捕捉,而应该使用编码手段进行规避。

如下面的代码,list 可能会出现数组越界异常。

是否越界是可以通过代码提前判断的,而不是等到发生异常时去捕捉。

提前判断这种方式,代码会更优雅,效率也更高。

public String test1(List<String> list, int index) {
    try {
        return list.get(index);
    } catch (IndexOutOfBoundsException ex) {
        return null;
    }
}
//正例
public String test2(List<String> list, int index) {
    if (index >= list.size() || index < 0) {
        return null;
    }
    return list.get(index);
}
로그인 후 복사

5.使用局部变量可避免在堆上分配

由于堆资源是多线程共享的,是垃圾回收器工作的主要区域,过多的对象会造成 GC 压力,可以通过局部变量的方式,将变量在栈上分配。这种方式变量会随着方法执行的完毕而销毁,能够减轻 GC 的压力。

6.减少变量的作用范围

注意变量的作用范围,尽量减少对象的创建。

如下面的代码,变量 s 每次进入方法都会创建,可以将它移动到 if 语句内部。

public void test(String str) {
    final int s = 100;
    if (!StringUtils.isEmpty(str)) {
        int result = s * s;
    }
}
로그인 후 복사

7.懒加载策略

尽量采用懒加载的策略,在需要的时候才创建

String str = "月伴飞鱼";
if (name == "公众号") {
  list.add(str);
}
if (name == "公众号") {
  String str = "月伴飞鱼";
  list.add(str);
}
로그인 후 복사

8.访问静态变量直接使用类名

使用对象访问静态变量,这种方式多了一步寻址操作,需要先找到变量对应的类,再找到类对应的变量。

 // 反例
int i = objectA.staticMethod();
 // 正例
int i = ClassA.staticMethod();
로그인 후 복사

9.字符串拼接使用StringBuilder

字符串拼接,使用 StringBuilder 或者 StringBuffer,不要使用 + 号。

//反例
public class StringTest {
    @Test
    public void testStringPlus() {
        String str = "111";
        str += "222";
        str += "333";
        System.out.println(str);
    }
}
//正例
public class TestMain {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("111");
        sb.append("222");
        sb.append(333);
        System.out.println(sb.toString());
    }
}
로그인 후 복사

10.重写对象的HashCode

重写对象的HashCode,不要简单地返回固定值

有同学在开发重写 HashCode 和 Equals 方法时,会把 HashCode 的值返回固定的 0,而这样做是不恰当的

当这些对象存入 HashMap 时,性能就会非常低,因为 HashMap 是通过 HashCode 定位到 Hash 槽,有冲突的时候,才会使用链表或者红黑树组织节点,固定地返回 0,相当于把 Hash 寻址功能无效了。

11.HashMap等集合初始化

HashMap等集合初始化的时候,指定初始值大小

这样的对象有很多,比如 ArrayList,StringBuilder 等,通过指定初始值大小可减少扩容造成的性能损耗。

初始值大小计算:

Java 코드를 최적화하는 방법과 직장에서 사용할 수 있는 실용적인 팁은 무엇입니까?

12.循环内创建对象引用

循环内不要不断创建对象引用

//反例
for (int i = 1; i <= size; i++) {
    Object obj = new Object();    
}
//正例
Object obj = null;
for (int i = 0; i <= size; i++) {
    obj = new Object();
}
로그인 후 복사

第一种会导致内存中有size个Object对象引用存在,size很大的话,就耗费内存了

13.遍历Map 使用 EntrySet 方法

使用 EntrySet 方法,可以直接返回 set 对象,直接拿来用即可;而使用 KeySet 方法,获得的是key 的集合,需要再进行一次 get 操作,多了一个操作步骤,所以更推荐使用 EntrySet 方式遍历 Map。

Set<Map.Entry<String, String>> entryseSet = nmap.entrySet();
for (Map.Entry<String, String> entry : entryseSet) {
    System.out.println(entry.getKey()+","+entry.getValue());
}
로그인 후 복사

14.不要在多线程下使用同一个 Random

Random 类的 seed 会在并发访问的情况下发生竞争,造成性能降低,建议在多线程环境下使用 ThreadLocalRandom 类。

 public static void main(String[] args) {
        ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
        Thread thread1 = new Thread(()->{
            for (int i=0;i<10;i++){
                System.out.println("Thread1:"+threadLocalRandom.nextInt(10));
            }
        });
        Thread thread2 = new Thread(()->{
            for (int i=0;i<10;i++){
                System.out.println("Thread2:"+threadLocalRandom.nextInt(10));
            }
        });
        thread1.start();
        thread2.start();
    }
로그인 후 복사

15.自增推荐使用LongAddr

自增运算可以通过 synchronized volatile 的组合来控制线程安全,或者也可以使用原子类(比如 AtomicLong)。

后者的速度比前者要高一些,AtomicLong 使用 CAS 进行比较替换,在线程多的情况下会造成过多无效自旋,可以使用 LongAdder 替换 AtomicLong 进行进一步的性能提升。

public class Test {
    public int longAdderTest(Blackhole blackhole) throws InterruptedException {
        LongAdder longAdder = new LongAdder();
        for (int i = 0; i < 1024; i++) {
            longAdder.add(1);
        }
        return longAdder.intValue();
    }
}
로그인 후 복사

16.程序中要少用反射

反射的功能很强大,但它是通过解析字节码实现的,性能就不是很理想。

现实中有很多对反射的优化方法,比如把反射执行的过程(比如 Method)缓存起来,使用复用来加快反射速度。

Java 7.0 之后,加入了新的包java.lang.invoke

2. 곱셈과 나눗셈 대신 변위 연산을 사용하세요🎜🎜컴퓨터는 이진 표현을 사용하므로 변위 연산은 성능을 크게 향상시킵니다. 🎜🎜> 오른쪽 시프트는 2로 나누는 것과 같습니다. 🎜🎜>> 부호 비트, 빈자리는 0으로 채워집니다. 🎜rrreee🎜3. 변수의 반복 계산 최소화🎜🎜우리는 스택 프레임 생성, 메서드 호출 시 장면 보호, 장면 복원 등을 포함하여 메서드 호출에는 비용이 많이 든다는 것을 알고 있습니다. 🎜rrreee🎜list.size()가 매우 크면 소비가 많이 줄어듭니다. 🎜🎜4. RuntimeException을 포착하지 마세요🎜🎜RuntimeException은 catch 문을 통해 포착되어서는 안 되지만, 코딩 방법을 사용하는 것은 피해야 합니다. 🎜🎜아래 코드와 같이 목록에서 배열 out-of-bound 예외가 발생할 수 있습니다. 🎜🎜범위를 벗어났는지 여부는 예외가 발생할 때까지 기다리지 않고 코드를 통해 미리 판단할 수 있습니다. 🎜🎜이 방법을 미리 판단해보시면 코드가 더욱 우아하고 효율적일 것입니다. 🎜rrreee🎜5. 힙 할당을 방지하려면 로컬 변수를 사용하세요🎜🎜힙 리소스는 여러 스레드에 의해 공유되고 가비지 수집기가 작동하는 주요 영역이므로 개체가 너무 많으면 GC 압력이 발생할 수 있습니다. 스택에 변수를 할당합니다. 이런 방식으로 메서드 실행이 완료되면 변수가 삭제되므로 GC에 대한 부담을 줄일 수 있습니다. 🎜🎜6. 변수의 범위를 줄입니다🎜🎜변수의 범위에 주의하고 객체 생성을 최소화하세요. 🎜🎜아래 코드와 같이 메소드가 입력될 때마다 변수 s가 생성되며, if 문 내부로 이동할 수 있습니다. 🎜rrreee🎜7. 지연 로딩 전략🎜🎜필요할 때만 생성하세요. 🎜rrreee🎜8. 정적 변수에 액세스하려면 클래스 이름을 직접 사용하세요.🎜🎜객체를 사용하여 정적 변수에 액세스하세요. more step. 주소 연산을 위해서는 먼저 변수에 해당하는 클래스를 찾은 다음 해당 클래스에 해당하는 변수를 찾아야 합니다. 🎜rrreee🎜9. 문자열 접합에는 StringBuilder를 사용하세요.🎜🎜문자열 접합에는 StringBuilder 또는 StringBuffer를 사용하세요. + 기호는 사용하지 마세요. 🎜rrreee🎜10. 객체의 HashCode를 다시 작성하세요🎜🎜객체의 HashCode를 다시 작성하세요. 단순히 고정된 값을 반환하지 마세요.🎜🎜일부 학생들은 재정의된 HashCode 및 Equals 메서드를 개발할 때 HashCode 값을 고정된 값 0으로 반환합니다. , 그리고 이것은 부적절합니다🎜🎜HashMap은 HashCode를 통해 Hash 슬롯을 찾기 때문에 이러한 객체를 HashMap에 저장하면 성능이 매우 저하됩니다. Red-Black 트리는 노드를 구성하고 고정적으로 0을 반환합니다. 이는 해시 주소 지정 기능을 무효화하는 것과 같습니다. 🎜🎜11. HashMap 등 컬렉션 초기화🎜🎜HashMap 등 컬렉션을 초기화할 때 초기값 크기를 지정하세요🎜🎜ArrayList, StringBuilder 등 이런 객체가 많습니다. 초기값 크기를 지정하면 성능이 저하됩니다. 확장으로 인한 현상을 줄일 수 있습니다. 🎜🎜🎜초기값 크기 계산: 🎜🎜🎜Java 작업에서 실용적인 코드 최적화 What />🎜🎜12. 루프 내에서 객체 참조 생성🎜<blockquote>🎜루프 내에서 객체 참조를 지속적으로 생성하지 마세요🎜</blockquote>rrreee🎜첫 번째 방법을 사용하면 size 객체 참조가 메모리, 크기가 너무 크면 메모리를 소모합니다🎜🎜13. Map을 탐색하려면 EntrySet 메소드를 사용하세요🎜🎜EntrySet 메소드를 사용하면 KeySet 메소드를 사용하면서 직접 설정된 객체를 반환하고 사용할 수 있습니다. 가져오기 작업을 수행하려면 작업 단계가 하나 더 필요하므로 EntrySet 메서드를 사용하여 맵을 탐색하는 것이 더 좋습니다. 🎜rrreee🎜14. 멀티 스레드에서 동일한 Random을 사용하지 마세요🎜🎜 Random 클래스의 시드는 동시 액세스 중에 경쟁하므로 성능이 저하됩니다. 멀티 스레드 환경에서는 ThreadLocalRandom 클래스를 사용하는 것이 좋습니다. 🎜rrreee🎜15 자동 증가에는 LongAddr을 사용하는 것이 좋습니다🎜🎜 자동 증가 작업은 <code>synchronized </code> 및 <code>휘발성 </code>의 조합을 통해 스레드 안전성을 제어할 수 있습니다. 원자 클래스(예: AtomicLong )를 사용할 수도 있습니다. 🎜🎜후자가 전자보다 빠릅니다. <code>AtomicLong</code>은 CAS를 사용하여 비교 및 ​​교체를 수행합니다. 스레드가 많으면 잘못된 스핀이 너무 많이 발생하므로 추가 성능 향상을 위해 LongAdder를 사용할 수 있습니다. . 🎜rrreee🎜16. 프로그램에서 리플렉션을 덜 사용하세요🎜🎜리플렉션은 매우 강력하지만 바이트코드를 구문 분석하여 구현되므로 성능이 그다지 이상적이지 않습니다. 🎜🎜실제로는 반사 실행 프로세스(예: 메서드)를 캐싱하고 다중화를 사용하여 반사 속도를 높이는 등 반사를 위한 최적화 방법이 많이 있습니다. 🎜🎜Java 7.0 이후에는 새로운 패키지 <code>java.lang.invoke</code>가 추가되었고, JVM 레벨의 문자열을 통해 대상 메소드에 대한 직접 액세스를 지원하기 위해 새로운 JVM 바이트코드 명령인 Invokedynamic이 추가되었습니다. 🎜

위 내용은 Java 코드를 최적화하는 방법과 직장에서 사용할 수 있는 실용적인 팁은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

자바의 제곱근 자바의 제곱근 Aug 30, 2024 pm 04:26 PM

자바의 제곱근 안내 여기서는 예제와 코드 구현을 통해 Java에서 Square Root가 어떻게 작동하는지 설명합니다.

자바의 완전수 자바의 완전수 Aug 30, 2024 pm 04:28 PM

Java의 완전수 가이드. 여기서는 정의, Java에서 완전 숫자를 확인하는 방법, 코드 구현 예제에 대해 논의합니다.

Java의 난수 생성기 Java의 난수 생성기 Aug 30, 2024 pm 04:27 PM

Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

자바의 웨카 자바의 웨카 Aug 30, 2024 pm 04:28 PM

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

자바의 암스트롱 번호 자바의 암스트롱 번호 Aug 30, 2024 pm 04:26 PM

자바의 암스트롱 번호 안내 여기에서는 일부 코드와 함께 Java의 Armstrong 번호에 대한 소개를 논의합니다.

Java의 스미스 번호 Java의 스미스 번호 Aug 30, 2024 pm 04:28 PM

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

Java Spring 인터뷰 질문 Java Spring 인터뷰 질문 Aug 30, 2024 pm 04:29 PM

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Java 8 Stream foreach에서 나누거나 돌아 오시겠습니까? Feb 07, 2025 pm 12:09 PM

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

See all articles