일단 String 개체가 생성되면 수정할 수 없습니다. 그러나 작업을 수행하면 JVM에서 새 개체를 만듭니다. 여기에 새로운 객체를 생성하면 JVM이 더 많은 메모리를 소비합니다. 그럼 내가 메모리 문제를 일으키는 것 같아요.?문자열 불변의 문제 문제
답변
당신은 정확합니다. 이 문제는 에 대해 알고있을 가치가 있습니다 (매번 영향을 미치지 않더라도).
당신이 말했듯이, 문자열은 생성 후 변경할 수 없습니다. 문자열은 변경할 수 없으며 변경할 수있는 방법이 많지 않습니다.
그러나, 이러한 분할()와 같은 작업은 백그라운드에서 추가 문자열 객체를 생성되며, 당신이 그들을에 대한 참조로 유지하는 경우 그 문자열의 각각 memory overhead 있습니다.다른 포스터는 개체가 작고 가비지 수집은 일반적으로 범위를 벗어난 후 오래된 개체를 정리하므로 일반적으로 걱정할 필요가 없습니다.
그러나 특정 작업을 수행하고 대량의 문자열 참조를 보유하면이 문제가 발생할 수 있습니다.
사용 사례에 따라 interning 문자열을 살펴보고 링크 된 페이지의 경고를 주목하십시오.
두 가지 참고 사항 :
1) 하드 코딩 된 문자열 리터럴이의 영향을 감소 자바에 의해 automatically interned 될 것입니다.
2) + 연산자는이 점에서 더 효율적입니다, 그것은 성능 & 메모리 혜택을 제공 아래 문자열 빌더를 사용합니다.
아니요. String 인스턴스에 대한 강력한 링크가없는 경우에는 결국 가비지 수집기에서 수집합니다. 예를 들어
: 생성 된 인스턴스가 쓰레기가 될 당신이 지속적으로 새로운 객체의 인스턴스를 생성이 조각에서
while (true) {
new String("that is a string");
}
는, 그러나 당신이 OutOfMemoryException이 얻을하지 않습니다 (분명히 더 강력한 링크가 없습니다).
이것은 (a) 문자열이'new String'을 사용하여 거의 만들어지지 않기 때문에 좋은 예가 아닙니다. (b) OP와 같이 문자열을 수정하지 않습니다. – dogbane
@dogbane,'new String()'으로 생성 된 String 인스턴스와 수정 후에 내부적으로 생성 된 String 인스턴스 사이에 어떤 건설적인 차이점이 있습니까? –
게다가이 예에서는 자바 것 자동으로 인턴 문자열 리터럴이 아니 대표적인 예 그래서 - http://stackoverflow.com/questions/1855170/when-should-we-use-intern-method-of-string –
생성되는 문제는 가비지가 생성된다는 것입니다. 이 문제는 가비지 수집기를 호출하여 가비지에서 사용하는 메모리를 비우는 것으로 가상 컴퓨터가 해결합니다.
새로운 개체에 더 많은 메모리를 사용합니다. 그러나 가비지 컬렉터는 모든 액세스 할 수없는 메모리를 즉시 회수하기 때문에 그 자체로는 문제가 발생하지 않습니다. 물론 새로 생성 된 문자열에 대한 링크를 생성하여 문제가 될 수 있지만 JVM이 아니라 프로그램의 문제 일 수 있습니다.
이전 개체를 더 이상 사용하지 않는 즉시 가비지 수집기에서 제거 할 수 있습니다. (어떤 메모리 문제가 발생하기 훨씬 전에 완료됩니다).
데이터 복사를 방지하려면 StringBuilder를 사용하십시오.
사용하지 않은 개체는 GC로 수집됩니다.
및 Immutability는 Java에서 많은 이점을 얻었습니다.
자바에서는 가능한 한 많은 불변성을 달성하는 것이 좋습니다.
이들은 Collections 프레임 워크에서도 안전하게 사용할 수 있습니다.
너무 광범위하게 일반화하고 있습니다. 불변성은 일부 장소에서 유용하지만 다른 장소에서는 유용합니다. 내가 합의한 – Torben
나는 당신이 모든 곳에서 불변성을 사용해야한다고 말한 적이 없다. 나는 단지 많은 이익을 얻었고 Collections.Dven에서 사용할 수 있다고 말했다. Joshua bloch는 Effective java –
당신이 거대한 문자열의 작은 문자열을 복용에 대해 알아야 할 가장 큰 메모리 문제. 해당 부분 문자열은 원래 문자열의 char 배열을 공유하며 원래 문자열이 gc'd가 되더라도 거대한 char 배열은 여전히 부분 문자열에 의해 참조됩니다. 해결 방법은 new String(hugeString.substring(i))
을 사용하는 것입니다.
는 지금까지 내가 (스레드 안전 또는 StringBuffer를) 의 StringBuilder 알고있는 문자열을 관리하고 그들을 변경할 수 있도록하는 데 유용합니다.
메모리에 바이트를 '먹는'하지 않는 거대한 문자열의 일부 문자를 조작 할 수 있습니다.그것은 또한 concate를위한 더 강력한/속도입니다.
문자열 인스턴스가 변경 불가능하기 때문에 jvm에서 재사용 할 수 있습니다. String 클래스는 메모리 문제를 피하기 위해 사용되는 Flyweight Design Pattern을 사용하여 구현됩니다.
- 1. 루핑 통역 문자열 - 불변의 문제
- 2. 불변의 문자열 대 std :: 문자열
- 3. 불변의 닷 넷 문자열
- 4. 불변의 문자열 클래스입니까?
- 5. 문자열 문제
- 6. C# - 문자열 문제 내 문자열?
- 7. 문제 해결 binascii 홀수 길이 문자열 문제
- 8. 루비 한자 문자열 문제
- 9. fscanf 문자열 읽기 문제
- 10. 문자열 길이 문제
- 11. SQL 연결 문자열 문제
- 12. Jquery 객체와 문자열 문제
- 13. Edittext 문자열 확인 문제
- 14. 두 문자열 비교 문제 ...!
- 15. 문자열 정의 문제
- 16. Android : 문자열 표시 문제
- 17. NHibernate에 연결 문자열 문제
- 18. 스칼라의 문자열 배열 문제
- 19. JAVA : NamedQuery 문자열 문제
- 20. C 문자열 문제
- 21. 문자열 인코딩 문제
- 22. 문자열 조작 성능 문제
- 23. 문제 문자열 끝 확인
- 24. 아이폰 : 문제 대체 문자열
- 25. 문자열 표시 문제
- 26. iphonesdk 문자열 추가 문제
- 27. NSMutable 문자열 문제
- 28. 연결 문자열 문제
- 29. mysqldb.exeute의 문자열 교체 문제
- 30. VBA 문자열 길이 문제
무언가를 변경할 수있게하려면 대신 StringBuilder를 사용할 수 있습니다. –