Почему не стоит использовать конструкторы типа new string

Обновлено: 03.05.2024

In java, String is a class .But we do not have to use new keyword to create an object of class String where as new is used for creating objects for other classes.

I have heard about Wrapper classes like Integer , Double which are similar to this. But String is not Wrapper,isn't it?

Actually what is happening when i use

?? How it is different from

Here is message a reference variable or something else?? Are there other classes which do not require new to create object ??

5 Answers 5

You can now choose to sort by Trending, which boosts votes that have happened recently, helping to surface more up-to-date answers.

Trending is based off of the highest score sort and falls back to it if no posts are trending.

With the following line you are not creating a new String object in the heap but reusing a string literal (if already available):

"Hai" is a string literal in the string literal pool. Since, strings are immutable, they are reusable so they are pooled in the string literal pool by the JVM. And this is the recommended way, because you are reusing it.

But, with the following you are actually creating a new object (in the heap):

new String("Hai") is a new String object. In this case, even if the literal "Hai" was already in the string literal pool, a new object is created. This is not recommended because chances are that you might end with more than one String objects with the same value.

Are there other classes which do not require new to create object ??

Actually, you can not create any object in Java without using the keyword new .

Does, not mean that the Integer object is created without using new . It's just not required for us to use the new keyword explicitly. But under the hood, if the Integer object with value 1 does not already exist in cache ( Integer objects are cached by JVM), new keyword will be used to create it.

Неизменяемость: Теперь, исходя из неизменности, класс String был разработан таким образом, чтобы значения в общем пуле можно было повторно использовать в других местах / переменных. Это справедливо, если String был создан как

String a = "Hello World!"; Однако, если я создам String как

String b = new String("Hello World!"); почему это тоже неизменное? (либо это?). Поскольку у него есть выделенная память в виде кучи, я смогу изменить это, не затрагивая другие переменные. Итак, по замыслу, была ли какая-то другая причина, по которой String в целом считается неизменным? Или мое вышеупомянутое предположение неверно?

Во-вторых, я хотел спросить об общем пуле строк . Если я создам строковый объект как

String c = ""; в пуле создается пустая запись?

new String() - это выражение, которое производит String . а String является неизменным, независимо от того, как оно создается.

(Спрашивать, является ли new String() изменчивым или нет, бессмысленно. Это программный код, а не значение. Но я полагаю, что вы на самом деле не это имели в виду.)

Если я создаю строковый объект, поскольку String c = ""; - это пустая запись, созданная в пуле?

Да; то есть запись создается для пустой строки. В пустом String нет ничего особенного.

(Чтобы быть педантичным, запись пула для "" создается задолго до выполнения вашего кода. Фактически, она создается, когда ваш код загружается . или, возможно, даже раньше.)

Итак, меня хотели узнать, является ли новый объект кучи неизменным, .

Да, это. Но неизменность - фундаментальное свойство объектов String. Все объекты String .

Видите ли, API String просто не предоставляет никаких методов для изменения String . Итак (за исключением некоторых опасных и глупых трюков 1 с использованием отражения), вы не можете изменить String .

Основная причина того, что Java String спроектирована как неизменяемый класс, - это простота. Это упрощает написание правильных программ и чтение / рассуждение о коде других людей, если основной строковый класс предоставляет неизменяемый интерфейс.

Вторая важная причина заключается в том, что неизменность String имеет фундаментальное значение для модели безопасности Java. Но я не думаю, что это был драйвер в оригинальном языковом дизайне . в Java 1.0 и ранее.

Исходя из ответа, я понимаю, что одной из причин являются другие ссылки на ту же переменную. Пожалуйста, дайте мне знать, правильно ли я понимаю это.

Нет. Это более фундаментально, чем это. Просто все объекты String неизменяемы. Чтобы понять это, не требуется никаких сложных рассуждений в частном случае. Это просто >> есть StringBuilder или StringBuffer . Но это разные типы String.

1 - Причина, по которой эти уловки (ИМО) опасны и глупы, заключается в том, что они влияют на значения строк, которые потенциально могут использоваться другими частями вашего приложения через пул строк. Это может вызвать хаос . так, что у следующего человека, обслуживающего ваш код, мало шансов выследить.

