Заголовок Java getHeaderFields не равен его значению [duplicate]

У меня была аналогичная проблема, и я пришел к этим решениям на C ++ 11:

template <class T> 
struct Is 
{ 
  T d_; 
  bool in(T a) { 
    return a == d_; 
  } 
  template <class Arg, class... Args> 
  bool in(Arg a, Args... args) { 
    return in(a) || in(args...); 
  } 
}; 

template <class T> 
Is<T> is(T d) { 
  return Is<T>{d}; 
}

Или как альтернатива без метода завершения рекурсии. Имейте в виду, что здесь порядок сравнений не определен и что это не заканчивается раньше, если найдено первое совпадение. Но код более компактен.

template <class T>
struct Is {
  const T d_;
  template <class... Args>
  bool in(Args... args) {
    bool r{ false }; 
    [&r](...){}(( (r = r || d_ == args), 1)...);
    return r;
  }
};

template <class T>
Is<T> is(T d) { 
  return Is<T>{d}; 
}

Итак, для обоих решений код будет выглядеть так:

if (is(num).in(1,2,3)) {
  // do whatever needs to be done
}
504
задан Ciro Santilli 新疆改造中心 六四事件 法轮功 15 February 2016 в 00:36
поделиться

24 ответа

В общем, ответ на ваш вопрос «да», но ...

  • .equals(...) будет сравнивать только то, что написано для сравнения, не более, не менее.
  • Если класс не переопределяет метод equals, то по умолчанию используется метод equals(Object o) ближайшего родительского класса, который переопределил этот метод.
  • Если родительские классы не предоставили переопределение, то по умолчанию используется метод из конечного родительского класса Object и поэтому вы остаетесь с методом Object#equals(Object o). В API-интерфейсе объекта это то же самое, что и ==; то есть он возвращает true тогда и только тогда, когда обе переменные относятся к одному и тому же объекту, если их ссылки одно и то же. Таким образом, вы будете тестировать на равенство объектов, а не на функциональное равенство.
  • Всегда помните, чтобы переопределить hashCode, если вы переопределите equals, чтобы не «разорвать контракт». Согласно API, результат, возвращаемый методом hashCode() для двух объектов, должен быть таким же, если их методы equals показывают, что они эквивалентны. Обратное не обязательно верно.
491
ответ дан Hovercraft Full Of Eels 19 August 2018 в 08:01
поделиться
  • 1
    если == проверяет ссылку на память, то почему я получаю это странное поведение в [this] [1] [1]: docs.google.com/document/d/… Я ожидал, что вывод будет будь настоящим. может очистить мои недоумения – JPG 14 June 2015 в 08:19
  • 2
    @JSK печатает значения d1 и d2, и я думаю, вы поймете, почему вы возвращаете false. – BoDidely 29 July 2015 в 20:01
  • 3
    @BoDidely Я понял это. Это было потому, что все классы-оболочки являются неизменными. – JPG 31 July 2015 в 20:41
  • 4
    The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true). & lt; br / & gt; Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes. ( docs.oracle.com/javase/7/docs/api/java/lang/… ) – Abhijeet 6 July 2016 в 13:20
  • 5
    Как получить ссылку на память переменной String? – MAX 26 February 2017 в 10:02

Вам придется переопределить функцию equals (вместе с другими), чтобы использовать ее с пользовательскими классами.

Метод equals сравнивает объекты.

Двоичный оператор == сравнивает адреса памяти.

11
ответ дан AADProgramming 19 August 2018 в 08:01
поделиться
public class StringPool {

public static void main(String[] args) {

    String s1 = "Cat";// will create reference in string pool of heap memory
    String s2 = "Cat";
    String s3 = new String("Cat");//will create a object in heap memory

    // Using == will give us true because same reference in string pool

    if (s1 == s2) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

    // Using == with reference and Object will give us False

    if (s1 == s3) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

    // Using .equals method which refers to value

    if (s1.equals(s3)) {
        System.out.println("true");
    } else {
        System.out.println("False");
    }

    }
  }

