Почему класс Java Vector (и Stack) считается устаревшим или устаревшим?

Эта программа работает для любой n * n-матрицы.

public class circ {
    public void get_circ_arr (int n,int [][] a)
    {
        int z=n;
        {
            for (int i=0;i<n;i++)
            {
                for (int l=z-1-i;l>=i;l--)
                {
                    int k=i;
                    System.out.printf("%d",a[k][l]);
                }           

                for (int j=i+1;j<=z-1-i;j++)
                {
                    int k=i;
                    {
                        System.out.printf("%d",a[j][k]);
                    }
                }

                for (int j=i+1;j<=z-i-1;j++)
                {
                    int k=z-1-i;
                    {
                        System.out.printf("%d",a[k][j]);
                    }
                }

                for (int j=z-2-i;j>=i+1;j--)
                {
                    int k=z-i-1;        
                    {
                        System.out.printf("%d",a[j][k]);
                    }
                }
            }
        }
    }
}

Надеюсь, что это поможет

651
задан Patrick Parker 16 May 2018 в 00:28
поделиться

4 ответа

Вектор синхронизируется при каждой отдельной операции. Это почти никогда не то, что вам нужно.

Обычно вы хотите синхронизировать всю последовательность операций. Синхронизация отдельных операций менее безопасна (например, если вы выполняете итерацию по вектору , вам все равно необходимо снять блокировку, чтобы никто другой не изменил коллекцию одновременно, что может вызвать ошибку ] ConcurrentModificationException в повторяющемся потоке), но также медленнее (зачем снимать блокировку многократно, если одного раза будет достаточно)?

Конечно, это также накладывает накладные расходы на блокировку, даже когда вам это не нужно.

По сути, это очень ошибочный подход к синхронизации в большинстве ситуаций. Как отметил Брайан Хенк , вы можете украсить коллекцию, используя такие вызовы, как Collections.synchronizedList - тот факт, что Vector объединяет реализацию коллекции «массив с измененным размером» с битом «синхронизировать каждую операцию», является еще одним примером плохой дизайн; подход декорирования дает более четкое разделение проблем.

Что касается эквивалента Stack - я бы сначала посмотрел на Deque / ArrayDeque .

]
641
ответ дан 22 November 2019 в 21:47
поделиться

Вы можете использовать метод synchronizedCollection / List в java.util.Collection , чтобы получить поточно-безопасную коллекцию из небезопасной для потоков.

14
ответ дан 22 November 2019 в 21:47
поделиться

Вектор был частью 1.0 - исходная реализация имела два недостатка:

1. Именование: векторы на самом деле представляют собой просто списки, к которым можно обращаться как к массивам, поэтому его следовало назвать ArrayList (который является заменой коллекций Java 1.2 для Vector ). ] 2. Параллелизм: Все методы get () , set () синхронизированы , поэтому вы не можете иметь детальный контроль над синхронизацией.

Нет большой разницы между ArrayList и Vector , но вы должны использовать ArrayList .

Из документа API.

Начиная с версии Платформа Java 2 v1.2, это класс был модифицирован для реализации Список интерфейса, что делает его членом каркас коллекций Java. В отличие от новые реализации коллекции, Вектор синхронизирован.

80
ответ дан 22 November 2019 в 21:47
поделиться

Экземпляр перечисления может иметь любое значение, присваиваемое базовому типу (т. е. int.MinValue - int.MaxValue для любого обычного перечисления).Вы можете получить список именованных значений, вызвав Enum.GetNames и Enum.GetValues ​​.

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

41
ответ дан 22 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

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