9 HashSet HashCode 교체기 TreeSet Colletions 클래스 HashMap

7517 단어
1. Array List에 대상을 추가할 때 실제로는 그 대상을 Array List 밑에 유지되는 그룹에 놓는다.LinkedList에 객체를 추가하면 실제로 LinkedList 내부에 다음과 같은 Node 객체가 생성됩니다.
void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }
private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

그 중에서 Object 유형의 원소 요소는 바로 우리가 링크드 리스트에 추가한 원소입니다. 그리고 Node는 앞과 뒤의 인용previous,next를 구성했습니다. 마지막으로 생성된 이 Node 대상을 체인 테이블에 추가했습니다.다시 말하면 링크드 리스트에서 유지되는 것은 하나하나의 노드 대상이다.
2. Object 클래스에 대한 equals 방법의 특징
a) 자반성: x.equals(x)는trueb의 대칭성을 되돌려야 한다. x.equals(y)는true이고 y.equals(x)도true이다.c) 전달성: x.equals(y)가true이고 y.equals(z)가true이면 x.equals(z)도true이어야 한다.d) 일치성: x.equals(y)의 첫 번째 호출은true이고 x.equals(y)의 두 번째, 세 번째, n번째 호출도true이어야 한다. 전제 조건은 비교 사이에 x를 수정하지 않았고 y를 수정하지 않았다는 것이다.
e) 비공식 인용 x에 대해 x.equals(null)는false를 되돌려줍니다.
3. Object 클래스의 hashCode() 방법의 특징:
a) 자바 응용 프로그램의 한 번 실행 과정에서 같은 대상의hashCode 방법을 여러 번 호출하면 같은 값을 되돌려야 한다(전제는 이 대상의 정보가 변하지 않았다는 것이다).
b) 두 객체에 대해 equals 방법을 사용하여 true를 반환하는 경우 두 객체의 hashCode 값은 동일합니다.
c) 두 대상에 대해 equals 방법을 사용하여false를 비교적 되돌려준다면 이 두 대상의hashCode값은 반드시 다르게 요구하지 않는다(같을 수도 있고 다를 수도 있다). 그러나 다르면 응용의 성능을 향상시킬 수 있다.
d) Object 클래스의 경우 서로 다른 Object 객체의 hashCode 값이 다릅니다(Object 클래스의 hashCode 값은 객체의 주소를 나타냅니다).
4. HashSet을 사용할 때hashCode() 방법이 호출되어 집합에 저장된 대상의hashcode값이 증가한 대상의hashcode값과 일치하는지 판단한다.만약 일치하지 않으면 직접 넣는다.만약 일치한다면 equals 방법의 비교를 다시 진행한다. equals 방법은true로 되돌아오면 대상이 이미 추가되었다는 것을 의미하고 새로운 대상을 추가하지 않는다. 그렇지 않으면 추가한다.
HashSet set = new HashSet();
		
//		set.add(new People("zhangsan"));
//		set.add(new People("lisi"));
//		set.add(new People("zhangsan"));
		
//		People p1 = new People("zhangsan");
//		
//		set.add(p1);
//		set.add(p1);
		
		String s1 = new String("a");
		String s2 = new String("a");
		
		System.out.println("hash code: " + (s1.hashCode() == s2.hashCode()));
		
		set.add(s1);
		set.add(s2);
		
		System.out.println(set)

String의 HashCode 방법:
/**
     * Returns a hash code for this string. The hash code for a
     * {@code String} object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]  String HasCode 
     * </pre></blockquote>
     * using {@code int} arithmetic, where {@code s[i]} is the
     * <i>i</i>th character of the string, {@code n} is the length of
     * the string, and {@code ^} indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

5. 만약에 우리가 같은 종류의 equals 방법을 다시 쓴다면hashCode 방법을 다시 써야 한다. 반대로도 마찬가지다.
HashCode를 다시 쓰는 것은 집합에서 응용하기 위해서입니다.
Eclipse는 HashCode()와 equals()를 자동으로 다시 씁니다.Source->Generate....
교체기: (GIS의 cursor와 유사)
일반적으로 클래스를 통해 집중된 원소를 순환하기를 희망한다.예를 들어, 각 요소를 표시할 수 있습니다.지금까지 이 문제를 처리하는 가장 간단한 방법은iterator를 사용하는 것이다. iterator는 Iterator를 실현하거나 ListIterator 인터페이스를 실현하는 대상이다.Iterator는 클래스 집합을 통해 요소를 가져오거나 삭제하는 순환을 완성할 수 있습니다.리스트를 양방향으로 옮겨다니며 단원을 수정할 수 있도록 Iterator를 확장합니다.
교체 함수를 통해 클래스 집합에 접근하기 전에, 반드시 교체 함수를 얻어야 한다.모든 Collection 클래스는 iterator () 함수를 제공합니다. 이 함수는 클래스 집합 헤더에 대한 교체 함수를 되돌려줍니다.이 교체 함수 대상을 사용하면 클래스가 집중된 모든 원소, 한 번에 한 원소에 접근할 수 있다.일반적으로 반복 함수를 사용하여 클래스 집합의 내용을 순환하는데 절차는 다음과 같다.클래스 집합의iterator () 방법을 호출하여 클래스 집합 헤더에 대한 교체 함수를 얻을 수 있습니다.2.hasNext () 방법을 호출하는 순환을 만듭니다.hasNext ()가true로 되돌아오기만 하면 순환 교체를 진행합니다.3. 순환 내부에서next() 방법을 호출하여 모든 원소를 얻는다
4
public static void main(String[] args)
	{
		HashSet hash = new HashSet();
		hash.add("I");
		hash.add(" Miss ");
		hash.add(" You ");
		hash.add(" WangBingJia");
		Iterator iterator = hash.iterator();
		while (iterator.hasNext())
		{
			System.out.println(iterator.next().toString());
		}
	}
TreeSet은 일반적으로 정의하기 전에 순서대로 집합되어 있습니다.
Comparator, 즉 Comparator 인터페이스의 Compare 구현 방법
public class TreeSetTest
{
	
	public static void main(String[] args)
	{
		Compare compare=new Compare();
		TreeSet ts=new TreeSet(compare);
		ts.add((new Student(10)));
		ts.add(new Student(20));
		System.out.println(ts);
		
	}
	

}
class Compare implements Comparator
{

	@Override
	public int compare(Object o1, Object o2)
	{
		// TODO Auto-generated method stub
		Student s1=(Student) o1;
		Student s2=(Student) o2;
		if (s1 .socore<s2.socore)
		{
			return -1;
		}
		else if (s1 .socore==s2.socore)
		{
			return 0;
		}
		else {
			return 1;
		}
		
	}
	}
class Student
{
	 int socore;
	Student(int socore){
		this.socore=socore;
	}
	@Override
	public String toString()
	{
		// TODO Auto-generated method stub
		return Integer.toString(socore);
	}
	}

Collections 클래스의 정적 방법
reverseOrder() 역순 정렬
shuffle 순서 흐트러뜨리기
public static void main(String[] args)
	{
		LinkedList list = new LinkedList();
		
		list.add(new Integer(-8));
		list.add(new Integer(20));
		list.add(new Integer(-20));
		list.add(new Integer(8));
		
		Comparator r = Collections.reverseOrder();
		
		Collections.sort(list, r);
		
		for(Iterator iter = list.iterator(); iter.hasNext();)
		{
			System.out.println(iter.next() + " ");
		}
		
		System.out.println();
		
		Collections.shuffle(list);
		
		for(Iterator iter = list.iterator(); iter.hasNext();)
		{
			System.out.println(iter.next() + " ");
		}
		
		System.out.println("minimum value: " + Collections.min(list));
		System.out.println("maximum value: " + Collections.max(list));
	}

6.Map(매핑): 클래스 HashMap 구현
맵의 키셋 () 방법은 키의 집합을 되돌려줍니다. 맵의 키는 중복될 수 없기 때문에 키셋 () 방법의 귀환 유형은 셋입니다.Map의 값은 중복될 수 있기 때문에values () 방법의 반환 형식은 Collection으로 중복된 요소를 수용할 수 있습니다.
HashMap hashMap=new HashMap();
hashMap.put("a","Bingjia");
hashMap.put("a","I");
hashMap.put("b","Bingjia");
System.out.println(hashMap);

hashMap의 KeySet 방법을 통해 hashMap을 옮겨다니기
Set set=hMap.keySet();
		Iterator iterator=set.iterator();
		while (iterator.hasNext())
		{
			System.out.println(hMap.get(iterator.next()));
			
		}

HashMap에 저장된 것은 하나의 Map입니다.Entry 객체, 각 Map.Entry는 키 쌍과value를 유지합니다
그래서 HashMap에 대한 훑어보기로 Map를 꺼낼 수 있어요.Entry
hMap.put("1","I");
		hMap.put("2","Miss");
		hMap.put("3","You");
		hMap.put("4","WangBingjia");
		
		
		Set set =hMap.entrySet();
		Iterator iterator=set.iterator();
		while (iterator.hasNext())
		{
			Map.Entry entry=(Entry) iterator.next();
			System.out.println("key "+entry.getKey()+" values "+ entry.getValue());
			
		}

해시맵을 이용해서 숫자를 집계하는 거예요.
HashMap hMap=new HashMap(); for(int i=0;i

좋은 웹페이지 즐겨찾기