java 새로운 특성의 for 순환 가장 완전한 용법 총결산

12069 단어 javafor순환
1. 개요 기능 향상
for 순환 강화, 포레치 순환이라고도 하는데 수조와 용기 (집합류) 를 두루 돌아다니는 데 쓰인다.foreach를 사용하여 수조와 집합 원소를 순환할 때 수조와 집합 길이를 얻을 필요가 없고 색인에 따라 수조 원소와 집합 원소에 접근할 필요가 없어 효율이 크게 높아지고 코드도 간결하다.
2. Oracle 홈페이지의 설명
So when should you use the for-each loop? Any time you can. It really beautifies your code. Unfortunately, you cannot use it everywhere. Consider, for example, the expurgate method. The program needs access to the iterator in order to remove the current element. The for-each loop hides the iterator, so you cannot call remove. Therefore, the for-each loop is not usable for filtering. Similarly it is not usable for loops where you need to replace elements in a list or array as you traverse it. Finally, it is not usable for loops that must iterate over multiple collections in parallel. These shortcomings were known by the designers, who made a conscious decision to go with a clean, simple construct that would cover the great majority of cases.
그래서 포-each 순환은 언제 사용해야 합니까?언제든지.이것은 정말 너의 코드를 미화한다.불행하게도, 너는 어디에서도 그것을 사용할 수 없다.예를 들어 삭제 방법과 같은 상황을 고려한다.현재 요소를 제거하기 위해서 이 프로그램은 교체기에 접근해야 합니다.for-each 순환에 교체기가 숨겨져 있기 때문에 삭제 기능을 호출할 수 없습니다.따라서 for-each 순환은 필터 요소에 적용되지 않습니다.마찬가지로 집합이나 그룹을 반복할 때 원소를 교체해야 하는 순환도 적용되지 않는다.마지막으로, 이것은 여러 개의 집합 교체에서 병렬 순환 사용에 적용되지 않는다.디자이너는 이러한 결함을 이해하고 의식적으로 깨끗하고 간단한 구조를 설계하여 이런 상황을 피해야 한다.관심 있는 사람은 홈페이지의 API를 볼 수 있습니다. 홈페이지에서 API를 어떻게 찾는지 모르면 홈페이지를 열어 API 방법을 보십시오.
3. 포맷 향상

for(    :  ){

 java ;

}
홈페이지 설명:
for (TimerTask t : c)
t.cancel();
When you see the colon (:) read it as “in.” The loop above reads as “for each TimerTask t in c.” As you can see, the for-each construct combines beautifully with generics. It preserves all of the type safety, while removing the remaining clutter. Because you don't have to declare the iterator, you don't have to provide a generic declaration for it. (The compiler does this for you behind your back, but you need not concern yourself with it.)
다음을 참조하십시오.
사칭 (:) 을 보면 "들어와."라고 읽습니다.위의 순환은 "c의 모든 TimerTask 요소를 반복합니다."라고 읽습니다.보시다시피 for-each 구조는 범용과 완벽하게 결합되어 있습니다.그것은 모든 종류의 안전성을 보존하고 나머지 혼란을 제거한다.너는 교체기를 성명할 필요가 없기 때문에, 너는 그것을 위해 일반적인 성명을 제공할 필요가 없다.(컴파일러는 네 뒤에서 이미 만들었으니, 너는 그것에 관심을 가질 필요가 없다.)
간단한 체험:
1. 반복 수조에 대한 강화

package cn.jason01;
// for 
public class ForTest01 {
 public static void main(String[] args) {
 int[] array={1,2,3};
 for(int element: array){
 System.out.println(element);
 }
 }
}

2. 반복 집합을 위한 강화

package cn.jason01;

import java.util.ArrayList;

public class ForTest {
 public static void main(String[] args) {
 //  , String
 ArrayList<String> array = new ArrayList();
 array.add("a");
 array.add("b");
 array.add("c");
 for (String string : array) {
 System.out.println(string);
 }

 }
}
4. 밑바닥 원리에 대한 강화
코드 먼저 보기

package cn.jason01;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *  for 
 * 
 * @author cassandra
 * @version 1.1
 */