---- Выход ----- true false true

2
ответ дан Aamir Meman 19 August 2018 в 08:01
поделиться

Существуют небольшие различия в зависимости от того, говорите ли вы о «примитивах» или «типах объектов»; то же самое можно сказать, если вы говорите о «статических» или «нестатических» членах; вы можете также смешать все вышеперечисленное ...

Вот пример (вы можете запустить его):

public final class MyEqualityTest
{
    public static void main( String args[] )
    {
        String s1 = new String( "Test" );
        String s2 = new String( "Test" );

        System.out.println( "\n1 - PRIMITIVES ");
        System.out.println( s1 == s2 ); // false
        System.out.println( s1.equals( s2 )); // true

        A a1 = new A();
        A a2 = new A();

        System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
        System.out.println( a1 == a2 ); // false
        System.out.println( a1.s == a2.s ); // true
        System.out.println( a1.s.equals( a2.s ) ); // true

        B b1 = new B();
        B b2 = new B();

        System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
        System.out.println( b1 == b2 ); // false
        System.out.println( b1.getS() == b2.getS() ); // false
        System.out.println( b1.getS().equals( b2.getS() ) ); // true
    }
}

final class A
{
    // static
    public static String s;
    A()
    {
        this.s = new String( "aTest" );
    }
}

final class B
{
    private String s;
    B()
    {
        this.s = new String( "aTest" );
    }

    public String getS()
    {
        return s;
    }

}

Вы можете сравнить объяснения для «==» (Equality Оператор) и ".equals (...)" (метод в классе java.lang.Object) через эти ссылки:

48
ответ дан Almir Campos 19 August 2018 в 08:01
поделиться
  • 1
    Интересный пример. Различная перспектива из приведенных выше ответов. Благодаря! – Andrew 11 March 2015 в 16:30
  • 2
    Лучший ответ на мой взгляд, поскольку он более ясен, чем другие полнотекстовые ответы, не теряя объяснения (если, конечно, вы возьмете классные и статические концепции) – Carrm 30 August 2017 в 09:31

Оператор ==:

== - это реляционный оператор в Java, который используется для сравнения двух операндов. Он используется для определения того, являются ли оба операнда равными или нет. Используя оператор ==, вы можете сравнить любой примитивный тип, такой как int, char, float и Booleans. После сравнения оператор == возвращает логическое значение. Если оба операнда равны, оператор == возвращает истинное значение. Однако, если оба операнда не равны, он возвращает ложное значение. При использовании с объектами оператор == сравнивает две ссылки на объекты и определяет, ссылаются ли они на один и тот же экземпляр.

Метод .equals ()

equals () - это метод доступный в классе String, который используется для сравнения двух строк и определения того, являются ли они равными. Этот метод возвращает логическое значение в результате сравнения. Если две строки содержат одни и те же символы в одном порядке, метод equals () возвращает true. В противном случае возвращается ложное значение.

Для примеров:

http://goo.gl/Sa3q5Y

4
ответ дан Chandrashekhar Goka 19 August 2018 в 08:01
поделиться

Пул String (ака interning ) и Целочисленный пул размывает разницу и может позволить вам использовать == для объектов в некоторых случаях вместо .equals

Это может дать вам большую производительность (?) за счет большей сложности.

Например:

assert "ab" == "a" + "b";

Integer i = 1;
Integer j = i;
assert i == j;

Компромисс сложности: вас может удивить следующее:

assert new String("a") != new String("a");

Integer i = 128;
Integer j = 128;
assert i != j;

Я советую вам держаться подальше от такой микро-оптимизации, а всегда использовать .equals для объектов, а == для примитивов:

assert (new String("a")).equals(new String("a"));

