Нет, не совсем.
1130 Во-первых, есть небольшая разница в семантике. Если a
равно null
, то a.concat(b)
выбрасывает NullPointerException
, но a+=b
будет обрабатывать исходное значение a
, как если бы это было null
. Кроме того, метод concat()
принимает только значения String
, в то время как оператор +
автоматически преобразует аргумент в строку (используя метод toString()
для объектов). Таким образом, метод concat()
более строг в отношении того, что он принимает.
Чтобы заглянуть под капот, напишите простой класс с a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Теперь разберите с javap -c
(входит в Sun JDK). Вы должны увидеть список, включающий:
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
Итак, a += b
является эквивалентом
a = new StringBuilder()
.append(a)
.append(b)
.toString();
Метод concat
должен быть быстрее. Однако с большим количеством строк метод StringBuilder
выигрывает, по крайней мере, с точки зрения производительности.
Исходный код String
и StringBuilder
(и его закрытый для пакета базовый класс) доступен в src.zip Sun JDK. Вы можете видеть, что вы создаете массив символов (изменяя размер по мере необходимости), а затем выбрасываете его, когда создаете финал String
. На практике распределение памяти происходит на удивление быстро.
Обновление: Как отмечает Павел Адамски, производительность изменилась в более позднем HotSpot. javac
все еще производит точно такой же код, но компилятор байт-кода обманывает. Простое тестирование полностью терпит неудачу, потому что весь объем кода отбрасывается. Суммирование System.identityHashCode
(не String.hashCode
) показывает, что код StringBuffer
имеет небольшое преимущество. Может быть изменено при выходе следующего обновления или при использовании другой JVM. Из @lukaseder , списка встроенных функций HotSpot JVM .
Прежде чем вы начнете, я бы порекомендовал изучить возможность SQL-серверов хранить XML-файлы как объекты BLOB внутри реляционной базы данных. Возможно, вашу систему хранения данных не нужно создавать «с нуля». Это может быть гибрид на основе возможностей хранения XML SQL.
Движение NoSQL нацелено на системы огромного масштаба, в тех размерах, где реляционная модель действительно ломается. Прежде чем вы начнете писать свое собственное хранилище, я настоятельно рекомендую разобраться в реляционной модели, поскольку это одна из хорошо документированных и хорошо изученных областей в CS. Начните с Обработки транзакций Грея и Рейтера , эта книга объясняет все , что нужно знать о реализации классической СУБД. Следующим в вашем списке должны быть Readings in Database Systems , это сборник наиболее актуальных научных работ и статей.
Well it all depends on the app you are building.
For example, if your app just needs to persist a few hundred objects and cut through them in a few ways and doesn't care if stuff gets corrupt once in a while. You could potentially just use LINQ to query a List and persist the List to disk once in a while.
If you need anything that has the magic ACID properties, well its going to take tons of work.
If you need something that supports Transactions, its going to take tons of work.
If you need something that understands the ANSI-SQL, you are going to have to write a parser, which is lots of work.
Before embarking on writing any kind of database I think you should understand a lot of database theory, get a book, read it.
Взгляните на работу, проделанную ребятами из Prevayler. Они отмечают, что если вы можете уместить данные в оперативной памяти, большинство сценариев использования показывают гораздо лучшую производительность и намного меньше написания кода без СУБД. С другой стороны, ребята из Google и Amazon показывают, что для больших объемов данных вы не хотите использовать СУБД. Поскольку мы переходим на 64-разрядные ОС и компьютеры с большим количеством оперативной памяти, СУБД находятся между камнем и наковальней.
Вопрос SO «Внедрение базы данных - как начать» дает несколько полезных ответов на ваш вопрос!