자바 의 toString()방법 인 스 턴 스 코드

10098 단어 자바tostring방법.
선언:
      toString()방법 은 모두 가 사용 한 것 이 라 고 믿 습 니 다.일반적으로 대상 의 관련 데 이 터 를 문자열 로 되 돌려 줍 니 다.
최근 항목 에 Array List>datas 가 필요 합 니 다.  형식의 집합 처리.
처리 요 구 는 집합 데 이 터 를 문자열 형식 으로 변환 합 니 다.형식 은 하위 집합 1 데이터+"\#"+하위 집합 2 데이터+"\#"+...+부분 집합 n 데이터 입 니 다.
예:집합 데이터:[1,2,3],[2,3,5]]  '[1,2,3]\#[2,3,5]'형식의 문자열 로 전환 해 야 합 니 다.
첫 번 째 는 이렇게 처리 했다.

 ArrayList<ArrayList<Object>> a = new ArrayList<>();  //             [[1,2],[2,3]]          [1,2]#[2,3]
    for (int i = 0; i < 2; i++) { 
      ArrayList<Object> c = new ArrayList<>();
      c.add(i+1);
      c.add(i+2);
      a.add(c);
      //               
      Log.i("myinfo",c.toString());
    }
    StringBuilder builder = new StringBuilder();
    builder.append(a.get(0).toString()+"#"+a.get(1).toString());
    //             
    Log.i("myinfo",builder.toString());
그리고 처리 할 로그 로 그 를 보십시오:
05-12 10:29:18.485 9565-9565/com.xxx.aaa I/myinfo: [1, 2]
05-12 10:29:18.485 9565-9565/com.xxx.aaa I/myinfo: [2, 3]
05-12 10:29:18.495 9565-9565/com.xxx.aaa I/myinfo: [1, 2]#[2, 3]
 우리 가 원 하 는 것 은[1,2]\#[2,3]형식의 문자열 이지 만 결 과 는[1,2]\#[2,3]이다.  ,두 번 째 값 이 뒤로 가기 시작 하 자 앞 에 빈 칸 이 하나 더 생 겼 다.
다음은 집합 한.toString()방법의 원본 코드 를 살 펴 보 겠 습 니 다.
공식 설명
1.이 Collection 클래스(Set 과 List 의 부모 클래스)의 문자열 표현 형식 을 되 돌려 줍 니 다.
       2.이 표현 형식 은 규정된 형식 이 있 는데 사각형 괄호'[]'에 포함 된다.
       3.안에 있 는 하위 요소 가","(쉼표 와 빈 칸)분할(이것 이 중점 입 니 다)

 /**
   * Returns the string representation of this {@code Collection}. The presentation
   * has a specific format. It is enclosed by square brackets ("[]"). Elements
   * are separated by ', ' (comma and space).
   *
   * @return the string representation of this {@code Collection}.
   */
  @Override
  public String toString() {
    if (isEmpty()) {
      return "[]";
    }
    StringBuilder buffer = new StringBuilder(size() * 16);
    buffer.append('[');
    Iterator<?> it = iterator();
    while (it.hasNext()) {
      Object next = it.next();
      if (next != this) {
        buffer.append(next);
      } else {
        buffer.append("(this Collection)");
      }
      if (it.hasNext()) {
        buffer.append(", ");
      }
    }
    buffer.append(']');
    return buffer.toString();
  }
이 Collection 아래 의.toString()방법 소스 코드 를 분석 하여 몇 부분 으로 나 눕 니 다.
1.집합 이 비어 있 는 지 판단(empty),즉 집합 안에 데이터 가 있 는 지 판단 합 니 다.빈 값(데이터 없 음)이 라면 문자열'[]'을 되 돌려 줍 니 다.
      2.집합 이 빈 값 이 아니라면 데이터 가 있 음 을 나타 낸다.
① 다음 하위 요소(Object next=it.next()를 반복 해서 가 져 옵 니 다.이 하위 요소 가 집합 자체 라면 StringBuffer 클래스 의 buffer 대상 에"(this Collection)"을 추가 합 니 다.
②、이 하위 요소 가 집합 자체 가 아니라면 buffer 대상 에 추가
③、이 하위 요소 아래 에 하위 요소 가 있 으 면"buffer 대상 에 추가 하여 인접 한 하위 요 소 를 분할 하 는 데 사용 합 니 다.
3.StringBuffer.toString()문자열 을 되 돌려 줍 니 다.
이 를 통 해 알 수 있 듯 이 반환[1,2]\#[2,3]은 공식 적 으로 정확 한 반환 형식 이다.그러면 이 문제 에 대해 소스 코드 를 바 꿀 수 없 는 상황 에서 얻 은 문자열 뒤에'replace All'(',')을 사용한다.문자열 의 빈 칸 을 모두 제거 합 니 다.
메모:원본 코드 에 코드 가 있 습 니 다:         

   if (next != this) {
        buffer.append(next);
      } else {
        buffer.append("(this Collection)");
      }
여기 서 일부 학생 들 이 이해 하지 못 할 수도 있 습 니 다.여기 서 예 를 들 어 위의 그것 입 니까?우 리 는 서브 집합 에 코드 c.add(c)를 추가 합 니 다.집합 자 체 를 집합 에 추가 하여 인쇄 결 과 를 보 세 요.

ArrayList<ArrayList<Object>> a = new ArrayList<>();
    for (int i = 0; i < 2; i++) {
      ArrayList<Object> c = new ArrayList<>();
      c.add(i+1);
      c.add(i+2);
      c.add(c);
      //               
      Log.i("myinfo",c.toString());
    }
로그 결과 의 빨간색 부분 을 보 세 요.알 아 보 셨 나 요?집합 에 있 는 하위 요소 가 집합 자체 라면'(this Collection)'을 집합 으로 되 돌려 줍 니 다.
05-12 10:58:00.615 8424-8424/com.maiji.magkarepatient I/myinfo: [1, 2, (this Collection)]
05-12 10:58:00.615 8424-8424/com.maiji.magkarepatient I/myinfo: [2, 3, (this Collection)]  
이로써 위의 이 문 제 는 해결 되 었 습 니 다.다음은 다른 종류의'toString()소스 코드 를 보 겠 습 니 다.
개체

/**
   * Returns a string containing a concise, human-readable description of this
   * object. Subclasses are encouraged to override this method and provide an
   * implementation that takes into account the object's type and data. The
   * default implementation is equivalent to the following expression:
   * <pre>
   *  getClass().getName() + '@' + Integer.toHexString(hashCode())</pre>
   * <p>See <a href="{@docRoot}reference/java/lang/Object.html#writing_toString">Writing a useful
   * {@code toString} method</a>
   * if you intend implementing your own {@code toString} method.
   *
   * @return a printable representation of this object.
   */
  public String toString() {
    return getClass().getName() + '@' + Integer.toHexString(hashCode());
  }
공식 설명
1.이 Object 에 대한 간단명료 하고 읽 을 수 있 는 문자열 을 되 돌려 줍 니 다.
2.Object 류 의 하위 클래스 는 이 방법 을 재 작성 하여 대상 을 설명 하 는 유형 과 데 이 터 를 제공 하도록 격려 합 니 다.
3.기본 적 인 실행 형식 은 아래 의 이 예 와 일치 합 니 다.

getClass().getName() + '@' + Integer.toHexString(hashCode())</pre>
요약:클래스 에.toString()방법 을 다시 쓰 지 않 았 을 때 루트 Object 의 이.toString()방법 을 실행 합 니 다.
반환 형식:대상 의 클래스 이름+@+해시 값 의 16 진수

getClass().getName()          
hashCode()         
Integer.toHexString(hashCode())        16    
예:

Object d = new Object();
Log.i("myinfo",d.toString());
05-12 11:23:00.758 17406-17406/com.maiji.magkarepatient I/myinfo: java.lang.Object@e23e786
2.String,StringBuilder,StringBuffer
세 가 지 는 모두 문자열 의 표현 형식 이지 만 차이 가 있다.
  ①、String.toString()  , 직접 돌아 가기

  /**
   * Returns this string.
   */
  @Override
  public String toString() {
    return this;
  }
  ②、StringBuilder
공식 설명:이 builder 대상 의 내용 을 문자열 로 되 돌려 줍 니 다.

/**
   * Returns the contents of this builder.
   *
   * @return the string representation of the data in this builder.
   */
  @Override
  public String toString() {
    /* Note: This method is required to workaround a compiler bug
     * in the RI javac (at least in 1.5.0_06) that will generate a
     * reference to the non-public AbstractStringBuilder if we don't
     * override it here.
     */
    return super.toString();
  }
슈퍼.toString()으로 거 슬러 올 라 가 실현

 /**
   * Returns the current String representation.
   *
   * @return a String containing the characters in this instance.
   */
  @Override
  public String toString() {
    if (count == 0) {
      return "";
    }
    return StringFactory.newStringFromChars(0, count, value);
  }
  ③、StringBuffer

@Override
  public synchronized String toString() {
    return super.toString();
  }
슈퍼.toString()으로 거 슬러 올 라 가기

/**
   * Returns the current String representation.
   *
   * @return a String containing the characters in this instance.
   */
  @Override
  public String toString() {
    if (count == 0) {
      return "";
    }
    return StringFactory.newStringFromChars(0, count, value);
  }
종합해 보면 StringBuffer 와 StringBuilder 는 결국 부모 급 을 호출 한 것 으로 나 타 났 다.  “AbstractString Builder"의 toString()방법
그러나 그들 자체 의 toString()은 다르다.우 리 는 이 를 통 해 정리 할 수 있다.
1.StringBuilder:스 레 드 가 안전 하지 않 습 니 다.
     StringBuffer:스 레 드 가 안전 합 니 다.
      2.StringBuilder 처리 속도 가 StringBudiler 보다 훨씬 빠르다
3.단일 스 레 드 대량의 데이터 조작,StringBuilder 사용  ,StringBuilder 속도 가 빠 르 기 때문에 단일 스 레 드 때문에 안전성 을 고려 하지 않 습 니 다.
      다 중 스 레 드 대량 데이터 조작,StringBuffer 사용   ,  StringBuffer 가 안전 하 니까.
지도
원본 코드 먼저 보기:
되 돌아 오 는 형식 은{key 1=value 1,key 2=value 2}입 니 다.
주의 하 다.   1.맵 집합 에 데이터 가 없 을 때 되 돌아 오기{}
2.두 개의 데 이 터 를 사용 하기 전에","분할,Collection 과 일치 하 며 하나의 쉼표,하나의 빈 칸"을 사용 합 니 다.
       3.키 값 이 집합 자체 일 때 추가  (this Map)

public String toString() {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (! i.hasNext())
      return "{}";
    StringBuilder sb = new StringBuilder();
    sb.append('{');
    for (;;) {
      Entry<K,V> e = i.next();
      K key = e.getKey();
      V value = e.getValue();
      sb.append(key  == this ? "(this Map)" : key);
      sb.append('=');
      sb.append(value == this ? "(this Map)" : value);
      if (! i.hasNext())
        return sb.append('}').toString();
      sb.append(',').append(' ');
    }
  }
예:    

 Map<String,String> map = new HashMap<>();
    map.put("keyA","valueA");
    map.put("keyB","valueB");
    map.put("keyC","valueC");
    Log.i("myinfo",map.toString());
인쇄 결과:

05-12 11:41:30.898 4490-4490/com.maiji.magkarepatient I/myinfo: {keyA=valueA, keyB=valueB, keyC=valueC}
위 에서 말 한 것 은 소 편 이 소개 한 자바 의 toString()방법 인 스 턴 스 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기