Integer i = 128;
Integer j = 128;
assert i.equals(j);
89
ответ дан Community 19 August 2018 в 08:01
поделиться
  • 1
    поэтому для строк == эта ссылка также равна? т.е. работает так же, как и для других объектов? – Jonny Leeds 20 February 2014 в 16:12
  • 2
    (Thread necromancy, я знаю ...) Для String s, == также равно ссылочным, да, но он обычно работает (как в двух String с одним и тем же содержимым будет обычно быть == друг с другом), из-за того, как Java обрабатывает String s. Это не всегда, и это, конечно, плохая практика, но это распространенная ошибка, особенно от людей, приезжающих с других языков. – Tonio 3 October 2014 в 23:33
  • 3
    Чтобы добавить комментарий к Tonio. String сборка из строкового литерала будет добавлена ​​к тому, что называется String constant pool, например. String s1 = "someString"; String s2 = "someString;" оба s1 & amp; s2 будет использовать одну и ту же ссылку. s1 == s2 вернет true. Но если они были построены через String constructor, например, String s1 = new String("someString"); String s2 = new String("someString");, то они не будут использовать одну и ту же ссылку. s1 == s2 вернет false. – Ng Hui Xiong 15 November 2017 в 15:25

Оператор == проверяет, имеют ли две переменные одинаковые ссылки (aka указатель на адрес памяти).

String foo = new String("abc");
String bar = new String("abc");

if(foo==bar)
// False (The objects are not the same)

bar = foo;

if(foo==bar)
// True (Now the objects are the same)

В то время как метод equals () проверяет, ссылаются ли две переменные на объекты, имеющие одно и то же состояние (значения).

String foo = new String("abc");
String bar = new String("abc");

if(foo.equals(bar))
// True (The objects are identical but not same)

Приветствия: -)

25
ответ дан dheeran 19 August 2018 в 08:01
поделиться
  • 1
    Неправильно. if (foo == bar) это должно быть true, а не false. Он будет повторно использовать ту же строку "adc". Проверьте его в песочнице, он вернется для обоих. – Johnathan Logan 12 April 2017 в 04:39
  • 2
    @JohnathanLogan Я предполагаю, что это связано с интернетом. Теперь я изменил на «новую строку» («abc») ». Надежда теперь не будет никаких проблем. Спасибо, что сообщили. – dheeran 13 April 2017 в 18:28

Возможно, стоит добавить, что для объектов-оболочек для примитивных типов - то есть Int, Long, Double - == вернет true, если два значения равны.

Long a = 10L;
Long b = 10L;

if (a == b) {
    System.out.println("Wrapped primitives behave like values");
}

Чтобы контрастировать, выше двух Longs на два отдельных ArrayLists, equals считает их одинаковыми, но == не делает.

ArrayList<Long> c = new ArrayList<>();
ArrayList<Long> d = new ArrayList<>();

c.add(a);
d.add(b);
if (c == d) System.out.println("No way!");
if (c.equals(d)) System.out.println("Yes, this is true.");
2
ответ дан Elroch 19 August 2018 в 08:01
поделиться

Просто помните, что .equals(...) должен быть реализован классом, который вы пытаетесь сравнить. В противном случае, не так много смысла; версия метода для класса Object выполняет то же самое, что и операция сравнения: Объект # равно .

Единственный раз, когда вы действительно хотите использовать оператор сравнения для объектов, является Вы сравниваете Enums. Это происходит потому, что за один раз имеется только один экземпляр значения Enum. Например, с учетом перечисления

enum FooEnum {A, B, C}

У вас никогда не будет более одного экземпляра A за один раз, и то же самое для B и C. Это означает, что вы можете написать такой метод:

public boolean compareFoos(FooEnum x, FooEnum y)
{
    return (x == y);
}

И у вас не будет никаких проблем.

5
ответ дан fruchtose 19 August 2018 в 08:01
поделиться

Когда вы оцениваете код, очень ясно, что (==) сравнивается в соответствии с адресом памяти, а equals (Object o) сравнивает hashCode () экземпляров. Вот почему сказано, что не разорвать контракт между equals () и hashCode (), если вы не столкнетесь с неожиданностями позже.

    String s1 = new String("Ali");
    String s2 = new String("Veli");
    String s3 = new String("Ali");

    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    System.out.println(s3.hashCode());


    System.out.println("(s1==s2):" + (s1 == s2));
    System.out.println("(s1==s3):" + (s1 == s3));


    System.out.println("s1.equals(s2):" + (s1.equals(s2)));
    System.out.println("s1.equal(s3):" + (s1.equals(s3)));


    /*Output 
    96670     
    3615852
    96670
    (s1==s2):false
    (s1==s3):false
    s1.equals(s2):false
    s1.equal(s3):true
    */
3
ответ дан huseyin 19 August 2018 в 08:01
поделиться

«==» на самом деле сравнивают две ссылки на объекты, чтобы увидеть, указывают ли они на один и тот же объект.

«равно», что является «глубоким сравнением», которое сравнивает фактические значения строк.

4
ответ дан Kamran 19 August 2018 в 08:01
поделиться

Разница между == и equа меня немного смутила, пока я не решил поближе рассмотреть ее. Многие из них говорят, что для сравнения строки вы должны использовать equals, а не ==. Надеюсь, что в этом ответе я смогу сказать разницу.

Лучший способ ответить на этот вопрос будет, задав несколько вопросов самому себе. так что давайте начнем:

. Каков результат для следующей программы:

String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);

, если вы говорите,

false
true

Я скажу, что вы right , но почему вы так сказали? и если вы говорите, что выходной сигнал,

true
false

Я скажу, что вы ошибочны , но я все равно спрошу вас, почему вы думаете, что это правильно?

Хорошо, попробуем ответить на этот вопрос:

Каков выход для следующей программы:

String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);

Now Если вы говорите,

false
true

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

true
false

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

Хорошо. Теперь это может помочь (пожалуйста, прочтите следующее: напечатать адрес объекта - невозможно, но мы все же можем его использовать.)

String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);

System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));

можете ли вы просто попытаться подумать о вывод последних трех строк в приведенном выше коде: для меня ideone напечатал это ( вы можете проверить здесь код ):

false
true
true
false
mango mango
false
true
17225372
17225372
5433634

О! Теперь вы видите, что идентификаторHashCode (манго) равен идентификаторуHashCode (mango2). Но он не равен identityHashCode (mango3)

. Хотя все строковые переменные - mango, mango2 и mango3 - имеют одинаковое значение, который является «манго», identityHashCode() все еще не является одинаковым для всех.

Теперь попробуйте раскомментировать эту строку // mango2 = "mang"; и запустите его снова, на этот раз вы увидите, что все три identityHashCode() отличаются друг от друга. Хм, это полезный намек

, мы знаем, что если hashcode(x)=N и hashcode(y)=N => x is equal to y

, я не уверен, как java работает внутри, но я предполагаю, что это то, что произошло, когда я сказал:

mango = "mango";

java создал строку "mango", которая была указана (указана) переменной mango примерно так

mango ----> "mango"

Теперь в следующая строка, когда я сказал:

mango2 = "mango";

На самом деле она повторно использовала ту же строку "mango", которая выглядит примерно так

mango ----> "mango" <---- mango2

И манго, и манго2, указывающие на ту же ссылку Теперь когда я сказал

mango3 = new String("mango")

Фактически он создал совершенно новую ссылку (строку) для «манго». который выглядит примерно так:

mango -----> "mango" <------ mango2

mango3 ------> "mango"

, и поэтому, когда я выставляю значения для mango == mango2, он выдает true. и когда я вытащил значение для mango3 == mango2, он выпустил false (даже если значения были одинаковыми).

и когда вы раскоментировали строку // mango2 = "mang";, она фактически создала строку " mang ", который повернул наш график следующим образом:

mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"

Вот почему идентификаторHashCode для всех не одинок.

Надеюсь, это поможет вам, ребята. На самом деле, я хотел создать тестовый пример, где == fail и equals (). Пожалуйста, не стесняйтесь комментировать и дайте мне знать. Если я ошибаюсь.

32
ответ дан KIN 19 August 2018 в 08:01
поделиться
  • 1
    Происходит ли mango == mango2, потому что вы не создали mango2 в качестве нового объекта String, а вместо этого просто ссылались на "mango"? – brt 23 July 2017 в 16:49
  • 2
    неправильный пример использования String для устранения сомнений в == и equals, String, когда он не используется с новым, помещается в String Pool и всякий раз, когда одна и та же строка назначается новой ссылке, она указывает на ту же строку в пуле. Поэтому, вероятно, используйте пример пользовательского объекта для сравнения == и .equals (). – om252345 15 June 2018 в 01:35

В принципе, == сравнивает, если два объекта имеют одну и ту же ссылку в куче, поэтому, если две ссылки не связаны с одним и тем же объектом, это сравнение будет ложным.

equals() - метод унаследованный от класса Object. Этот метод по умолчанию сравнивает, если два объекта имеют одинаковое рефери. Это означает:

object1.equals(object2) & lt; => object1 == object2

Однако, если вы хотите установить равенство между двумя объектами того же класса, вы должны переопределить этот метод. Также очень важно переопределить метод hashCode(), если вы переопределили equals().

Реализация hashCode() при установлении равенства является частью Контракта объектов Java. Если вы работаете с коллекциями, а вы не реализовали hashCode(), могут возникнуть Strange Bad Things:

HashMap<Cat, String> cats = new HashMap<>();
Cat cat = new Cat("molly");
cats.put(cat, "This is a cool cat");
System.out.println(cats.get(new Cat("molly"));

null будет напечатано после выполнения предыдущего кода, если вы еще не реализовали hashCode().

0
ответ дан lmiguelvargasf 19 August 2018 в 08:01
поделиться

Основное отличие между == и equals () -

1) == используется для сравнения примитивов.

Например:

        String string1 = "Ravi";
        String string2 = "Ravi";
        String string3 = new String("Ravi");
        String string4 = new String("Prakash");

        System.out.println(string1 == string2); // true because same reference in string pool
        System.out.println(string1 == string3); // false

2) equals () используется для сравнения объектов. Например:

        System.out.println(string1.equals(string2)); // true equals() comparison of values in the objects
        System.out.println(string1.equals(string3)); // true
        System.out.println(string1.equals(string4)); // false
3
ответ дан Miriam Farber 19 August 2018 в 08:01
поделиться

Также обратите внимание, что .equals() обычно содержит == для тестирования, поскольку это первое, что вы хотели бы проверить, если вы хотите проверить, совпадают ли два объекта.

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

3
ответ дан poke 19 August 2018 в 08:01
поделиться

Поскольку Java не поддерживает перегрузку оператора, == ведет себя одинаково для каждого объекта, но equals () - это метод, который может быть переопределен в Java, а логика для сравнения объектов может быть изменена на основе бизнес-правил.

Основное различие между == и equals в Java заключается в том, что «==» используется для сравнения примитивов, тогда как метод equals () рекомендуется проверять равенство объектов.

Сравнение строк является распространенным сценарием использования оба метода == и equals. Поскольку класс java.lang.String переопределяет метод equals, он возвращает true, если два объекта String содержат одинаковое содержимое, но == будет возвращать true, только если две ссылки указывают на один и тот же объект.

Ниже приведен пример сравнения две строки в Java для равенства с использованием метода == и equals (), которые устранят некоторые сомнения:

public class TEstT{

    public static void main(String[] args) {

String text1 = new String("apple");
String text2 = new String("apple");

//since two strings are different object result should be false
boolean result = text1 == text2;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = text1.equals(text2);
System.out.println("Comparing two Strings with same content using equals method: " + result);

text2 = text1;
//since both text2 and text1d reference variable are pointing to same object
//"==" should return true
result = (text1 == text2);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

}
}
0
ответ дан Radiodef 19 August 2018 в 08:01
поделиться

== может использоваться во многих типах объектов, но вы можете использовать Object.equals для любого типа, особенно для строк и маркеров карты Google.

2
ответ дан Rj Cristy 19 August 2018 в 08:01
поделиться

== оператор всегда ссылается на ссылку. Но в случае

метод equals ()

это зависит от реализации, если мы переопределены равным методу, чем сравниваем объект с базой реализации, указанной в переопределенном метод.

 class A
 {
   int id;
   String str;

     public A(int id,String str)
     {
       this.id=id;
       this.str=str;
     }

    public static void main(String arg[])
    {
      A obj=new A(101,"sam");
      A obj1=new A(101,"sam");

      obj.equals(obj1)//fasle
      obj==obj1 // fasle
    }
 }

в приведенном выше коде оба объекта obj и obj1 содержат одни и те же данные, но ссылка не такая же, как и return false и ==. но если мы переопределили метод equals, чем

 class A
 {
   int id;
   String str;

     public A(int id,String str)
     {
       this.id=id;
       this.str=str;
     }
    public boolean equals(Object obj)
    {
       A a1=(A)obj;
      return this.id==a1.id;
    }

    public static void main(String arg[])
    {
      A obj=new A(101,"sam");
      A obj1=new A(101,"sam");

      obj.equals(obj1)//true
      obj==obj1 // fasle
    }
 }

, узнайте, что он вернет true и false для одного и того же случая, только мы переопределили

equals method.

< / blockquote>

сравнивает объект с базой содержимого (id) объекта

, но ==

все еще сравнивает ссылки объекта.

2
ответ дан Sachin Jadhav 19 August 2018 в 08:01
поделиться

Как правило, оба оператора equals () и «==» в Java используются для сравнения объектов для проверки равенства, но вот некоторые из различий между ними:

Основное различие между .equals ( ) method и == является тем, что один является методом, а другой - оператором.

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

0
ответ дан Sandeep Singh 19 August 2018 в 08:01
поделиться
 String w1 ="Sarat";
 String w2 ="Sarat";
 String w3 = new String("Sarat");

 System.out.println(w1.hashCode());   //3254818
 System.out.println(w2.hashCode());   //3254818
 System.out.println(w3.hashCode());   //3254818

 System.out.println(System.identityHashCode(w1)); //prints 705927765
 System.out.println(System.identityHashCode(w2)); //prints 705927765
 System.out.println(System.identityHashCode(w3)); //prints 366712642


 if(w1==w2)   //  (705927765==705927765)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints true

 if(w2==w3)   //  (705927765==366712642)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints false


 if(w2.equals(w3))   //  (Content of 705927765== Content of 366712642)
 {
   System.out.println("true");
 }
 else
 {
   System.out.println("false");
 }
 //prints true
5
ответ дан Sarat Chandra 19 August 2018 в 08:01
поделиться

== является -оператором , а equals() является методом .

Операторы обычно используются для примитива и, следовательно, == используется для сравнения адресов памяти, а метод equals() используется для сравнения объектов .

5
ответ дан Shanu Gupta 19 August 2018 в 08:01
поделиться

Оба == и .equals () относятся к одному и тому же объекту, если вы не переопределяете .equals ().

Ваше желание, что вы хотите сделать, когда вы переопределите .equals (). Вы можете сравнить состояние вызывающего объекта с переданным в состоянии объекта или просто вызвать super.equals ()

5
ответ дан tintin 19 August 2018 в 08:01
поделиться
93
ответ дан Community 30 October 2018 в 20:12
поделиться
0
ответ дан JamesOstmann 30 October 2018 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: