instanceof Vs getClass ()
Я вижу выигрыш в производительности при использовании операторов getClass() и == над оператором instanceOf .
Есть ли какая-либо директива, для которой использовать getClass() или instanceOf ?
Учитывая сценарий: я знаю точные классы, которые нужно сопоставить, то есть String , Integer (это конечные классы) и т.д.
Использует неправильную практику оператора instanceOf ?
4 ответа
Причина, по которой производительность instanceof и getClass() == . различна, заключается в том, что они выполняют разные вещи.
instanceof проверяет, является ли ссылка объекта в левой части (LHS) экземпляром типа в правой части (RHS) или некоторым подтипом.
getClass() == . проверяет, идентичны ли типы.
Поэтому рекомендуется игнорировать проблему производительности и использовать альтернативу, которая дает вам ответ, который вам нужен.
И да, чрезмерное использование любого из них — «дизайнерский запах». Если вы не будете осторожны, вы получите проект, в котором добавление новых подклассов приведет к значительному переделке кода. В большинстве случаев предпочтительным подходом является использование полиморфизма.
(Есть исключения. Классический в реализации equals(Object) , в котором вам нужно проверить тип аргумента и вернуть false , если он не соответствует. case, вам обычно нужно использовать getClass() для правильного выполнения контракта equals перед лицом подклассов.)
Вы хотите точно соответствовать классу, например. только соответствие FileInputStream вместо любого подкласса FileInputStream ? Если это так, используйте getClass() и == . Обычно я делаю это в equals , так что экземпляр X не считается равным экземпляру подкласса X, иначе вы можете столкнуться с трудными проблемами с симметрией. С другой стороны, это более полезно для сравнения двух объектов одного класса, чем одного конкретного класса.
В противном случае используйте instanceof . Обратите внимание, что с getClass() вам нужно будет убедиться, что у вас есть ненулевая ссылка для начала, или вы получите NullPointerException , тогда как instanceof просто вернет false , если первый операнд имеет значение null.
Лично я бы сказал, что instanceof более идиоматично, но в большинстве случаев использование любого из них в целом является запахом дизайна.
Я знаю, что прошло некоторое время с тех пор, как это было задано, но вчера я узнал альтернативный вариант
Мы все знаем, что вы можете сделать:
но что, если вы точно не знаете, какой тип класса он должен быть? вы не можете делать в общем:
поскольку он дает ошибку компиляции.
Вместо этого вот альтернатива — isAssignableFrom()
В чем разница между instanceof и getclass java
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11
97. Выдвигаются ли условия переопределения соглашения при переопределении Equals?
согласованность — для любых значений x и y повторный вызов x.equals(y) будет всегда возвращать значение предыдущего вызова этого метода при условии, что поля, используемые для сравнения этих двух объектов, не были изменены между вызовами.
98. Что будет, если не переопределить Equals и HashCode?
99. Почему симметричность выполняется, только если x.equals (y) возвращает true?
100. Что такое коллизия в HashCode? Как с ней бороться?
101. Что будет, если элемент, участвующий в контракте с HashCode, изменит свое значение?
102. Напишите методы Equals and HashCode для класса Student, который состоит из полей String name и int age
Приведение объекта аргумента к одному типу (вдруг это был объект родительского типа).
Задание начального значения хеш-кода равным примитиву age объекта.
Умножение текущего хеш-кода на 31 (для большего разброса) и добавление к нему хеш-кода непримитивного строкового поля (если оно не null).
В результате такого переопределения хеш-кода объекты с одинаковыми значениями name и int всегда будут возвращать одно и тоже значение.
103. В чем разница применения if (obj instanceof Student) и if (getClass () == obj.getClass ())?
instanceof проверяет, является ли ссылка на объект с левой стороны экземпляром типа с правой стороны или некоторым его подтипом.
То есть, если getClass() проверяет полную идентичность класса, то instanceof вернет true даже если объект будет всего лишь подтипом, что может дать нам большую гибкость при активном использовании полиморфизма. Собственно, оба подхода хороши, если понимать особенности их работы и применять в нужных местах.
104. Дайте краткую характеристику метода clone ().
105. В чем заключается особенность работы метода clone () с полями объекта типа ссылки?
Exceptions
106. В чем разница между error и exception?
107. Какая разница между checked и unchecked, exception, throw, throws.
108. Какова иерархия исключений?
109. Что такое checked и unchecked exception?
Unchecked — исключения, которые обрабатывать не нужно, так как они не проверяются во время компиляции и, как правило, более непредсказуемые. То есть, основная разница с checked в том, что для них эти механизмы try — catch или пробрасывания работают также, но они не являются обязательными.
Instanceof Vs getClass( )
The reason that the performance of instanceof and getClass() == … is different is that they are doing different things.
instanceof tests whether the object reference on the left-hand side (LHS) is an instance of the type on the right-hand side (RHS) or some subtype.
getClass() == … tests whether the types are identical.
So the ation is to the performance issue and use the alternative that gives you the answer that you need.
Not necessarily. Overuse of either instanceOf or getClass() may be «de smell». If you are not careful, you end up with a de where the addition of new subclasses results in a ificant amount of code reworking. In most situations, the preferred approach is to use polymorphism.
However, there are cases where these are NOT «de smell». For example, in equals(Object) you need to test the actual type of the argument, and return false if it doesn’t match. This is best done using getClass().
Terms like «best practice», «bad practice», «de smell», «antipattern» and so on should be used sparingly and treated with suspicion. They encourage black-or-white thinking. It is better to make your judgements in context, rather than based purely on dogma; e.g. something that someone said is «best practice». I that everyone read No Best Practices if they haven’t already done so.
answered Feb 14 ’11 at 7:44
Stephen CStephen C
641k8787 gold badges742742 silver badges11111111 bronze badges
Do you want to match a class exactly, e.g. only matching FileInputStream instead of any subclass of FileInputStream? If so, use getClass() and ==. I would typically do this in an equals, so that an instance of X isn’t deemed equal to an instance of a subclass of X — otherwise you can get into tricky symmetry problems. On the other hand, that’s more usually useful for comparing that two objects are of the same class than of one specific class.
Otherwise, use instanceof. Note that with getClass() you will need to ensure you have a non-null reference to start with, or you’ll get a NullPointerException, whereas instanceof will just return false if the first operand is null.
Personally I’d say instanceof is more idiomatic — but using either of them extensively is a de smell in most cases.
answered Feb 14 ’11 at 7:43
Jon SkeetJon Skeet
1.3m800800 gold badges87698769 silver badges89578957 bronze badges
I know it has been a while since this was asked, but I learned an alternative yesterday
We all know you can do:
if(o instanceof String)
System.out.ln( a instanceof I ); //true
Как упоминалось ранее все классы наследуются от класса Object либо напрямую, либо через родительский класс, поэтому a instanceof Object всегда будет возвращать true за исключение одной ситуации:
class A implements I<>
System.out.ln( a instanceof I ); //true
Так вот, a instanceof Object всегда будет возвращать true, только если a не равна null.
Метод getClass().
Метод getClass() возвращает класс объекта, содержащий сведения об объекте: public final Class getClass(). Как Вы можете заметить метод является конечным и переопределению не подлежит. С методом getClass() все обстоит несколько проще и очевидней нежели с оператором instanceof.
How to Get Type of Object in Java?
This article will help you to learn the method to get the type of an object in Java.
How to Get Type of Object in Java?
For getting the type of predefined or user-defined class object in Java, you can use:
- getClass() method
- instanceof operator
We will now check out each of the mentioned methods one by one!
Method 1: Get Type of Pre-defined Class Object Using getClass() Method
In Java, we have predefined classes like wrapper classes such as String, Double, Integer, and many more. Sometimes we need to verify the object type while using predefined classes. For this purpose, Java offers a “getClass()” method that belongs to the “Object” class.
Syntax
The syntax of the “getClass()” method is given as follows:
Here, the “getClass()” method will return the class of the specified “x” object.
Example
In this example, we will create a String type object named “x” containing the following value:
Next, we will print a statement using the “System.out.println()” method:
Lastly, we will get the type of the object “x” by calling the “getClass()” method:
The output shows that the created variable belongs to the Java String class:
Let’s see another method to get the object type using the “instanceof” operator.

Method 2: Get Type of Pre-defined Class Object Using “instanceof” Operator
You can also utilize the “instanceof” operator to check the object type in a Java program. This operator returns a boolean value which indicates whether the object is an instance of the particular class or not.
Syntax
The syntax of the “instanceof” is as follows:
Here, “x” is an object and “Integer” is the predefined Java wrapper class. The “instanceof” operator checks whether the object belongs to the mentioned class or not and returns a boolean value.
Example
In this example, we have an object “x” of the Integer class having “5” as its value:
Next, we will print a statement using the “System.out.println()” method:
Now, we will check whether the object is an instance of an Integer class or not:

The output displayed “true” as the object “x” is an instance of the Integer class:

At this point, you may be wondering about how to get the type of user-defined class object. The below-given section will assist you in this regard.
Method 3: Get Type of User-defined Class Object Using getClass() Method
You can also get the type of the user-defined class object with the help of the “getClass()” method. In such a scenario, we will compare the object with the class name using the “==” comparison operator.
Syntax
For the specified purpose, the syntax of “getClass()” method is given as:
Here, the “getClass()” method is called by the “myclassObj” object of the “MyClass” and then compared with the name using the comparison operator “==”.
Example
In this example, we have three classes named “MyClass”, “MynewClass”, and “Example”, where MyClass acts as a parent class of MynewClass:
The “MynewClass” is a child class as it is extended from “MyClass”:
In the main() method of the class “Example”, we will declare and instantiate an object of the parent class “MyClass”. Then check whether the created object belongs to which class; parent or child? To do so, we will call the “getClass()” method with the created object and compare the resultant value with parent and child class names using if-else-if conditions:

The output indicates that the object “myclassObj” belongs to the parent class named “MyClass”:

