Java 프로그래밍 사상 독서 노트 - 5

12264 단어

제11장 소지 대상


11.2 기본 개념


Collection
List는 삽입된 순서대로 요소를 저장해야 하며 Set에 중복 요소가 있을 수 없습니다.Queue는 줄 서기 규칙에 따라 대상이 발생하는 순서를 결정합니다. (일반적으로 삽입 순서와 일치합니다)
Map
키 값을 사용하여 값을 찾을 수 있는 쌍으로 구성된 키 값 쌍 객체

11.3 요소 그룹 추가

import java.util.Arrays;
import java.util.List;

class Snow{}
class Powder extends Snow{}
class Light extends Powder{}
class Heavy extends Powder{}
class Crusty extends Snow{}
class Slush extends Snow{}

public class AsListInference{
	public static void main(String[] args){
		List<Snow> snow1 = Arrays.asList(
				new Crusty(), new Slush(), new Powder());
		
// Light   Heavy Powder,snow2 asList Powder , List<Powder> List<Snow>
//		List<Snow> snow2 = Arrays.asList(
//				new Light(), new Heavy());
//  
		List<Snow> snow3 = Arrays.<Snow>asList(
				new Light(), new Heavy());
	}
}

11.4 컨테이너 인쇄

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;

public class PrintContainers{
	static Collection<String> fill(Collection<String> collection){
		collection.add("rat");
		collection.add("cat");
		collection.add("dog");
		collection.add("dog");
		return collection;
	}
	
	static Map<String, String> fill(Map<String, String> map){
		map.put("rat", "Fuzzy");
		map.put("cat", "Rags");
		map.put("dog", "Bosco");
		map.put("dog", "Spot");
		return map;
	}
	
	public static void main(String[] args){
		System.out.println(fill(new ArrayList<String>()));
		System.out.println(fill(new LinkedList<String>()));
		System.out.println(fill(new HashSet<String>()));
		System.out.println(fill(new TreeSet<String>()));
		System.out.println(fill(new LinkedHashSet<String>()));
		System.out.println(fill(new HashMap<String,String>()));
		System.out.println(fill(new TreeMap<String,String>()));
		System.out.println(fill(new LinkedHashMap<String,String>()));
	}
}

결과:
[rat, cat, dog, dog]
[rat, cat, dog, dog]
[cat, dog, rat]
[cat, dog, rat]
[rat, cat, dog]
{cat=Rags, dog=Spot, rat=Fuzzy}
{cat=Rags, dog=Spot, rat=Fuzzy}
{rat=Fuzzy, cat=Rags, dog=Spot}
ArrayList와 LinkedList는 모두 List 유형으로 삽입된 순서대로 요소를 저장합니다.다른 점은 특정 유형의 작업을 수행할 때의 성능입니다. 링크드리스트에 포함된 작업이 비교적 많습니다.
HashSet, TreeSet과 LinkedHashSet은 모두 Set 유형으로 비중복성을 가지지만 요소를 저장하는 방식은 모두 같지 않다.HashSet은 가장 빨리 요소를 얻는 방식을 가지고 있으며 TreeSet은 승차순으로 대상을 저장하고LinkedHashSet은 추가된 순서대로 대상을 저장합니다.
HashMap, TreeMap, LinkedHashMap은 모두 Map 유형으로 키 값을 통해 대상을 찾을 수 있다.HashMap은 가장 빨리 요소를 얻는 방식을 가지고 있으며 TreeMap은 오름차순으로 대상을 저장하고 LinkedHashMap은 추가된 순서대로 대상을 저장합니다.

11.5 List


ArrayList: 임의 액세스에 적합하지만 List 중간에 요소를 삽입하고 제거하는 것은 느림
LinkedList: List 중간에 삽입하고 삭제하는 대가가 비교적 낮고 최적화된 순서 접근을 제공하지만 무작위 접근 성능이 떨어진다.
왜 new List()를 사용할 수 없습니까?
프로그래밍은 대상을 대상으로 프로그래밍해야 한다. 추상(인터페이스)에 대한 것이지 구체적인List가 인터페이스가 아니다. ArrayList는 List 인터페이스를 실현하는 ArrayList,LinkedList,Vector 등이 있기 때문에 어느 인터페이스로 직접 new 인터페이스를 실현하는 것이 좋은 디자인 모델이다.하나의 인터페이스는 여러 가지 실현이 있는데 이런 문법은 자바가 대상을 대상으로 하는 사상으로 역치원칙에 의존한다. 즉, 추상에 의존하고 실현에 의존하지 않는다(구체적으로).호출자에게 제공하는 것은 인터페이스나 추상류이다. 실현자는 인터페이스나 추상류를 실현하거나 계승하여 호출자를 만족시킬 수 있다. 그러면 호출자는 실현자가 어떻게 조작하는지 알 필요가 없고 실현자도 구체적인 상황에 따라 실현할 수 있다. 이렇게 결합을 제거한다.이것이 바로 자바 디자인 모델의 기초 사상 중의 하나다.

11.6 교체기


Iterator:hasNext(),next(),remove()(next에서 생성된 마지막 요소를 제거하는 데 사용), 단방향 접근
ListIterator: List 클래스에만 접근할 수 있으며,hasNext (),next (),remove (),set () 를 양방향으로 이동할 수 있습니다.

11.7 LinkedList


기본 List 인터페이스를 구현했습니다.getFirst (), 요소 (),peek () 는 모두 첫 번째 요소를 가져오고, List가 비어 있으면 getFirst () 와 요소 () 는 NoSuchElementException을 던지고,peek () 는 null을 되돌려줍니다.
removeFirst (), remove (), poll () 는 모두 요소를 삭제하고, List는 비어 있는 removeFirst () 와 remove () 는 NoSuchElementException를 던지고, poll () 은 null로 돌아갑니다.
addFirst(), add(), addLast()는 모두 요소를 추가하고removeLast()는 목록의 마지막 요소를 제거하고 되돌려줍니다.

11.8 Stack


LIFO
LinkedList로 Stack 구현
import java.util.LinkedList;

public class Stack<T>{
	private LinkedList<T> storage = new LinkedList<T>();
	public void push(T v) { storage.addFirst(v);}
	public T peek() { return storage.getFirst();}
	public T pop() { return storage.removeFirst();}
	public boolean empty() { return storage.isEmpty();}
	public String toString() { return storage.toString();}
}

11.10 Map


Mao는 배열과 다른 Collection과 마찬가지로 다차원으로 쉽게 확장할 수 있습니다.예를 들어Map은 애완동물이 여러 명 있는 사람을 나타낸다

11.11 Queue


먼저 들어가고 FIFO 나가고.
우선 순위 큐
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.Set;

public class PriorityQueueDemo{ 
	
	public static void printQ(Queue queue){
		while(queue.peek() != null){
			System.out.print(queue.remove() + " ");
		}
		System.out.println();
	}
	
	public static void main(String[] args){
		PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();
		Random random = new Random(47);
		for(int i = 0; i < 10; ++i){
			priorityQueue.offer(random.nextInt(i+10));
		}
		printQ(priorityQueue);
		List<Integer> ints = Arrays.asList(25,22,20,18,14,9,3,1,1,2,3,9,14,18,21,23,25);
		priorityQueue = new PriorityQueue<Integer>(ints);
		printQ(priorityQueue);
		priorityQueue = new PriorityQueue<Integer>(ints.size(), Collections.reverseOrder());
		priorityQueue.addAll(ints);
		printQ(priorityQueue);
		
		String fact = "EDUCATION SHOULD ESCHEW OBFUSCATION";
		List<String> strings = Arrays.asList(fact.split(""));
		PriorityQueue<String> stringPQ = new PriorityQueue<String>(strings);
		printQ(stringPQ);
		stringPQ = new PriorityQueue<String>(strings.size(), Collections.reverseOrder());
		stringPQ.addAll(strings);
		printQ(stringPQ);
		
		Set<Character> charset = new HashSet<Character>();
		for(char c: fact.toCharArray()){
			charset.add(c);
		}
		PriorityQueue<Character> cQueue = new PriorityQueue<Character>(charset);
		printQ(cQueue);
	}
}
결과:
0 1 1 1 1 1 3 5 8 14 
1 1 2 3 3 9 9 14 14 18 18 20 21 22 23 25 25 
25 25 23 22 21 20 18 18 14 14 9 9 3 3 2 1 1 
       A A B C C C D D E E E F H H I I L N N O O O O S S S T T U U U W 
W U U U T T S S S O O O O N N L I I H H F E E E D D C C C B A A        
  A B C D E F H I L N O S T U W 

11.13 Foreach 및 교체기

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;

public class ForeachCollections{ 
	
	public static void main(String[] args){
		Collection<String> cs = new LinkedList<String>();
		Collections.addAll(cs, "Take the long way home".split(" "));
		for(String s: cs){
			System.out.print(" " + s + " ");
		}
	}	
}
foreach는 모든 Collection 객체와 함께 작동합니다.자바 SE5에 Iterator 인터페이스 (Iterator를 만드는 iterator () 방법이 포함) 가 도입되었고, Iterator 인터페이스는foreach에 의해 시퀀스에서 이동하는 데 사용되었기 때문이다.따라서 Iterable 변수를 만들면foreach에 사용할 수 있습니다.
import java.util.Iterator;

