Как найти код элемента java

I am sure that you have found a solution somewhere over the past 2 years but the following is a solution that works for your requested site

package javasandbox;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
*
* @author Ryan.Oglesby
*/
public class JavaSandbox {

private static String sURL;

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws MalformedURLException, IOException {
    sURL = "http://www.cumhuriyet.com.tr/?hn=298710";
    System.out.println(sURL);
    URL url = new URL(sURL);
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
    //set http request headers
            httpCon.addRequestProperty("Host", "www.cumhuriyet.com.tr");
            httpCon.addRequestProperty("Connection", "keep-alive");
            httpCon.addRequestProperty("Cache-Control", "max-age=0");
            httpCon.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            httpCon.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36");
            httpCon.addRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
            httpCon.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
            //httpCon.addRequestProperty("Cookie", "JSESSIONID=EC0F373FCC023CD3B8B9C1E2E2F7606C; lang=tr; __utma=169322547.1217782332.1386173665.1386173665.1386173665.1; __utmb=169322547.1.10.1386173665; __utmc=169322547; __utmz=169322547.1386173665.1.1.utmcsr=stackoverflow.com|utmccn=(referral)|utmcmd=referral|utmcct=/questions/8616781/how-to-get-a-web-pages-source-code-from-java; __gads=ID=3ab4e50d8713e391:T=1386173664:S=ALNI_Mb8N_wW0xS_wRa68vhR0gTRl8MwFA; scrElm=body");
            HttpURLConnection.setFollowRedirects(false);
            httpCon.setInstanceFollowRedirects(false);
            httpCon.setDoOutput(true);
            httpCon.setUseCaches(true);

            httpCon.setRequestMethod("GET");

            BufferedReader in = new BufferedReader(new InputStreamReader(httpCon.getInputStream(), "UTF-8"));
            String inputLine;
            StringBuilder a = new StringBuilder();
            while ((inputLine = in.readLine()) != null)
                a.append(inputLine);
            in.close();

            System.out.println(a.toString());

            httpCon.disconnect();
}
}

To my understanding, the following code should print HashCode of collection, as i am printing its HashCode directly.

However, when I run the following code i am getting Stack overflow error:

    public class Test1  {

    public static void main(final String[] args) {
        m1(new LinkedHashSet<Collection<?>>());
    }

    private static void m1(final Collection<Collection<?>> cl) {
        cl.add(cl);
        try {
            System.out.println(cl.hashCode());
        } catch (Error err) {
            System.out.println(err);
        }
    }

}

Can some one explain this behavior ?

asked Jul 6, 2017 at 5:39

T-Bag's user avatar

You have created a Collection that contains itself as an element.

A LinkedHashSet‘s hashCode() is a function of its elements’ hashCodes (as you can see below), so computing the hashCode() leads to infinite recursion.

public int hashCode() {
    int h = 0;
    Iterator<E> i = iterator();
    while (i.hasNext()) {
        E obj = i.next();
        if (obj != null)
            h += obj.hashCode(); // when obj == this, as in your case, this
                                 // call leads to infinite recursion
    }
    return h;
}

answered Jul 6, 2017 at 5:41

Eran's user avatar

EranEran

386k54 gold badges698 silver badges763 bronze badges

9

It’s caused by this line:

cl.add(cl);

You’re adding the collection to itself. Since the hash code of the set is based on the elements contained in the set, the hashCode() method of cl will be called recursively.

From the AbstractSet.hashCode() javadoc (emphasis mine):

Returns the hash code value for this set. The hash code of a set is
defined to be the sum of the hash codes of the elements in the set
,
where the hash code of a null element is defined to be zero. This
ensures that s1.equals(s2) implies that s1.hashCode()==s2.hashCode()
for any two sets s1 and s2, as required by the general contract of
Object.hashCode().

answered Jul 6, 2017 at 5:42

Robby Cornelissen's user avatar

Robby CornelissenRobby Cornelissen

90.7k22 gold badges132 silver badges156 bronze badges

