Существует два общих и связанных значения таблиц символов здесь.
Первый, в Ваших объектных файлах существует таблица символов. Обычно, компилятор C или C++ компилирует единственный исходный файл в объектный файл с .obj или.o расширением. Это содержит набор исполняемого кода и данных, которые компоновщик может обработать в рабочее приложение или совместно использованную библиотеку. Объектный файл имеет структуру данных, названную таблицей символов в нем, которая отображает различные объекты в объектном файле к именам, которые может понять компоновщик. Если Вы вызываете функцию от своего кода, компилятор не помещает заключительный адрес стандартной программы в объектном файле. Вместо этого это помещает значение заполнителя в код и добавляет примечание, которое говорит компоновщику искать ссылку в различных таблицах символов от всех объектных файлов, которые это обрабатывает, и засуньте заключительное местоположение там.
113-секундный, существует также таблица символов в общей библиотеке или DLL. Это производится компоновщиком и подачами для именования всех функций и элементов данных, которые видимы пользователям библиотеки. Это позволяет системе делать динамическое подключение, разрешая открытые ссылки на те имена к местоположению, где библиотека загружается в памяти.
, Если Вы хотите узнать больше, я предлагаю превосходную книгу John Levine "Компоновщики и Загрузчики". текст ссылки
Как сказано в OP A
и B
никогда не равны нулю, C
может быть нулевым, используйте это:
if(A.equals(B) || B.equals(C) || A.equals(C))
// not unique
и, как уже предлагали другие, вы можете поместить его в метод для повторного использования. Или общий метод, если вам нужно больше повторного использования; -)
Обратите внимание, что в Java функция равно
состоит в том, что если его аргумент равен null
, он не должен бросать, а возвращать ложь.
Так как я никогда не запускаю Java-проект без использования Apache commons-lang , попробуйте ObjectUtils.equals
(это нулевое значение):
if (ObjectUtils.equals(a, b) || ObjectUtils.equals(b, c) || ObjectUtils.equals(a, c)) {
// error condition
}
Положите эта логика в универсальном методе, и вы добьетесь еще большего.
Хотя бизнес-логика позволяет C иметь значение NULL, в сценариях, подобных этому, часто лучше использовать защитный код и предполагать, что A или B могут иметь значение NULL, поскольку хорошо.
Этот метод можно абстрагировать в утилитах. метод вроде:
public boolean allUnique(Object... objs) {
Set<Object> set = new HashSet<Object>();
for (Object o : objs)
set.add(o);
return set.size() == objs.length
}
Метод может не работать для небольших чисел (из-за накладных расходов на создание Set
и массива varargs). Однако он растет линейно O (n)
, и для больших значений лучше, чем квадратичный рост вложенных операторов if
.
boolean areDistinct(Object a, Object b, Object c) {
return (!a.equals(b) &&
(c == null || (!c.equals(a) && !c.equals(b))));
}