==
тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).
.equals()
тесты для равенства значений (независимо от того, являются ли они логически «равными»).
Objects.equals () проверяет наличие null
перед вызовом .equals()
, поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).
String.contentEquals () сравнивает содержимое String
с содержимым любого CharSequence
(доступно с Java 1.5).
Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals()
.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Вы почти всегда хотите использовать Objects.equals()
. В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==
.
Из JLS 3.10. 5. Строковые литералы :
Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса
String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя методString.intern
.. Подобные примеры также можно найти в JLS 3.10.5-1 .
Как объяснялось во введении HTML-учебника , HTMLWorker
устарели много лет назад. Он не предназначен для преобразования полных HTML-страниц. Он не знает, что на странице HTML есть раздел <head>
и <body>
; он просто разбирает весь контент. Он предназначен для анализа небольших фрагментов HTML, и вы можете определять стили с помощью класса StyleSheet
; Настоящий CSS не поддерживался.
Затем появился XML Worker. XML Worker предназначался как универсальная среда для анализа XML. В качестве доказательства концепции мы решили написать некоторые функциональные возможности XHTML для PDF, но мы не поддерживали все теги HTML. Например: формы вообще не поддерживались, и было очень сложно поддерживать CSS, который используется для размещения контента. Формы в HTML очень сильно отличаются от форм в PDF. Также существует несоответствие между архитектурой iText и архитектурой HTML + CSS. Постепенно мы расширили XML Worker, в основном на основе запросов от клиентов, но XML Worker стал монстром со многими щупальцами.
В конце концов, мы решили переписать iText с нуля, с требованиями для преобразования HTML + CSS в разум. Это привело к iText 7 . В дополнение к iText 7 мы создали несколько надстроек, наиболее важным из которых является pdfHTML .
Использование в последней версии iText (iText 7.1.0 + pdfHTML 2.0.0) код для преобразования HTML из вопроса в PDF сводится к этому фрагменту:
public static final String SRC = "src/main/resources/html/sample.html";
public static final String DEST = "target/results/sample.pdf";
public void createPdf(String src, String dest) throws IOException {
HtmlConverter.convertToPdf(new File(src), new File(dest));
}
Результат выглядит следующим образом:
Как вы можете видеть, это в значительной степени результат, которого вы ожидаете. Так как iText 7.1.0 / pdfHTML 2.0.0, шрифтом по умолчанию является Times-Roman. CSS уважается: изображение теперь плавает справа.
Разработчики часто не возражают против перехода на новую версию iText, когда я даю совет обновить до iText 7 / pdfHTML 2. Разрешить мне ответить на три основных аргумента, которые я слышу:
Мне нужно использовать бесплатный iText, а iText 7 не является бесплатным / файл pdfHTML add -on является закрытым источником.
iText 7 выпущен с использованием AGPL, так же как iText 5 и XML Worker. AGPL позволяет бесплатное использование в смысле бесплатно в контексте проектов с открытым исходным кодом. Если вы распространяете закрытый исходный / проприетарный продукт (например, используете iText в контексте SaaS), вы не можете использовать iText бесплатно; в этом случае вам необходимо приобрести коммерческую лицензию. Это уже было верно для iText 5; это все еще верно для iText 7. Что касается версий до iText 5: , вы не должны использовать их вообще . Что касается pdfHTML: первые версии действительно были доступны только в виде программного обеспечения с закрытым исходным кодом. У нас была тяжелая дискуссия в iText Group: с одной стороны, были люди, которые хотели избежать массового злоупотребления со стороны компаний, которые не слушают своих разработчиков, когда те разработчики сообщают, что это открытый источник не является так же как и бесплатно. Разработчики рассказывали нам, что их босс заставил их поступать не так, и что они не смогли убедить своего босса приобрести коммерческую лицензию. С другой стороны, были люди, которые утверждали, что мы не должны наказывать разработчиков за неправильное поведение их боссов. В конце концов, люди в пользу open sourcing pdfHTML, то есть разработчики iText, выиграли этот аргумент. Убедитесь, что они не ошибаются и правильно используют iText: соблюдайте AGPL, если вы используете iText бесплатно ; убедитесь, что ваш босс покупает коммерческую лицензию, если вы используете iText в контексте с закрытым исходным кодом.
Мне нужно поддерживать устаревшую систему, и мне нужно использовать старую версию iText.
Серьезно? Техническое обслуживание также предполагает применение обновлений и переход на новые версии программного обеспечения, которое вы используете. Как вы можете видеть, код, необходимый при использовании iText 7 и pdfHTML, очень прост и менее подвержен ошибкам, чем тот, который нужен ранее. Проект миграции не должен занять слишком много времени.
Я только что начал, и я не знал о iText 7; Я узнал только после того, как закончил свой проект.
Вот почему я отправляю этот вопрос и отвечаю. Подумайте о себе как о программисте eXtreme. Отбросьте весь свой код и начните заново. Вы заметите, что это не так много работы, как вы себе представляли, и вы будете лучше спать, зная, что вы сделали ваш проект надежным, потому что iText 5 постепенно прекращается. Мы по-прежнему предлагаем поддержку для оплаты клиентов, но в конечном итоге мы прекратим поддерживать iText 5 вообще.