자바 코드 최적화
11252 단어 자바
본 고 는 자바 의 성능 을 향상 시 키 는 몇 가지 기본 적 인 방법 을 제시 했다.
순환 조건 에서 계산 하지 마 세 요.
순환 (예 를 들 어 for 순환, while 순환) 조건 에서 계산 하면 한 번 순환 하면 한 번 계산 해 야 합 니 다. 이것 은 시스템 의 효율 을 낮 출 수 있 습 니 다. 예 를 들 어:
// count *2
while(i < count *2) {
//Do something ...
}
:
//
int total = count *2
while(i <total) {
//Do something ...
}
:
for (int i=0; i<size()*2; i++) {
//Do something
}
:
for (int i=0, stop=size()*2; i<stop; i++) {
//Do something
}
같은 하위 표현 식 을 여러 번 계산 하지 마 세 요.
if (birds.elementAt(i).isGrower()) ...
if (birds.elementAt(i).isPullet()) ...
, :
Bird bird = birds.elementAt(i);
if (bird.isGrower()) ...
if (bird.isPullet()) ...
, , 。
double[] rowsum = new double[n];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
rowsum[i] += arr[i][j];
:
double[] rowsum = new double[n];
for (int i = 0; i < n; i++) {
double[] arri = arr[i];
double sum = 0.0;
for (int j = 0; j < m; j++)
sum += arri[j];
rowsum[i] = sum;
}
가능 한 한 변수, 방법 을 final static 형식 으로 설명 합 니 다.
다음 예 는 주어진 연도 가 주어진 달 에 있 는 일 수 를 되 돌려 주 는 데 쓰 인 다.
public static int monthdays(int y, int m) {
int[] monthlengths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return m == 2 && leapyear(y) ? 29 : monthlengths[m-1];
}
상기 방법 은 매번 호출 될 때마다 monthlengths 배열 을 다시 만 들 지만 중요 한 것 은 배열 이 바 뀌 지 않 고 변 하지 않 는 배열 에 속한다.이런 상황 에서
이 를 final static 로 설명 하 는 것 이 더 적합 합 니 다. 클래스 로 불 러 온 후에 이 배열 을 생 성 합 니 다. 매번 방법 을 호출 할 때마다 배열 대상 을 다시 만 들 지 않 습 니 다. 이것 은 시스템 성능 을 향상 시 키 는 데 도움 이 됩 니 다.
:
private final static int[] monthlengths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
public static int monthdays(int y, int m) {
return m == 2 && leapyear(y) ? 29 : monthlengths[m-1];
}
static {… } , :
private final static double[] logFac = new double[100];
static {
double logRes = 0.0;
for (int i=1, stop=logFac.length; i<stop; i++)
logFac[i] = logRes += Math.log(i);
}
public static double logBinom(int n, int k) {
return logFac[n] - logFac[n-k] - logFac[k];
}
변수의 작용 범 위 를 축소 하 다
변 수 를 정의 할 수 있 는 방법 에 대한 정 의 는 방법 에 있 습 니 다. 순환 체 내 에 정의 할 수 있 는 것 은 순환 체 내 에 있 습 니 다. try.. catch 블록 에 배치 할 수 있 는 것 은 이 블록 안에 있 습 니 다.
GC 회수 에 박 차 를 가 하 는 것 이 목적 이다.
문자열 이 자주 "+" 동작 은 StringBuilder 나 StringBuffer 를 사용 합 니 다.
String 의 연결 작업 ("+") 은 이미 많은 최 적 화 를 했 지만 대량의 추가 작업 에서 StringBuilder 나 StringBuffer 는 "+" 보다 성능 이 훨씬 좋다.
String s = "";
for (int i=0; i<n; i++) {
s += "#" + i;
}
:
StringBuilder sbuf = new StringBuilder();
for (int i=0; i<n; i++) {
sbuf.append("#").append(i);
}
String s = sbuf.toString();
,
String s = "(" + x + ", " + y + ")";
StringBuilder.append(…)。
exception 을 덮어 쓰 는 fillIn StackTrace 방법
fillIn StackTrace 방법 은 이상 한 스 택 정 보 를 기록 하 는 데 사 용 됩 니 다. 이것 은 시간 이 많이 걸 리 는 동작 입 니 다. 개발 할 때 스 택 정 보 를 주목 하지 않 아 도 된다 면 덮어 쓸 수 있 습 니 다.
fillInStackTrace 를 덮어 쓰 는 사용자 정의 이상 은 성능 을 10 배 이상 향상 시 킵 니 다.
class MyException extends Exception {
public Throwable fillInStackTrace() {
return this;
}
}
초기 화 지연
대상 이 필요 한 지 모 를 때 초기 화 지연 을 선택 할 수 있 습 니 다. 필요 할 때 초기 화 되 지만 한 번 만 할당 할 수 있 습 니 다.
public class Car {
private Button button = new JButton();
public Car() {
... initialize button ...
}
public final JButton getButton() {
return button;
}
}
:
public class Car {
private Button button = null;
public Car() { ... }
public final JButton getButton() {
if (button == null) { // button not yet created, so create it
button = new JButton();
... initialize button ...
}
return button;
}
}
대상 만 들 기 반복 하지 않 기
예 를 들 어 상품 관련 정보의 업 데 이 트 는 검색 을 위해 색인 을 만들어 야 한다.
단일 상품 에 대한 색인 은 다음 과 같 습 니 다.
public void index(Product product) {
if (product != null) {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.index(product);
}
}
, , for , 。
public void indexAll(List<Product> products) {
if (products != null) {
for (Product product : products) {
index(product);
}
}
}
, Product , FullTextEntityManager 。 , :
public void indexAll(List<Product> products) {
if (products != null) {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
for (Product product : products) {
fullTextEntityManager.index(product);
}
}
}
Collections.emptyXXX ArrayList,HashSet
public Set<Specification> getAllSpecifications(ProductCategory productCategory) {
Set<Specification> specifications = new HashSet<Specification>();
if (null != productCategory) {
specifications.addAll(productCategory.getSpecifications());
specifications.addAll(productCategory.getParentSpecifications());
}
return specifications;
}
, productCategory , Set , Set 。
, , Collections emptySet() , , 。
:
public Set<Specification> getAllSpecifications(ProductCategory productCategory) {
if(productCategory == null){
return Collections.<Specification>emptySet();
}
Set<Specification> specifications = new HashSet<Specification>();
specifications.addAll(productCategory.getSpecifications());
specifications.addAll(productCategory.getParentSpecifications());
return specifications;
}
, , Map ,key id,value ,
Ajax 。 null, 。
public Map<Long, String> getSubCategoryTree(Long parentId) {
Map<Long, String> categoryOptions = new HashMap<Long, String>();
ProductCategory productCategory = productCategoryService.find(parentId);
if (null == productCategory) {
for (ProductCategory pc : productCategoryService.findRoots()) {
categoryOptions.put(pc.getId(), pc.getName());
}
} else {
for (ProductCategory pc : productCategory.getChildren()) {
categoryOptions.put(pc.getId(), pc.getName());
}
}
return categoryOptions;
}
,if-else productCategoryService.findRoots() productCategory.getChildren() , 。
, if-else , for 。
public Map<Long, String> getSubCategoryTree(Long parentId) {
Map<Long, String> categoryOptions = new HashMap<Long, String>();
ProductCategory productCategory = productCategoryService.find(parentId);
Collection<ProductCategory> productCategories = (productCategory == null) ? productCategoryService
.findRoots() : productCategory.getChildren();
for (ProductCategory pc : productCategories) {
categoryOptions.put(pc.getId(), pc.getName());
}
return categoryOptions;
}
else
private int getAttributeValueId(String value) {
if (StringUtils.isEmpty(value)) {
return -1;
} else {
String[] values = value.split(ATTRIBUTE_ID_SEPARATOR);
String id = values[values.length - 1];
return Integer.parseInt(id);
}
}
private int getAttributeValueId(String value) {
if (StringUtils.isEmpty(value)) {
return -1;
}
String[] values = value.split(ATTRIBUTE_ID_SEPARATOR);
String id = values[values.length - 1];
return Integer.parseInt(id);
}
더 이상 사용 할 필요 가 없 을 때 연결 자원 을 닫 습 니 다.
다음은 데이터 베 이 스 를 간단하게 조회 하 는 코드 입 니 다. 조회 작업 을 마 친 후에 연결 자원 이 null 인지 여 부 를 판단 합 니 다. null 이 아니라면 해당 하 는 close () 방법 으로 자원 을 닫 습 니 다.
Statement stmt = null;
ResultSet rs = null;
Connection conn = getConnection();
try{
stmt = conn.createStatement();
rs = stmt.executeQuery(sqlQuery);
progressResult(rs);
}catch(SQLException e){
//forward to handler
}finally {
if(rs !=null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn !=null){
conn.close();
}
}
, , rs close() , stmt conn 。
자원 을 모두 방출 할 수 있 도록 다음 과 같이 바 꿔 야 한다.
Statement stmt = null;
ResultSet rs = null;
Connection conn = getConnection();
try{
stmt = conn.createStatement();
rs = stmt.executeQuery(sqlQuery);
progressResult(rs);
}catch(SQLException e){
//forward to handler
}finally {
try{
if(rs !=null){
rs.close();
}
}catch(SQLException e){
//forward to handler
}finally{
try{
if(stmt !=null){
stmt.close();
}
}catch(SQLException e){
//forward to handler
}finally{
try{
if(conn !=null){
conn.close();
}
}catch(SQLException e){
//forward to handler
}
}
}
}
JDK1.7 , Java SE 7 try-with-resource 。
try(
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sqlQuery)){
progressResult(rs);
}catch(SQLException e){
//forward to handler
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.