public class ForTest {
	public static void main(String[] args) {
		//  , String. 。
		ArrayList<String> array = new ArrayList();
		//  
		array.add("a");
		array.add("b");
		array.add("c");

		//  for 
		System.out.println("----enhanced for----");
		for (String string : array) {
			System.out.println(string);
		}

		//  , 
		System.out.println("---reverse compile---");
		String string;
		for (Iterator iterator = array.iterator(); iterator.hasNext(); System.out.println(string)) {
			string = (String) iterator.next();

		}

		//  
		System.out.println("------Iterator------");
		for (Iterator<String> i = array.iterator(); i.hasNext(); System.out.println(i.next())) {

		}

		//  for 
		System.out.println("-----general for-----");
		for (int x = 0; x < array.size(); x++) {
			System.out.println(array.get(x));
		}
	}
}
상기 코드에서 알 수 있듯이 밑바닥은 교체기에 의해 이루어진다. 증강 for는 실제적으로 교체기를 숨기기 때문에 교체기를 만들지 않아도 자연 코드가 간결하다.이것도 for가 출시된 원인이다. 코드를 줄이고 집합과 그룹을 두루 돌아다니며 효율을 높이기 위해서다.
주의: 증강 for가 교체기를 숨겼기 때문에 증강 for로 집합과 그룹을 두루 훑어볼 때null인지 아닌지를 먼저 판단해야 합니다. 그렇지 않으면 빈 바늘 이상이 발생합니다.이유는 간단하다. 밑바닥은 수조나 집합 대상으로iterator () 방법을 호출하여 교체기를 만들어야 한다. (Iterator 교체기는 인터페이스이기 때문에 하위 클래스로 이루어져야 한다.) 만약null이라면 이상을 던질 것이다.
5. for의 적용성 및 한계성 강화
1. 적용성
집합과 수조의 반복에 적용됩니다.
2. 한계:
① 집합은 null이 될 수 없다. 왜냐하면 밑바닥은 교체기이기 때문이다.
② 교체기가 숨겨져 있으므로 컬렉션을 반복할 때 수정할 수 없습니다(삭제).
③ 각도표는 설정할 수 없습니다.
6. 사용법 상세 설명 강화
1. 수조에서의 사용법 강화

package cn.jason05;

import java.util.ArrayList;
import java.util.List;

/**
 *  for 
 * 
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 //  
 int[] arr = { 1, 2, 3, 4, 5 };
 for (int x : arr) {
 System.out.println(x);
 }
 }
}

2. 집합에서의 사용법 강화

package cn.jason05;

import java.util.ArrayList;
import java.util.List;

/**
 *  for 
 * 
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 //  
 ArrayList<String> array = new ArrayList<String>();
 array.add("hello");
 array.add("world");
 array.add("java");

 for (String s : array) {
 System.out.println(s);
 }

 //  null, NullPointerException 
 List<String> list = null;
 if (list != null) {
 for (String s : list) {
 System.out.println(s);
 }
 }

 //  for , ConcurrentModificationException 
 for (String x : array) {
 if (array.contains("java"))
 array.add(1, "love");
 }

 }

3. 범용과 강화 for 완벽한 결합
주의: 반드시 범용형과 완벽하게 결합해야 한다. 그렇지 않으면 수동으로 아래로 전환해야 한다
1. 일반 효과 없이 강화 for 사용 불가
Student 클래스

package cn.jason01;

public class Student {
 private String name1;
 private String name2;

 public Student() {
 super();
 }

 public Student(String name1, String name2) {
 super();
 this.name1 = name1;
 this.name2 = name2;
 }

 public String getName1() {
 return name1;
 }

 public void setName1(String name1) {
 this.name1 = name1;
 }

 public String getName2() {
 return name2;
 }

 public void setName2(String name2) {
 this.name2 = name2;
 }

}

테스트 코드

package cn.jason01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test02 {
 public static void main(String[] args) {
 //  1
 List list1 = new ArrayList();
 list1.add("a");
 list1.add("b");
 list1.add("c");

 //  2
 List list2 = new ArrayList();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 //  
 List list3 = new ArrayList();

 //  , 
 for (Iterator i = list1.iterator(); i.hasNext();) {
 // System.out.println(i.next());
 String s = (String) i.next();
 for (Iterator j = list2.iterator(); j.hasNext();) {
 // list2.add(new Student(s,j.next()));
 String ss = (String) j.next();
 list3.add(new Student(s, ss));
 }
 }

 //  , 
 Student st;
 for (Iterator k = list3.iterator(); k.hasNext(); System.out
 .println(new StringBuilder().append(st.getName1()).append(st.getName2()))) {
 st = (Student) k.next();
 }
 }
}

위의 코드가 주석된 두 줄의 코드를 삭제하면 프로그램이 오류를 보고합니다. 왜냐하면 집합은 성명 요소가 어떤 유형인지 없기 때문에 교체기도 자연히 어떤 유형인지 알 수 없습니다.그래서 범용이 없으면 아래로 전환해야 하고 교체기만 사용할 수 있고 증강for는 사용할 수 없다.
2. 범용 및 향상된 for
위 코드를 범용적으로 수정하다

package cn.jason01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 *  for 
 * 
 * @author cassandra
 */