public class IterableClass implements Iterable<String>{ 
	
	protected String[] words = "And that is how we know the Earch to be banana-shaped.".split(" ");
	
	public static void main(String[] args){
		for(String s: new IterableClass()){
			System.out.print(s + " ");
		}
	}

	@Override
	public Iterator<String> iterator() {
		// TODO Auto-generated method stub
		return new Iterator<String>(){
			private int index = 0;

			@Override
			public boolean hasNext() {
				// TODO Auto-generated method stub
				return index < words.length;
			}

			@Override
			public String next() {
				// TODO Auto-generated method stub
				return words[index++];
			}

			@Override
			public void remove() {
				// TODO Auto-generated method stub
				throw new UnsupportedOperationException();
			}
		};
	}	
}
foreach 문장은 수조나 다른 Iterable에 사용할 수 있지만, 이것은 수조가 틀림없이 Iterable이고, 그 어떠한 자동 포장도 자동으로 발생하지 않는다는 것을 의미하지 않는다
import java.util.Arrays;

public class ArrayIsNotIterable {  
	static <T> void test(Iterable<T> ib){
		for(T t : ib){
			System.out.print(t + " ");
		}
		System.out.println();
	}
	
	public static void main(String[] args){
		test(Arrays.asList(1,2,3));
		String[]strings = {"A","B","C"};
		//array , iterable
		//test(strings);
		test(Arrays.asList(strings));
	}
}

11.3.1 어댑터 방법 관용

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class MultiIterableClass extends IterableClass {  
	
	public Iterable<String> resversed(){
		return new Iterable<String>(){
			@Override
			public Iterator<String> iterator() {
				// TODO Auto-generated method stub
				return new Iterator<String>(){

					int current = words.length-1;
					@Override
					public boolean hasNext() {
						// TODO Auto-generated method stub
						return current > -1;
					}

					@Override
					public String next() {
						// TODO Auto-generated method stub
						return words[current--];
					}

					@Override
					public void remove() {
						// TODO Auto-generated method stub
						throw new UnsupportedOperationException();
					}	
				};
			}
		};
	}
	
	public Iterable<String> randomized(){
		return new Iterable<String>(){

			@Override
			public Iterator<String> iterator() {
				// TODO Auto-generated method stub
				List<String> shuffled = new ArrayList<String>(Arrays.asList(words));
				Collections.shuffle(shuffled, new Random(47));
				return shuffled.iterator();
			}
		};
	}
	
	public static void main(String[] args){
		MultiIterableClass mic = new MultiIterableClass();
		for(String s:mic.resversed()){
			System.out.print(s + " ");
		}
		System.out.println();
		for(String s:mic.randomized()){
			System.out.print(s + " ");
		}
		System.out.println();
		for(String s:mic){
			System.out.print(s + " ");
		}
	}
}
출력:
banana-shaped. be to Earch the know we how is that And 
is banana-shaped. Earch that how the be And we know to 
And that is how we know the Earch to be banana-shaped. 
Collection.shuffle () 는 원래의 그룹에 영향을 주지 않았습니다. shuffled의 인용을 흐트러뜨렸을 뿐입니다. 이것은randomized () 방법으로 Array List로 Arrays를 사용하기 때문입니다.asList () 방법의 결과가 포장되었다.하면, 만약, 만약...asList () 방법으로 만들어진List가 직접 흐트러지면 밑에 있는 그룹을 수정합니다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class ModifyingArrayAsList {  
	
	public static void main(String[] args){
		Random random = new Random(47);
		Integer[] ia = {1,2,3,4,5,6,7,8,9,10};
		List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));
		System.out.println("Before shuffling: " + list1);
		Collections.shuffle(list1, random);
		System.out.println("After shuffling: " + list1);
		
		System.out.println("array: " + Arrays.toString(ia));
		
		List<Integer> list2 = Arrays.asList(ia);
		System.out.println("Before shuffling: " + list2);
		Collections.shuffle(list2, random);
		System.out.println("After shuffling: " + list2);
		System.out.println("array: " + Arrays.toString(ia));
	}
}
첫 번째 상황, Arrays.Array List () 의 출력은 Array List 구조기에 전달됩니다. 이것은 a의 요소를 인용하는 Array List를 만들기 때문에 순서를 어지럽히면 이 그룹에 영향을 주지 않습니다.Arrays를 직접 사용하면asList(ia)의 결과는 a의 순서를 흐트러뜨린다.만약 당신이 실행한 작업이 이list를 수정하고 원래의 그룹을 수정하고 싶지 않다면, 다른 용기에 복사본을 만들어야 합니다.

좋은 웹페이지 즐겨찾기