Now, head toward the next section!
Method 4: Get Type of User-defined Class Object Using “instanceof” Operator
Similar to predefined classes, for user-defined classes, you can also get the type of object by using the “instanceof” operator.
Syntax
The syntax is given below:
Here, the “instanceof” operator will check if the “myclassObj” is an instance of “MyClass” or not.
Example
We will now utilize the same classes which we have created in the previously mentioned example. The only difference is that we will use the “instanceof” operator to verify if the created object instance belongs to the parent or child class:
The given output shows that the “instanceof” operator validated the type of the object as “MyClass”:

We have compiled all methods related to getting object type in Java.

Conclusion
To get a type of object in Java, you can use the “getClass()” method or the “instanceof” operator. These methods can be used to check object types for both predefined and user-defined classes. The getClass() method returns the class name while the “instanceof” operator returns a boolean value, where “true” indicates the object belongs to that specified class; otherwise, it returns “false”. This article provided all the methods to get the object type in Java.
About the author

Farah Batool
I completed my master’s degree in computer science. I am an academic researcher and love to learn and write about new technologies. I am passionate about writing and sharing my experience with the world.
instanceof против getClass ()
Я вижу прирост производительности при использовании getClass() и == оператор над instanceOf оператор.
Есть ли какие-либо рекомендации, которые следует использовать? getClass() or instanceOf ?
Учитывая сценарий: я знаю точные классы для сопоставления, то есть String , Integer (это заключительные занятия) и т. д.
Использует instanceOf плохая практика оператора?
задан 14 фев ’11, 04:02

Ваш метод отсчета времени вызывает искусственные задержки и дает неверные результаты отсчета времени. Поменяйте местами порядок, в котором вы выполняете проверки, и вы увидите, что первая проверка, которую вы выполняете (либо ==, либо instanceof), всегда будет дольше. Я предполагаю, что это println () s. Вы никогда не должны включать это в свой временной блок. — kurtzmarc
Всего лишь один комментарий, чтобы сравнить производительность, используйте несколько итераций цикла (например, 10000), чтобы повысить точность. Один единственный вызов — не лучшая мера. — martins.tuga
Насколько велика разница? — BairDev
4 ответы
Причина, по которой производительность instanceof и getClass() == . другое дело в том, что они делают разные вещи.
instanceof проверяет, является ли ссылка на объект слева (LHS) экземпляром типа справа (RHS) или какой-то подтип.
getClass() == . проверяет идентичность типов.
Поэтому рекомендуется игнорировать проблему производительности и использовать альтернативу, которая дает вам ответ, который вам нужен.
Использует instanceOf плохая практика оператора?
Не обязательно. Чрезмерное использование instanceOf or getClass() может быть «дизайнерский запах». Если вы не будете осторожны, вы получите проект, в котором добавление новых подклассов приведет к значительному изменению кода. В большинстве случаев предпочтительным подходом является использование полиморфизма.
Однако бывают случаи, когда это НЕ «дизайнерский запах». Например, в equals(Object) вам нужно проверить фактический тип аргумента и вернуть false если не совпадает. Лучше всего это делать с помощью getClass() .
Такие термины, как «передовой опыт», «плохая практика», «запах дизайна», «антипаттерн» и т. Д. Следует использовать осторожно и относиться к ним с подозрением. Они поощряют черно-белое мышление. Лучше делать свои суждения в контексте, а не основываться исключительно на догмах; например, что-то, что кто-то сказал, является «лучшей практикой». Всем рекомендую прочитать Нет передового опыта если они еще этого не сделали.
Вы хотите соответствовать классу точно,, например, только соответствие FileInputStream вместо любого подкласса FileInputStream ? Если да, используйте getClass() и == . Я обычно делал это в equals , так что экземпляр X не считается равным экземпляру подкласса X — в противном случае вы можете столкнуться с сложными проблемами симметрии. С другой стороны, обычно бывает полезно сравнить, что два объекта имеют то же класс, чем один конкретный класс.
В противном случае используйте instanceof . Обратите внимание, что с getClass() вам нужно будет убедиться, что у вас есть ненулевая ссылка для начала, иначе вы получите NullPointerException , в то время как instanceof просто вернусь false если первый операнд равен нулю.
Лично я бы сказал instanceof более идиоматично — но используя или из них в большинстве случаев — это дизайнерский запах.
Я знаю, что это было давно, но вчера я узнал альтернативу
Мы все знаем, что вы можете:
но что, если вы точно не знаете, какой это должен быть класс? вы не можете делать:
поскольку это дает ошибку компиляции.
Вместо этого есть альтернатива — isAssignableFrom ()
ответ дан 20 окт ’13, 00:10
Не использовать isAssignableFrom . Правильный способ писать o instanceof String использование отражения String.getClass().isInstance(o) . В javadoc даже сказано так: Этот метод является динамическим эквивалентом языка Java. instanceof оператор. — Андреас
getClass () имеет ограничение, заключающееся в том, что объекты равны только другим объектам того же класса, того же типа времени выполнения, как показано в выходных данных приведенного ниже кода:
SubClass расширяет ParentClass. subClassInstance — это instanceof ParentClass.
Различные getClass () возвращают результаты с subClassInstance и parentClassInstance.