Задача

Как определить в Java код Юникода символа в строке?

Решение

В этом примере показано, как использовать метод codePointBefore() для возврата символа (кодовой точки Юникода) перед указанным индексом.

public class StringUniCode {
   public static void main(String[] args) {
      String test_string = "Добро пожаловать на ProgLang";
      System.out.println("Тестируемая строка = "+test_string);
      
      System.out.println("Кодовая точка Юникода" 
         +" в строке в позиции 5 = "
         +  test_string.codePointBefore(5));
   }
}

Результат

Вышеприведенный пример кода даст следующий результат:

Тестируемая строка = Добро пожаловать на ProgLang
Кодовая точка Юникода в строке в позиции 5 = 111

Последнее обновление 11 марта 2019 11:26:22 (UTC / GMT +8 часов)

script1adsense2code

script1adsense3code

public int hashCode ()

Метод hashCode () используется для получения хеш-кода из заданной строки. Хеш-код для объекта String вычисляется как:

 s [0] * 31 ^ (n-1) + s [1] * 31 ^ (n-2) + ... + s [n-1] 

где s [i] — i-й символ строки, n — длина строки, а ^ обозначает возведение в степень.

Примечание: значение хеша пустой строки равно нулю.

Платформа Java: Java SE 8

Синтаксис:

 хэш-код() 

Возвращаемое значение: значение хеш-кода для этого объекта.

Тип возвращаемого значения: int

Пример: метод Java String hashCode ()

В следующем примере показано использование метода java String ().

public class Example {
public static void main(String[] args)
    {
        String str ="Java Exercises.";
        // Get the hash code for the above string.
            int hash_code = str.hashCode();
System.out.println();
        // Display the hash code.
System.out.println("The hash for " + str + " is " + hash_code);
System.out.println();
    }
}

Выход:

 Хеш для упражнений Java. это -1762987343

Редактор кода Java:

Предыдущий: метод getChars
Далее: метод indexOf

В предыдущей части, если не читали вот она, мы подробно рассмотрели работу метода equals(), его контракт, ошибки и их исправления. Теперь настала очередь второго попугая-неразлучника – метода hashCode().

При переопределении метода equals() мы всегда должны переопределять метод hashCode(). Метод hashCode() – вычисляет целочисленное значение для конкретного элемента класса, чтобы использовать его для быстрого поиска и доступа к этому элементу в hash-структурах данных, например, HashMap, HashSet и прочих. Почему важно переопределять hashCode() всегда вместе с методом equals()? Развернуто ответим на этот вопрос. Пожалуй, необходимо и достаточно знать два важных аспекта, чтобы понять, почему необходимо делать переопределение методов вместе:

  1. Hash-код объекта используется для быстрой навигации в Hash – таблицах. Поэтому достаточно понять сам процесс поиска/вставки/удаления элемента в этих таблицах
  2. Связь equals() и hashCode(). Если два объекта o1 и o2 являются equals() (o1.equals(o2) = true), то они должны иметь одинаковый hash-код. Обратное – не обязательно.

Что такое хеш-таблицы (Hash Tables)?

пример hash table

Хэш – таблицы – это своего рода ассоциативный массив, хранящий значения в виде “ключ-значение”. Рассмотрим работу вставки элемента в хеш-таблицу:

  1. На входе мы получаем key – некий объект.
  2. Для объекта вызывается метод hashCode(), который вернет hash-код объекта – целое число.
  3. По этому числу мы находим соответствующий ему bucket – определенная структура, хранящая в себе все объекты с одинаковыми hash-кодом. В нашем случае это будет список.
  4. В найденный bucket мы записываем объект key.

На деле все просто, но если еще раз перечитать контракт hashCode() и equals(), то все становиться немного труднее: возможны коллизии – два разных объекта имеют одинаковый hash-код. Что делать? Эта проблема и ее решение отражены на рисунке выше. Два объекта John Smith и Sandra Dee имеют один и тот же hash-код. Для разрешения это коллизии мы просто берем за структуру bucket направленный список. И сохраняем два значения по одному hash-коду.

Как сломать хеш – таблицу?

При неверной реализации метода hashCode() мы можем легко сломать hash-таблицу. Вернее даже сказать не сломать, а сделать ее вырожденной. Например, переопределив метод hashCode() следующим образом

@Override

public int hashCode() {

    return 228;

}

мы выродим таблицу в простой список. Из-за того, что для каждого объекта hashCode() будет вычисляться один и тот же все они попадут в один bucket и все выгоды hash-таблицы будут потеряны для нас.

Так же стоит помнить, что при повторном вызове hashCode() для конкретного объекта всегда должно возвращаться одинаковое значение! Иначе корректная работа таких структур данных как HashMap или HashSet будет нарушена. Продемонстрируем это на примере:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

import java.util.HashMap;

import java.util.Map;

import java.util.Objects;

public class HashCodeBroken {

    static class Person {

        private String name;

        private int phone;

        public Person(String name, int phone) {

            this.name = name;

            this.phone = phone;

        }

        @Override

        public boolean equals(Object o) {

            if (this == o) return true;

            if (o == null || getClass() != o.getClass()) return false;

            Person person = (Person) o;

            return phone == person.phone &&

                    Objects.equals(name, person.name);

        }

        @Override

        public int hashCode() {

            return (int) (this.phone * Math.random());

        }

        @Override

        public String toString() {

            return «Person{« +

                    «name='» + name + »’ +

                    «, phone=» + phone +

                    ‘}’;

        }

    }

    public static void main(String[] args) {

        Person igor = new Person(«Igor», 676568);

        Map<Person, Integer> persons = new HashMap<>();

        persons.put(igor, 1);

        for (int i = 0; i < 10; i++) {

            System.out.println(persons.get(new Person(«Igor», 676568)));

        }

    }

}

Как вы думаете, что выведется? Правильно, null!

//Вывод

null

null

null

null

null

null

null

null

null

null

Почему так произошло? Когда мы вызываем метод get(), то как параметр-ключ передаем новый объект, который равен (если верить методу equals()) тому, который уже лежит в persons. Мы ожидаем получить 1, но имеем null и все потому что нарушен контракт equals() и hashCode(). В нашей реализации hashCode() для каждого нового объекта будет свой уникальный hash-код, и когда будет вызван метод get() класса HashMap, он вызовет метод hashCode(), получит hash-код объекта, попытается найти соответствующий ему bucket и, не найдя его, вернет null.

Правильная реализация hashCode()

Чтобы избежать проблем нам необходимо корректно переопределять hashCode(). Рассмотрим два варианта.

  1. Использовать метод hash класса Objects. Для класса Person это будет выглядеть следующим образом :

@Override

public int hashCode() {

return Objects.hash(name, phone);

}

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

2. Напишите свою реализацию, используя следующий алгоритм:

  1. Создайте переменную result и положите в нее значение hashCode() первого значимого поля класса. Если поле примитив, то используйте вызов Type.hashCode(value), если экземпляр класса, то рекурсивно вычисляйте hashCode() для полей класса, либо используйте уже готовый метод hashCode() этого класса. Если поле массив, то рекурсивно вычисляйте hashCode() каждого элемента.
  2. Вычислите hashCode() каждого значимого поля и скомбинируйте следующим образом : result = 31 * result + Type.hashCode(value)
  3. Верните результат

Для нашего примера реализация следующая:

@Override

public int hashCode() {

    int result = name.hashCode();

    result = 31 * result + Integer.hashCode(phone);

   return result;

}

Вы можете придумать свою собственную реализацию hashCode(), главное, помните о его контракте!

Понравилась статья? Поделить с друзьями:
  • Как найти входящий остаток формула
  • Как на айфоне найти настройки камеры
  • Как найти на компьютере кеш браузера
  • Как найти где находится дело
  • Косит один глаз у ребенка как исправить