Обратите внимание, что в вашем примере изменяется ссылка, а не объект, на который она ссылается, т.е. b как ссылка может быть изменена и относиться к новому объекту. Но этот новый объект неизменен, а это значит, что его содержимое не будет изменено «после» вызова конструктора.

Вы можете изменить строку с помощью b=b+"x"; или b=new String(b); , и содержимое переменной a , похоже, изменится, но не путайте неизменность ссылки (здесь переменная b ) и объект, на который он ссылается (подумайте об указателях в C). Объект, на который указывает ссылка, останется неизменным после его создания.

Если вам нужно изменить строку, изменив содержимое объекта (вместо изменения ссылки), вы можете использовать StringBuffer , который является изменяемой версией String.

Теперь String B called "Test" .toUpperCase () which change the same object into "TEST" , so A will also be "TEST" `, что нежелательно.

Неизменяемость не является особенностью new , это особенность класса String . У него нет методов мутатора, поэтому он неизменяемый.

Строка неизменна, потому что не дает возможности ее изменить. Это сделано так, чтобы избежать какого-либо вмешательства (это окончательно, базовый массив не должен касаться . ).

Точно так же Integer неизменяем, потому что нет возможности его изменить.

Неважно, как вы это создаете.

Созданные строки всегда будут неизменными, независимо от того, как они созданы.

Ответы на ваши вопросы:

Единственная разница:
Когда строка создается как - , создается только один объект .
И когда он создается как - , создаются два объекта . Первый из-за того, что вы использовали ключевое слово 'new' , а второй из-за свойства String .

Да точно. В пуле будет создана пустая запись.

1- Строка является неизменной . См. Это:

Так что вы можете создать его разными способами.

2. Короткий ответ: Да будет пустым.

1) Неизменяемость: строка будет неизменной, если вы создадите ее новым или другим способом по соображениям безопасности.

2) Да, в пуле строк будет пустая запись.

Вы можете лучше понять концепцию, используя код

На самом деле все наоборот.

[. ] класс String был разработан таким образом, чтобы значения в общем пуле можно было повторно использовать в других местах / переменных.

Нет, класс String является неизменяемым, поэтому вы можете безопасно ссылаться на его экземпляр, не беспокоясь о его изменении из другой части вашей программы. Вот почему в первую очередь возможен пул.

Итак, рассмотрим это:

Что произойдет, если вы просто создадите ссылку на свою недавно созданную переменную b ?

Представьте, что вы передаете c (или, точнее, объект, на который он ссылается) методу в другом потоке и продолжаете работать с тем же экземпляром в своем основном потоке. А теперь представьте, что произошло бы, если бы строки были изменяемыми.

В любом случае, почему это так?

По крайней мере, это потому, что неизменяемые объекты делают многопоточность намного проще и, как правило, даже быстрее. Если вы разделяете изменяемый объект (это может быть любой объект с сохранением состояния, с изменяемыми частными / общедоступными полями или свойствами) между разными потоками, вам необходимо соблюдать особую осторожность, чтобы обеспечить синхронизированный доступ (мьютексы, семафоры). Даже в этом случае вам потребуется особая осторожность, чтобы обеспечить атомарность всех ваших операций. Многопоточность - это сложно.

Что касается последствий для производительности, обратите внимание, что довольно часто копирование всей строки в новый экземпляр для изменения даже одного символа на самом деле быстрее, чем вызов дорогостоящего переключения контекста из-за конструкций синхронизации, необходимых для обеспечения безопасного доступа к потокам. И, как вы упомянули, неизменяемость также предлагает возможности интернирования, что означает, что она действительно может помочь уменьшить использование памяти.

Неизменяемость строки означает, что вы не можете изменить сам объект, независимо от того, как вы его создали. А что касается второго вопроса: да, он создаст запись.

Строки постоянны; их значения нельзя изменить после того, как они создан .

Строковые буферы поддерживают изменяемые строки. Поскольку объекты String неизменяемы, ими можно делиться.

Вообще говоря: «все примитивные» (или связанные) объекты неизменны (пожалуйста, примите мой недостаток формализма).

Связанный пост о переполнении стека:

О пуле объектов : пул объектов - это оптимизация Java, которая НЕ связана с неизменяемыми объектами.

Это не совсем ответ на ваш вопрос, но если за вашим вопросом стоит желание иметь изменяемые строки, которыми вы можете манипулировать, вам следует проверить класс StringBuilder , который реализует многие из тех же методов, что и < > имеет, но также добавляет методы для изменения текущего содержания.

После того, как вы построили свою строку таким образом, что она вас устраивает, вы просто вызываете для нее toString() , чтобы преобразовать ее в обычный String , который вы можете передать библиотечным процедурам и другие функции, которые принимают только String s.

Кроме того, как StringBuilder , так и String реализуют интерфейс CharSequence , поэтому, если вы хотите писать функции в своем собственном коде, которые могут использовать как изменяемые, так и неизменяемые строки, вы можете объявить их, чтобы они принимали любые CharSequence объект.

1) Неизменяемая часть не из-за пула; это просто делает пул возможным в первую очередь. Строки часто передаются в качестве аргументов другим функциям или даже передаются другим потокам; Сделать Strings неизменяемыми было дизайнерским решением, чтобы упростить рассуждение в таких ситуациях. Итак, да - String в Java всегда неизменяемы, независимо от того, как вы их создаете (обратите внимание, что в java можно иметь изменяемые строки - только не с классом String ).

2) Да. Наверное. Я не уверен на 100%, но так должно быть.

Библиотеки Java в значительной степени оптимизированы с учетом ограничения, что любой объект String является неизменным, независимо от того, как этот объект построен. Даже если вы создадите свой b с помощью new , другой код, которому вы передадите этот экземпляр, будет рассматривать значение как неизменное. Это пример паттерна Value Object, в котором применимы все преимущества (потокобезопасность, нет необходимости делать частные копии).

Пустая строка "" является допустимым объектом String , как и все остальное, просто у нее нет внутреннего содержимого, и поскольку все строки констант времени компиляции интернированы, я практически гарантирую, что некоторое время выполнения библиотека уже вызвала его добавление в пул.

Строка неизменна независимо от того, как она создается.

1) Короткий ответ: да , new String() тоже неизменяем.

Потому что все возможные изменяемые операции (например, replace , toLowerCase etcetra), которые вы выполняете над String , не влияют на исходную String и возвращает новый экземпляр .

Вы можете проверить это в Javadoc для String . Каждый предоставленный метод public String возвращает новый экземпляр String и не изменяет текущий экземпляр, для которого вы вызвали метод.

Это очень полезно в многопоточной среде, поскольку вам не нужно думать об изменчивости ( кто-то изменит значение ) каждый раз, когда вы передаете или делитесь String . String может быть наиболее часто используемым типом данных, поэтому дизайнеры благословили всех нас, чтобы мы не думали каждый раз об изменчивости, и избавили нас от многих проблем.

Неизменяемость разрешена Пул строк или кеширование

Внутренний пул строк был возможен благодаря свойству неизменности, например, когда такое же значение String требуется в каком-то другом месте, возвращается эта неизменяемая ссылка. Если бы String был бы изменяемым, то было бы невозможно совместно использовать String для экономии памяти.

Неизменяемость строк возникла не из-за объединения, но неизменность имеет больше преимуществ.

Интернирование или объединение строк является примером шаблона проектирования «Легковес»

2) Да, он будет интернирован, как и любой другой String , поскольку пустой String также является String , как и другие экземпляры String .

Должен ли я вернуть this (меньше использования памяти) или скопированный объект new DecimalNumber(this) ?

Я бы подумал, что просто возвращение this должно быть хорошо, но есть ли когда-либо польза или причина для создания нового объекта или это когда-либо предпочтительнее?

Если класс является неизменным и окончательным, вы можете вернуть this .

Если он не окончательный, вы не можете быть уверены, что экземпляр this действительно неизменный. Вы можете иметь дело с подклассом, который добавляет изменяемое состояние.

Обратите внимание, что класс действительно неизменяем, только если:

  • Все его поля являются окончательными, даже частные. (Из-за модели памяти Java, позволяющей другим потокам видеть незавершенные / значения по умолчанию для неоконечных полей, неоконечное поле только с геттером недостаточно.)
  • Все его поля являются либо самими неизменяемыми классами, либо доступ к ним ограничен, так что вы можете быть уверены, что они никогда не будут изменены.

В вашем случае эти два условия выполняются, поскольку String является неизменным классом. Если вы знаете, что подклассов вашего класса не существует, то вы можете (на самом деле, имхо) вернуть this . Чтобы убедиться, что подклассы вашего класса не могут существовать, вы можете сделать это final .

Нет необходимости создавать копию неизменяемого объекта значения. Так как он неизменен, оригинал и копия будут эквивалентны на все времена, и поэтому иметь две копии бессмысленно.

Я бы не только return this в вашем примере, я бы пошел еще дальше и полностью удалил ваш конструктор копирования.

Например, класс Java String фактически имеет конструктор копирования. Но все, что это делается, приводят в код неопытные разработчики, которые либо не осознают его неизменность (или не понимают, что это означает), так и делают new String(aString) или new String("Hello") , который ничего не делает но тратить память и процессорные циклы.

Я бы вернул это, если объект действительно неизменен. Вам просто не нужны два экземпляра, которые всегда будут равны.

Почему вы чувствуете себя странно по поводу возвращения this ?

Если бы вы вернули новый объект, вам не понадобился бы if , поэтому возвращать new DecimalNumber(this) вообще нельзя!

Поскольку ваш объект неизменен, нам нужно создавать еще одну копию всякий раз, когда мы изменяем ее. Но здесь, добавление нуля не изменит значение объекта. Следовательно, мы можем вернуть тот же объект.

Подпишись на наш канал с тестами по HTML/CSS/JS в Telegram!

Программист смотрит на экран ноутбука

Photo by JASUR JIYANBAEV on Unsplash

Сайт DOU.UA составил подборку актуальных вопросов, которые задают на технических собеседованиях по JavaScript. Мы уже публиковали перевод первой части этой статьи, с вопросами для разработчиков-джуниоров. Теперь представляем вам перевод вопросов для разработчиков уровня Middle и Senior.

Middle

Общие вопросы

1. Расскажите о пирамиде тестирования.

2. Какие типы автоматизированных тестов вам случалось писать? Какие библиотеки при этом использовали? Какие инструменты предпочитаете и почему?

3. Что такое unit-тесты? Какое место в пирамиде тестирования занимают unit-тесты?

4. Что такое code coverage? Обязательно ли 100% покрытие кода тестами?

6. Что такое XSS (Cross-Site Scripting)?

7. Расскажите о паттернах Observer, Pub/Sub. Чем они отличаются? Приведите примеры реализации этих паттернов в известных фреймворках (библиотеках, браузерных API).

8. С какой целью может быть использован event listener события fetch self.addEventListener ( ‘fetch’, event => <>)?

9. Что такое Event loop и как он работает? Расскажите о микрозадачах и макрозадачах.

JS Core

10. Какие типы данных бывают в JavaScript? Каким будет результат выполнения кода?

11. Что такое temporal dead zone?

12. Как работает boxing/unboxing в JavaScript?

13. В чем разница между оператором in и методом hasOwnProperty?

14. Опишите, с помощью чего в JS реализуются такие ООП-парадигмы, как инкапсуляция, полиморфизм, абстракция?

15. Что такое прототип? Как работает прототипное наследование в JS? Объясните работу кода.

16. В чем разница между композицией и наследованием?

17. Почему не стоит использовать конструкторы типа new String?

18. Расскажите о базовом устройстве и механизме работы Event loop.

19. Что такое записи (records) и кортежи (tuples)? Чем они отличаются от обычных объектов?

20. Каковы различия в поведении ES5 функции-конструктора и ES2015 класса?

21. Как реализовать паттерн «Модуль»?

22. Почему typeof null возвращает object?

23. Что такое приведение (преобразование) типов в JS?

24. Что такое явное и неявное приведение (преобразование) типов данных в JS? Как происходит преобразование типов в следующих примерах:

25. Что такое Garbage Collector?

26. Опишите основные принципы работы «сборщика мусора» в JS-движках (engines).

27. Опишите назначение и принципы работы с коллекциями WeakMap и WeakSet. Чем они отличаются от коллекций Map и Set соответственно?

28. Чем Observable отличается от Promise?

29. Что такое Promise? Назовите порядок выполнения then и catch в цепочке.

30. Расскажите о последовательном и параллельном выполнении асинхронных функций. В чем разница между Promise.all ) и Promise.allSettled()?

31. Что такое дескрипторы свойств объектов? Расскажите об их практическом применении.

32. Назовите несколько способов создания постоянного объекта в JavaScript.

33. Как создать изменяемое свойство у объекта?

34. Зачем нужен конструктор Proxy? Приведите пример использования.

35. Что такое ArrayBuffer? В чем разница между Uint32Array и Float32Array? Каким будет результат выполнения кода?

36. Каким будет результат сравнения?

37. Расскажите о генераторах и итераторах.

38. Объясните, что делает следующий код:

39. Расскажите о типе данных Symbol и его практическом применении. Как перевести число из 10-разрядной системы в 16(2,8)-разрядную систему счисления?

Функции

40. Объясните, что означает currying. Приведите пример использования на практике.

41. Приведите пример функции с мемоизацией. Когда следует применять эту технику?

42. Что такое чейнинг функций? Напишите пример с использованием этого подхода.

43. В чем разница между function и arrow function? Каким будет результат выполнения кода?

Фронтенд

44. В чем принципиальная разница между событиями mouseleave и mouseout?

45. В каком порядке обрабатываются пользовательские события в DOM (click, mouseover и т.д.)? FIFO или LIFO?

46. Что такое Event bubbling и Event capturing?

47. Сравните методы объекта event stopPropagation и stopImmediateProparation.

48. Какие есть подходы к оптимизации производительности веб-страницы?

49. Как реализован механизм same-origin policy в браузере? На какие браузерные API он распространяется?

50. Назовите способы хранения данных в браузере. Сравните их.

51. Web worker-ы. Опишите особенности передачи данных между worker-ми и основным потоком, между разделенными worker-ми.

51. Что такое Transferable-объекты?

52. Расскажите о способах оптимизации выполнения ресурсоемких операций JS для улучшения производительности рендеринга контента на странице.

53. Почему ResizeObserver вызывает события изменения размера до воспроизведения элемента, а не после?

54. Расскажите, как вы понимаете Web Accessibility.

55. Опишите алгоритм создания функционала, обеспечивающего чтение содержимого .txt-файла при перетаскивании его из файловой системы в окно браузера.

56. Что такое Virtual DOM?

Клавиатура и мышь на рабочем столе.

Photo by Stefan Gall on Unsplash

Верстка

57. Объясните разницу между единицами измерения px, em, rem.

58. Для чего нужны CSS-переменные? Приведите несколько примеров использования.

59. Что произойдет при добавлении следующего селектора?

60. Как адаптировать страницу для печати?

61. Опишите особенности кастомизации стилей стандартных элементов форм.

62. Что такое progressive рендеринг? Какие подходы в нем используются?

63. Назовите несколько способов реализации lazy-loading медиаресурсов на странице.

64. Назовите популярные шаблонизаторы для фронтенд-разработки. Опишите особенности их использования.

65. Назовите популярные CSS-методологии и их различия.

66. Как работает CSS Grid?

67. Какие форматы изображений поддерживают анимацию?

68. Как отследить прогресс / окончание CSS @keyframes анимаций или плавных переходов, реализованных с помощью transition, в JS?

69. Какие CSS-свойства могут быть обработаны непосредственно через GPU? Что такое композитные слои и почему большое их количество может привести к аварийному завершению работы браузера на мобильных устройствах?

70. Как переиспользовать инлайновые SVG-элементы на странице?

71. Опишите способы оптимизации SVG-файлов.

72. Как реализовать иконочный шрифт из определенного набора SVG-файлов?

73. Что такое ложное жирное или ложное курсивное (Faux) начертания шрифтов?

75. Зачем нужны Custom Elements?

76. Почему удаление лишних символов пробелов (и символов переноса) в HTML не отражается на конечной производительности загрузки страницы?

77. Что такое контекст отображения canvas? Какие существуют типы контекста для рендеринга двумерной и трехмерной графики?

Angular

78. Как работает Dependency injection? Зачем это нужно? Расскажите об использовании кастомных инжекторов.

79. Что такое zone.js? Для чего Angular использует зоны? С какой целью можно использовать NgZone-сервис?

80. Как работает Change detection? Как можно оптимизировать компонент с помощью схем Change detection? Какие еще есть приемы для оптимизации рендеринга (связанные с Change detection)?

82. Какие есть подходы к организации работы с данными?

83. Как подготовить сборку к деплою?

84. Что такое NgRx? Когда стоит использовать?

85. В каких случаях лучше использовать Renderer-сервис вместо нативных методов? А наоборот?

86. Как работают и для чего нужны резолверы? Как получить данные, загруженные резолверами?

87. Как работают и зачем нужны динамические компоненты? Приведите примеры их целесообразного использования.

88. В чем разница между @ViewChild и @ContentChild?

89. Что делает код и как иначе можно связать класс компонента с переменной?

90. Как можно кэшировать данные, используя сервисы или RxJS?

91. Что такое асинхронная валидация форм? Когда она применяется и как реализуется?

92. Зачем нужна forRoot-функция модуля?

93. В чем разница между декларированием и экспортом компонента из модуля?

94. Почему плохо «провайдить» сервис из shared-модуля в lazy-loaded модуль? (Вопрос о scope модулей.)

95. Что такое ::ng-deep и для чего используется?

96. Какие тесты можно запустить для Angular-программы? Какие инструменты используют для тестирования Angular-программы?

97. Как протестировать API-сервис?

React

98. Что такое JSX? Что лежит в его основе?

99. Как работает алгоритм Virtual DOM?

100. Для чего нужно свойство key во время рендеринга списков?

101. В чем разница между функциональными и классовыми компонентами?

102. Когда и зачем нужно передавать props в super() при использовании классовых компонентов?

103. Почему нужно использовать setState () для обновления внутреннего состояния компонента?

104. В чем заключается принцип «подъема состояния»?

105. Какие библиотеки менеджмента состояния React-приложения вы знаете? Зачем они нужны?

106. Когда следует использовать Redux? Какие есть альтернативы?

107. Redux vs Mobx?

108. Расскажите о базовом принципе работы React Hooks.

109. В чем разница между createRef и useRef?

110. Когда следует использовать React refs? Когда не стоит?

111. Какие недостатки библиотеки React вы видите?

112. Какие паттерны используете вместе с React?

113. Как относитесь к типизации вместе с React?

114. Как построить хорошую архитектуру React-проекта?

115. Оптимизация React-приложений. Как измерить производительность программы?

116. Можно ли приложение на React встроить в другое приложение на React?

Бэкенд

117. Почему Node.js однопоточный, а не многопоточный?

118. Что такое event driven development?

119. Сравните методы fork() и spawn().

120. Расскажите о Node.js-фреймворки, которые вы использовали. Чем они отличаются?

121. Опишите словами код ендпоинта, который должен сохранить с клиента файл размером 4 гигабайта и положить его на S3 или другой CDN.

122. Что такое микросервисы, зачем их используют?

123. В каких случаях вы бы выбрали монолит, а в каких — микросервисы?

124. Как понять, что приложение в определенный момент работает исправно?

125. Как понять, что приложение за последние три дня работало исправно?

126. Как происходит проверка правильности пароля при использовании bcrypt?

127. Что такое JWT?

Базы данных

129. Что такое Redis и для чего его используют?

130. Какие базы данных вы использовали? Чем отличаются SQL и NoSQL?

131. Для двух таблиц — комментарии и пользователи — напишите запрос, который выбирает последние три комментария для каждого пользователя.

132. Как заказчик прошу вас выбрать базу данных для нового проекта. Ваши действия?

Программист в наушниках изучает код на экране.

Photo by Nubelson Fernandes on Unsplash

Инструменты и прочее

133. Для чего нужен package-lock.json?

134. В чем разница между npm install и npm ci?

135. Для чего нужны бандлеры?

136. Расскажите о модульном подключении скриптов. Приведите пример использования загрузчика / бандлера модулей.

138. Что такое staging area в git?

139. Опишите процесс code review. Назовите основные правила, способы разрешения конфликтов и споров во время его проведения.

Практические задания

140. Напишите функцию Sleep (ms), останавливающую выполнение async-функции на заданный промежуток времени.

141. Реализуйте один из методов массива (например, splice).

142. Напишите функцию с RegExp для нахождения всех HTML-ссылок в строке.

143. Реализуйте функцию, которая исполнит callback для всех элементов определенной ветви DOM-дерева.

144. Реализуйте таблицу с виртуальным скроллом.

145. Реализуйте функцию преобразования URL query строки в JSON.

146. Реализуйте функцию поиска пересечения двух массивов.

147. Реализуйте функцию/класс для генерации HTML.

148. Если есть проект с ограниченными сроками и некритичной производительностью, чем будете руководствоваться при выборе библиотек, подходов? Или все же будете обращать внимание на производительность? Или наоборот: сроки нелимитированные, производительность важна. Ваши действия?

Senior

Общие вопросы

1. Расскажите о функциональном программировании.

2. Что такое TDD (Test Driven Development) / BDD (Behavior Driven Development)?

4. Какой стек технологий можно выбрать для реализации клона какого-нибудь известного проекта и почему?

5. Есть проект на старых технологиях, в него необходимо вносить изменения. Как это лучше всего сделать?

6. (Если у кандидата есть опыт работы с несколькими фреймворками): какой фреймворк будете использовать для следующего проекта? Какие факторы будут влиять на выбор?

7. Что такое V8 Engine?

JS Core

10. Использование регулярных выражений. Когда приемлемо / неприемлемо? Как они работают? Как можно сделать читаемым код?

Фронтенд

11. Как браузер определяет, можем ли мы общаться между вкладками?

12. Что такое Content Security Policy?

13. Как избежать загрузки кэшированных файлов скриптов и стилей?

14. Что такое requestAnimationFrame?

15. Расскажите о микросервисной архитектуре Front-end App.

16. Что такое Shadow DOM?

17. Сравните nextElementSibling и nextSibling.

18. Какие знаете метрики веб-сайта?

Рабочий стол программиста (ноутбук, клавиатура, наушники).

Photo by Nubelson Fernandes on Unsplash

Angular

19. Как проводится конфигурация NgZone-модуля? Когда это необходимо?

20. Что вас раздражает в этом фреймворке? Что бы вы изменили?

21. Если бы вы решали, что добавить в следующем релизе фреймворка, какая фича это была бы?

22. Вам случалось писать кастомные декораторы? Если да, то зачем?

23. Сделайте ревью кода и сделайте замечания по архитектуре.

24. Расскажите, как бы вы делали такие фичи. Опишите архитектуру фичи в приложении.

Бэкенд

25. Сравните Common.js с AMD Modules и ES6 Imports.

26. Какой фреймворк вы выбрали бы для бэкенда и почему?

27. Опишите своими словами, как работает OAuth v2.

28. Есть проект с источниками утечки памяти. Как их обнаружить, устранить и предотвратить их появление в будущем?

29. Есть проект с performance issues. Как их обнаружить, устранить и предотвратить в будущем?

Базы данных

30. Какие альтернативные виды баз данных используете?

31. Что такое RDS и почему он иногда не подходит?

32. Что такое SQL Injections и как их избежать?

33. Почему для запросов в БД надо использовать плейсхолдеры?

34. Как спроектировать кластер на MongoDB?

35. Для чего используют MongoDB Aggregation framework?

36. Расскажите о GraphQL.

Инструменты

37. Можете ли вы описать суть методологии git flow в двух словах?

38. Что означает требование делать squash commits во время rebase?

39. Что думаете об альтернативных системах контроля версий (Version Control System)?

40. Какие конвенции знаете и используете для git?

41. Расскажите о своем опыте использования / внедрения СI/CD.

42. Нужно настроить деплой проекта на несколько сред. Расскажите, как бы вы построили процесс? Какие инструменты использовали бы?

Практические задания

43. Реализуйте асинхронный метод filter для Array (должны работать await).

44.Реализуйте функцию reduce с помощью рекурсии.

45. Как можно было бы сделать toggle-компонент, как в iPhone, без использования JS?

We normally create objects using the new keyword, like:

Strings are objects, yet we do not use new to create them:

Why is this? Can I make a String with new ?

Note that new String(. ) has been used to circumvent an implementation detail when substringing large strings. This was fixed in Java 7 and is not necessary any more.

15 Answers 15

You can now choose to sort by Trending, which boosts votes that have happened recently, helping to surface more up-to-date answers.

Trending is based off of the highest score sort and falls back to it if no posts are trending.

In addition to what was already said, String literals [ie, Strings like "abcd" but not like new String("abcd") ] in Java are interned - this means that every time you refer to "abcd", you get a reference to a single String instance, rather than a new one each time. So you will have:

then it's possible to have

(and in case anyone needs reminding, always use .equals() to compare Strings; == tests for physical equality).

Interning String literals is good because they are often used more than once. For example, consider the (contrived) code:

If we didn't have interning of Strings, "Next iteration" would need to be instantiated 10 times, whereas now it will only be instantiated once.

By using String a = new String("abcd"), does it means two string with similar content are present in memory.

Right - the compiler will not necessarily check to see if such a String has already been interned (though you could certainly write one that did).

yes, this optimization is possible because strings are immutable and therefore can be shared without problems. the shared "asdf" handling is an implementation of the 'Flyweight' design pattern.

What do you mean by "== tests for object equality"? This doesn't seem true to me, but perhaps you meant something different from what this seems to mean.

Strings are "special" objects in Java. The Java designers wisely decided that Strings are used so often that they needed their own syntax as well as a caching strategy. When you declare a string by saying:

Java is smart enough to work out that myString and myOtherString are the same and will store them in a global String table as the same object. It relies on the fact that you can't modify Strings to do this. This lowers the amount of memory required and can make comparisons faster.

If, instead, you write

Java will create a brand new object for you, distinct from the myString object.

Hey . it doesn't require "infinite wisdom" to recognize the need for some kind of syntactic support for string literals. Just about every other serious programming language design supports some kind of string literal.

Hope this clears a few doubts. :)

String d = new String("def"); // 1 Object + "def" is added to the Pool -> here "def" would be added to the pool only if it's not there yet

String c = new String("abc"); // 1 Object . is this statement correct? If "abc" already referenced from the constant pool then what is the use of inter method?

We usually use String literals to avoid creating unnecessary objects. If we use new operator to create String object , then it will create new object everytime .

For the above code in memory :

enter image description here

It's a shortcut. It wasn't originally like that, but Java changed it.

This FAQ talks about it briefly. The Java Specification guide talks about it also. But I can't find it online.

String is subject to a couple of optimisations (for want of a better phrase). Note that String also has operator overloading (for the + operator) - unlike other objects. So it's very much a special case.

In Java, Strings are a special case, with many rules that apply only to Strings. The double quotes causes the compiler to create a String object. Since String objects are immutable, this allows the compiler to intern multiple strings, and build a larger string pool. Two identical String constants will always have the same object reference. If you don't want this to be the case, then you can use new String(""), and that will create a String object at runtime. The intern() method used to be common, to cause dynamically created strings to be checked against the string lookup table. Once a string in interned, the object reference will point to the canonical String instance.

When the classloader loads a class, all String constants are added to the String pool.

Well the StringPool is implemented using The Hashmap in java. If we are creating always with a new keyword its not searching in String Pool and creating a new memory for it which might be needed later if we have a memory intensive operation running and if we are creating all the strings with new keyword that would affect performance of our application. So its advisable to not to use new keywords for creating string because then only it will go to String pool which in turn is a Hashmap ,(memory saved , imagine if we have lots of strings created with new keyword ) here it will be stored and if the string already exists the reference of it(which would usually reside in Stack memory) would be returned to the newly created string. So its done to improve performance .

Syntactic sugar. The

syntax is still available.

This is not quite right. s=new String("ABC") will not give you the same results as s="ABC". See danben's comment.

Also, somewhat ironically, it will first create a String instance representing "ABC" inline - and then pass that as an argument to the constructor call which will create an return a String of identical value.

The valid use case for this constructor is String small = new String(huge.substring(int, int)); , which allows you to recycle the big underlying char[] from the original huge String.

@PascalThivent yes but not anymore with Java 8. It does not share arrays anymore (in preparation for other optimizations like automatic string deduplication with G1 or upcoming string compression).

Читайте также: