다크호스 프로그래머 - 학습 일기 [10] [범 형, 맵 과 Collections]

10727 단어
안 드 로 이 드 교육, 자바 교육, 당신 과 의 교 류 를 기대 합 니 다!
 
 
Set: 무질서, 중복 불가 |--HashSet: 데이터 구 조 는 해시 표 이 고 스 레 드 는 동기 화 되 지 않 습 니 다.    원소 의 유일 성 을 확보 하 는 원리: 원소 의 hashCode 값 이 같 는 지 판단 합 니 다.같 으 면 원소 의 equals 방법 이 true 인지 아 닌 지 계속 판단 합 니 다.
 |--TreeSet: Set 집합 에 있 는 요 소 를 정렬 할 수 있 습 니 다.    바 텀 데이터 구 조 는 이 진 트 리 입 니 다.    요소 의 유일 성 을 확보 하 는 근거: compare To 방법 return 0.         HashSet 만 해시 값 을 연결 합 니 다. TreeSet 은 이 진 트 리 를 갑 니 다.TreeSet 은 compare To 방법 을 통 해 요소 가 같은 지 확인 합 니 다.    TreeSet 집합 에서 요 소 를 삭제 하거나 요소 가 포함 되 어 있 는 지 판단 하려 면 CompareTo 방법 return 0 을 가 야 합 니 다. 0 을 되 돌려 주면 요소 가 같다 고 생각 합 니 다.
    TreeSet 정렬 의 첫 번 째 방식: 요소 자체 가 비교 성 을 가지 도록 합 니 다.    요 소 는 Comparable 인 터 페 이 스 를 실현 하고 compare To 방법 을 덮어 써 야 합 니 다.이런 방식 은 원소 의 자연 순서 라 고도 부 르 거나 기본 순서 라 고도 부른다.
    TreeSet 의 두 번 째 정렬 방식    원소 자체 가 비교 성 을 갖 추 지 못 하거나 갖 추 는 비교 성 이 필요 하지 않 을 때 집합 자체 가 비교 성 을 갖 도록 해 야 한다.    집합 이 초기 화 되 자마자 비교 방식 이 생 겼 다.
 
 
원소 자체 가 비교 성 을 갖 추 지 못 하거나 갖 추 는 비교 성 은 필요 한 것 이 아니다.이 럴 때 는 용기 자체 가 비교 성 을 갖 도록 해 야 한다.비교 기 를 정의 하고 비교 기 대상 을 매개 변수 로 TreeSet 집합 에 전달 하 는 구조 함수
두 가지 정렬 이 모두 존재 할 때 비교 기 를 위주 로 한다.
 
/*
  :         

          ,              

          
*/

import java.util.*;
class TreeSetTest
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet(new StrLenComparator());

		ts.add("abcd");
		ts.add("cc");
		ts.add("cba");
		ts.add("aaa");
		ts.add("z");
		ts.add("hahahaha");

		Iterator it = ts.iterator();

		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}

class StrLenComparator implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		String s1 = (String)o1;
		String s2 = (String)o2;

		/*
		if(s1.length()>s2.length())
			return 1;
		if(s1.length()==s2.length())
			return 0;
			*/

		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));

		if(num==0)
			return s1.compareTo(s2);
		return num;
	}
}

 
범 형: JDK 1.5 이후 에 새로운 특성 이 나타 나 안전 문 제 를 해결 하 는 데 사용 되 는 유형 안전 체제 입 니 다.
장점: 1. 운영 시기 에 발생 한 문 제 를 ClassCastException 으로 옮 겨 컴 파일 시기 에 프로그래머 가 문 제 를 해결 하 는 데 편리 하고 운영 시기 에 문 제 를 감소 시 키 며 안전 합 니 다.
2. 강제 전환 의 번 거 로 움 을 피한다.
일반적인 형식: < > 를 통 해 조작 할 참조 데이터 형식 을 정의 합 니 다.
자바 가 제공 하 는 대상 을 사용 할 때 팬 형 은 언제 씁 니까?
보통 집합 프레임 워 크 에서 흔히 볼 수 있 습 니 다. < > 를 보면 범 형 을 정의 해 야 합 니 다. 사실은 < > 는 수신 유형 입 니 다.
집합 을 사용 할 때 집합 에 저장 할 데이터 형식 을 매개 변수 로 < > 에 전달 하면 됩 니 다.
class GenericDemo 
{
	public static void main(String[] args) 
	{
		
		ArrayList a1 = new ArrayList();

		a1.add("abc01");
		a1.add("abc0991");
		a1.add("abc014");

		//a1.add(4);//a1.add(new Integer(4));

		Iterator it = a1.iterator();
		while(it.hasNext())
		{
			String s = it.next();
			System.out.println(s+":"+s.length());
		}
	}
}

 
범 형 류 가 정의 하 는 범 형 은 전체 클래스 에서 유효 합 니 다.방법 에 쓰 이면그러면 범 형 류 의 대상 이 구체 적 으로 조작 해 야 할 유형 을 명 확 히 한 후에 모든 조작 유형 은 서로 다른 방법 으로 서로 다른 유형 을 조작 할 수 있 도록 고정 되 었 고 유형 이 확실 하지 않 으 면 범 형 을 방법 에 정의 할 수 있다.
특수 한 점: 정적 방법 은 클래스 에서 정의 하 는 범 형 에 접근 할 수 없습니다.정적 방법 으로 작 동 하 는 응용 데이터 형식 이 확실 하지 않 으 면 일반적인 방법 으로 정의 할 수 있 습 니 다.
메모: 일반적인 정 의 는 방법 에 있어 서 반환 값 형식의 앞 에 놓 고 수정자 의 뒤에 놓 아야 합 니 다.
 
 
?어댑터
범 형의 한정: [범 형의 고급 응용, 범 형의 복합 응용]
? extends E: E 타 입 이나 E 의 하위 타 입, 상한 선 을 받 을 수 있 습 니 다.?슈퍼 E: E 타 입 이나 E 의 부모 타 입, 하한 선 을 받 을 수 있 습 니 다.
 
 
 
Map 집합: 이 집합 은 키 값 이 맞 고 한 쌍 씩 안 으로 저장 되 며 키 의 유일 성 을 확보 해 야 합 니 다. 1. 첨가  put(K key,V value)   putAll(Map extends K,? extends V> m)
 2, 삭제  clear()   remove(Object key)
 3, 판단  containsValue(Object value)   containsKey(Object key)   isEmpty()
 4, 획득  get(Object key)   size()   values()
  entrySet()   keySet()
Map  |--Hashtable: 밑바닥 은 해시 표 데이터 구조 로 null 키 null 값 을 저장 할 수 없습니다.     이 집합 은 스 레 드 동기 화 이다.[JDK 1.0] 효율 이 낮 아 요.
 |--HashMap: 밑바닥 은 해시 표 데이터 구조 로 null 키 와 null 값 을 사용 할 수 있 습 니 다.       이 집합 은 동기 화 되 지 않 는 다.[JDK 1.2] 효율 이 높 아 요.
 |--TreeMap: 밑바닥 은 이 진 트 리 데이터 구조 로 라인 이 일치 하지 않 습 니 다.주다    맵 집합 중의 키 를 정렬 합 니 다.
Set 와 비슷 하 다. 사실 Set 밑바닥 은 Map 집합 을 사용 했다.
import java.util.*;

