====== HString ======
**deep** was developed with efficiency and speed in mind. String handling in Java is not very efficient. However, strings are widely used in a compiler. Therefore, we don't use regular Java strings (''java.lang.String'') but implement an more efficient version (''org.deepjava.strings.HString''). This version should be used throughout the compiler whenever speed is important. //String// and //HString// differ in many aspects:
* A HString must be registered before it can be used. A table contains all the registered HStrings.
* A registered HString exists exactly once. If two HStrings like "Hello World" are created and registered both references point to the same HString-object!
* Two registered HStrings can be compared by comparing there references.
* Be careful: two HStrings can only be compared if they were registered before.
* The central HString-table is created once. If a project is recompiled already registered HStrings remain in the table.
===== Implementation =====
[{{ .:hstrings_uml.png?400 |Class diagramm for HStrings}}]
Most strings contain characters which fit into 8 bit. If not 16 bits have to be used. This consumes more memory.
===== Correct Use =====
HStrings must be registered before they can be used. This is done with
HString.getRegisteredHString("...")
If a second HString with the same characters is created and registered both references point to the same HString. The comparison of two HStrings is way more efficient than with ''String.equals()''.
**An example:**
HString firstString = HString.getRegisteredHString("HelloWorld");
HString secondString = HString.getRegisteredHString("test");
if(firstString == secondString) {
// ...
}
It's possible to compare to non-registered HStrings as well as comparing a registered with a non-registered HString. For this the class HString contains the method //equals//.
HString firstString = HString.getRegisteredHString("one");
HString secondString = HString.getHString("one");
firstString == secondString // evalutes to false
firstString.equals(secondString) // evalutes to true