public class Test03 {
 public static void main(String[] args) {
 //  1
 List<String> list1 = new ArrayList<String>();
 list1.add("a");
 list1.add("b");
 list1.add("c");

 //  2
 List<String> list2 = new ArrayList<String>();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 //  
 List<Student> list3 = new ArrayList<Student>();

 ////  , 
 for (String s1 : list1) {
 for (String s2 : list2) {
 list3.add(new Student(s1, s2));
 }
 }

 //  , 
 for (Student st : list3) {
 System.out.println(new StringBuilder().append(st.getName1()).append(st.getName2()));
 }
 }
}

4. List 컬렉션 네 가지 방법
Collection 인터페이스에iterator () 방법이 있습니다. 되돌아오는 것은 Iterator 형식입니다. 교체기가 Iterator입니다.List에 list Iterator () 방법이 있기 때문에 하나의 집합기 List Iterator가 추가되었습니다. 그 하위 클래스인 Linked List, Array List, Vector는 모두 List와 Collection 인터페이스를 실현했기 때문에 두 개의 교체기로 두루 다닐 수 있습니다.
코드 테스트

package cn.jason05;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 *  List 
 * 
 * @author cassandra
 */

public class ForDemo01 {
 public static void main(String[] args) {
 //  
 List<String> list = new ArrayList<String>();
 list.add("hello");
 list.add("world");
 list.add("java");

 //  1,Iterator 
 Iterator<String> i = list.iterator();
 while (i.hasNext()) {
 String s = i.next();
 System.out.println(s);
 }

 //  2,ListIterator 
 ListIterator<String> lt = list.listIterator();
 while (lt.hasNext()) {
 String ss = lt.next();
 System.out.println(ss);
 }

 //  3, for 
 for (int x = 0; x < list.size(); x++) {
 String sss = list.get(x);
 System.out.println(sss);
 }

 //  4, for 
 for (String ssss : list) {
 System.out.println(ssss);
 }

 }
}

5.Set 컬렉션 반복 2 방법
Set 집합에는 get(int index) 방법이 없기 때문에 일반 for 순환이 없고, Set에listIterator() 방법이 없기 때문에 ListIterator 교체기가 없습니다.그래서 두 가지 반복 방식밖에 없어요.
코드 테스트

package cn.jason05;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class ForTest03 {
 public static void main(String[] args) {
 Set<String> set = new HashSet<String>();
 set.add("hello");
 set.add("world");
 set.add("java");

 //  1,Iterator 
 Iterator<String> it = set.iterator();
 while (it.hasNext()) {
 System.out.println(it.next());
 }

 //  2, for 
 for (String s : set) {
 System.out.println(s);
 }

 }
}

7. 요약
1. for의 적용성과 한계성 강화
적용성: 집합과 수조의 반복에 적용됩니다.
한계:
① 집합은 null이 될 수 없다. 왜냐하면 밑바닥은 교체기이기 때문이다.
② 각도표는 설정할 수 없습니다.
③ 교체기가 숨겨져 있기 때문에 집합을 반복할 때 수정할 수 없다(삭제).
2. 집합에서 for와 범형의 결합을 강화해야 새로운 특성의 역할을 발휘할 수 있다.
3. 홈페이지의 새로운 특성을 살펴보는 것이 중요하다. 그 이유를 알고 그 이유를 알아야 마음과 같이 자유롭게 운용할 수 있다.
이상의 이java의 새로운 특성인 for순환의 가장 완전한 용법 총결은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기