class MapDemo 
{
	public static void main(String[] args) 
	{
		Map map = new HashMap();

		//    ,          ,             
		//    , put          。
		System.out.println("put:"+map.put("01","zhangsan1"));
		System.out.println("put:"+map.put("01","wangwu"));
		map.put("02","zhangsan2");
		map.put("03","zhangsan3");

		System.out.println("containsKey:"+map.containsKey("022"));
		//System.out.println("remove:"+map.remove("02"));

		System.out.println("get:"+map.get("023"));
		
		map.put("04",null);
		System.out.println("get:"+map.get("04"));
		//    get                。
		//    null   。

		//  map       
		Collection coll = map.values();

		System.out.println(coll);
		System.out.println(map);
	}
}

map 집합 의 두 가지 추출 방식 1, Set: map 의 모든 키 를 set 집합 에 저장 합 니 다.set 가 교체 기 를 갖 추고 있 기 때문이다. 따라서 모든 키 를 교체 해서 꺼 내 고 get 방법 에 따라 모든 키 에 대응 하 는 값 을 얻 을 수 있 습 니 다.
 맵 집합의 추출 원리: 맵 집합 을 set 집합 으로 바 꾸 고 교체 기 를 통 해 꺼낸다.
2. Set > entry Set: map 집합 에 있 는 맵 관 계 를 저장 합 니 다. set 집합 에서 이 관계 의 데이터 형식 은 맵. Entry 입 니 다.
 
 
연습: "sdfgzxcvasdfxcvdf" 이 문자열 의 알파벳 이 나타 나 는 횟수 를 가 져 옵 니 다. 결 과 를 인쇄 하 기 를 바 랍 니 다: a (1) c (2)...
구 조 를 통 해 모든 자모 가 대응 하 는 횟수 가 있다 는 것 을 알 수 있다. 이 는 자모 와 횟수 간 에 모두 매 핑 관계 가 있다 는 것 을 의미한다.
맵 집합 에 저 장 된 것 이 맵 관계 이기 때문에 맵 집합 을 선택 할 수 있 습 니 다.
맵 집합 은 언제 사용 합 니까?데이터 사이 에 맵 관계 가 존재 할 때 맵 집합 을 먼저 생각해 야 합 니 다.
사고: 1. 문자열 을 문자 배열 로 변환 합 니 다. 모든 알파벳 을 조작 해 야 하기 때 문 입 니 다.
2. 맵 집합 을 정의 합 니 다. 인쇄 결과 의 알파벳 은 순서 가 있 기 때문에 treemap 로 집합 합 니 다.
3. 문자 배열 옮 겨 다 니 기 모든 알파벳 을 키 로 map 집합 을 찾 습 니 다. null 로 돌아 가면 이 자모 와 1 을 map 집합 에 저장 합 니 다. 만약 되 돌아 오 는 것 이 null 이 아니라면, 이 알파벳 은 맵 집합 에 이미 존재 하고 이에 대응 하 는 것 을 설명 합 니 다. 그러면 이 횟수 를 가 져 와 서 자 증 한 다음 에 이 자모 와 자 증 된 횟수 를 저장 합 니 다. map 집합 에서 호출 원리 키 에 대응 하 는 값 을 덮어 씁 니 다.
4. map 집합 에 있 는 데 이 터 를 지정 한 문자열 형식 으로 되 돌려 줍 니 다.
import java.util.*;
class MapTest3 
{
	public static void main(String[] args) 
	{
		String s = charCount("aakb+fc-dabcd1ke,fa");
		System.out.println(s);
	}

	public static String charCount(String str)
	{
		char[] chs = str.toCharArray();

		TreeMap tm = new TreeMap();

		int count = 0;

		for(int x=0; x='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))	
				continue;
			Integer value = tm.get(chs[x]);
			if(value!=null)
				count = value;
			count++;
			tm.put(chs[x],count);

			count  = 0;
			
			/*
			if(value==null)
			{
				tm.put(chs[x],1);
			}
			else
			{
				value = value + 1;
				tm.put(chs[x],value);
			}
			*/
		}
		//System.out.println(tm);
		
		StringBuilder sb = new StringBuilder();

		Set> entrySet = tm.entrySet();
		Iterator> it = entrySet.iterator();

		while(it.hasNext())
		{
			Map.Entry me = it.next();
			Character ch = me.getKey();
			Integer value = me.getValue();
			sb.append(ch+"("+value+")");
		}

		return sb.toString();
	}
}

집합 프레임 워 크 의 도구 클래스 Collections
대상 크기 를 비교 하거나 compare 또는 compare To
 
/*
Arrays:          
        

asList:     list  
*/

import java.util.*;
class ArraysDemo 
{
	public static void main(String[] args) 
	{
		//int[] arr = {2,4,5};

		//System.out.println(Arrays.toString(arr));

		String[] arr = {"abc","cc","kkkk"};
		
		/*
		 :     list       ? 
		 :                     

		  :       ,            。
		           。
		contains
		get
		indexOf()
		subList()
		    ,     UnsupportedOperationException
		*/
		List list = Arrays.asList(arr);
		//sop("contains:"+list.contains("cc"));
		//list.add("qq");//UnsupportedOperationException

		//sop(list);
		//int[] nums = {2,4,5};
		 
		Integer[] nums = {2,4,5};
		Listli = Arrays.asList(nums);

		/*
		            ,       ,       
		          。                ,
		                 。
		*/
		sop(li);
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

 
/*
     
Collection    toArray  
*/


import java.util.*;
class CollectionToArray
{
	public static void main(String[] args) 
	{
		ArrayList al = new ArrayList();

		al.add("abc1");
		al.add("abc2");
		al.add("abc3");

		/*
		1、               ?

		(1)                size,        
		        ,      size;

		(2)                size,        ,
		           ,              。

		2、          ?
		          。        。

		*/

		String[] arr = al.toArray(new String[al.size()]);
		sop(Arrays.toString(arr));
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

 
고급 for 순환
형식: for (데이터 형식 변수 이름: 옮 겨 다 니 는 집합 (Collection) 또는 배열) {
} 집합 을 옮 겨 다 니 면 집합 에 있 는 요소 만 가 져 올 수 있 지만 집합 을 조작 할 수 없습니다.
교체 기 는 옮 겨 다 니 는 것 외 에 remove 집합 에 있 는 요 소 를 사용 하 는 동작 도 할 수 있 습 니 다. ListIterator 를 사용 하면 옮 겨 다 니 는 과정 에서 집합 을 삭제 하고 검사 하 는 동작 도 할 수 있 습 니 다.
 
전통 for 와 고급 for 는 어떤 차이 가 있 습 니까?
고급 for 는 한계 가 있 습 니 다. 옮 겨 다 니 는 목표 가 있어 야 합 니 다.배열 을 옮 겨 다 닐 때 전통 for 를 사용 하 는 것 을 권장 합 니 다. 전통 for 는 각 표를 정의 할 수 있 기 때 문 입 니 다.
 
/*
JDK1.5        

       
      :                 
*/

class ParamMethodDemo 
{
	public static void main(String[] args) 
	{
		/*
		int[] arr = {3,4};
		show(arr);

		int[] arr1 = {2,3,4,5};
		show(arr1);
		*/
		//        
		//            ,      。
		show(2,4,5,6);
		/*
		    ,
		                
		               
		                 
		             
		*/
	}

	public static void show(int... arr)
	{	
		System.out.println(arr.length);
	}
}

 
/*
StaticImport     

      ,         
      ,            
*/
import java.util.*;
import static  java.util.Arrays.*;//    Arrays           

import static java.lang.System.*;//   System        

class StaticImport extends Object
{
	public static void main(String[] args) 
	{
		out.println("haha");
		int[] arr = {3,1,5};

		sort(arr);
		int index = binarySearch(arr,1);
		System.out.println(Arrays.toString(arr));
		System.out.println("Index="+index);
	}
}


좋은 웹페이지 즐겨찾기