Быстро освоить использование инструментов java.util.Arrays

Массивы Введение

Массивы массив класса А, существует много методов работы массива, включая сортировку и поиск. В то время как класс, который имеет статический завод, который позволяет использовать массив в виде списка.

Массивы специальные пункты

  1. MIN_ARRAY_SORT_GRAN = 1 << 13 ,
    который представляет собой массив индикатора длины, значение 8192, если значение меньше , чем длина массива, алгоритм параллельной сортировки не будет дополнительно разделен сортировкой задачи, потому что это легко вызвать конкуренцию памяти, что приводит к замедлению сортировки.
  2. частные Массивы () {}
    частный конструктор
  3. NaturalOrder
    Это естественный сорт компаратор, если вы не предоставите пользовательский компаратор, использовать по умолчанию
  4. LegacyMergeSort
    Это логическое значение, истинные представители используют старую версию сортировки слияния
  5. INSERTIONSORT_THRESHOLD
    Это мера длины массива составляет менее 7 при сортировки вставками, сортировка слиянием вместо
  6. ArrayList <E> Это частный внутренний класс, который реализует произвольный доступ и последовательные интерфейсы, Arrays.asList (T ... а) способ, чтобы преобразовать массив списка

Массивы Быстрый

сортировать сортировать

Метод сортировки поддерживает ИНТ [] короткий [] длинный [ ] обугливается [] байт [] всплывают [] двойной [] в порядке возрастания основного типа, внутренней реализации , используя быстрый вид после улучшения, называемые DualPivotQuicksort
несколько общего пользования следующее

int[] a = new int[]{10000,565,234,654,8};
Arrays.sort(a);
log.info(Arrays.toString(a));

int[] b = new int[]{10000,565,234,654,8};
Arrays.sort(b,1,5);
log.info(Arrays.toString(b));

initStudents(students);
Arrays.sort(students);//Student类实现了Comparable接口

initTeachers(teachers);
Arrays.sort(teachers,Comparator.comparingInt(Teacher::getNo));//Teacher类没有实现Comparable接口,所以需要传入一个比较器,这里用了java8的特性
//对象的排序同样支持部分排序
复制代码
parallelSort параллельно сортировка

Массив 8192 больше , чем рекомендуемый метод использования такого рода, это будет массив на более мелкие массивы для сортировки, а затем объединить результаты ,
используя этот метод, есть внутреннее суждение записки if (n <= MIN_ARRAY_SORT_GRAN ||(p = ForkJoinPool.getCommonPoolParallelism()) == 1), решение подобных к истине, в противном случае, перед входом в параллельный алгоритм сортировки
методы используют один и тот же вид (), например , с

Random random = new Random(System.currentTimeMillis());
Student[] students = new Student[9000];
Teacher[] teachers = new Teacher[9000];
for (int i = 0; i < 9000; i++) {
    students[i] = new Student();
    students[i].setNo(random.nextInt()%90000);
    teachers[i] = new Teacher();
    teachers[i].setNo(random.nextInt()%90000);
}
Arrays.parallelSort(students);//超过8192后有时候行,有时候不行?如果加上%90000,就没问题,但%2100000000也会有问题
Arrays.parallelSort(teachers, Comparator.comparingInt(Teacher::getNo));
复制代码

parallelSort не в основных типах параллельной задачи сортировки, но работает на объекте, и когда большая случайная величина, легко бросить java.lang.IllegalArgumentException: Метод сравнения нарушает его генподряд этого исключения, проверьте информацию, или! Я не нашел первопричину сомнения в пункте
1. Если меньше считаются равными,% 9000 Почему может?
2. Почему% 9000,%, не 2,1 млрд
3. Удалить операцию по модулю, иногда бросает исключение, иногда не сгенерирует исключение
4. Если слова друзья получают совет, пожалуйста , просветите меня!

статистика parallelPrefix

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

int[] a = new int[]{10000,565,234,654,8};
Arrays.parallelPrefix(a, Integer::sum);
log.info(Arrays.toString(a));

//非基本类型使用该方法时,需要返回一个新的对象,因为本质是赋值一个新的对象地址,lambda表达式中的teacher是上一轮的计算结果,可打印出来验证
Arrays.parallelPrefix(teachers, (teacher, teacher2) -> {
    Teacher temp = new Teacher();
    temp.setNo(teacher.getNo() + teacher2.getNo());
    return temp;
});
log.info(Arrays.toString(teachers));
复制代码
поиск Найти

Внутреннее применение бинарного поиска требуется , чтобы быть упорядоченный массив, возвращает индекс целевого элемента, значение индекса меньше нуля указывает на то, что элемент не может найти
бинарный поиск и региональной поддержки примитивные массивы и массивы объектов двоичного поиска

int[] a = new int[]{1,2,3,4,8};
int index = Arrays.binarySearch(a,3);
log.info(String.valueOf(index));

index = Arrays.binarySearch(a,1,a.length-1,8);
log.info(String.valueOf(index));
// 没有实现Comparable接口的对象
initTeacher(teachers);
Teacher key = new Teacher();
key.setNo(3);
index = Arrays.binarySearch(teachers, key, Comparator.comparingInt(Teacher::getNo));
if(index > 0){
    log.info(String.valueOf(teachers[index]));
}
// 实现了Comparable接口的对象
initStudent(students);
Student student = new Student();
student.setNo(2);
index = Arrays.binarySearch(students,student);
if(index > 0){
    log.info(students[index].toString());
}
复制代码
начинка

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

int[] a = new int[5];
Arrays.fill(a,8);
log.info(Arrays.toString(a));
int[] b = new int[5];
Arrays.fill(b,2,4,8);
log.info(Arrays.toString(b));
//支持long[],int[],short[],char[],byte[],boolean[],double[],float[],Object[]类型的填充
Student[] students = new Student[3];
Student student = new Student();
student.setNo(6);
Arrays.fill(students,student);
student.setNo(1);
log.info(Arrays.toString(students));//为什么是1而不是6?
复制代码
копия

Функция копирования также неполная копия

Teacher[] teachers = new Teacher[5];
for (int i = 0; i < 5; i++) {
    teachers[i] = new Teacher();
    teachers[i].setNo(i);
}
Teacher[] copy = Arrays.copyOf(teachers, 3);
Teacher[] range = Arrays.copyOfRange(teachers, 2, 4);
teachers[2].setNo(8888);
log.info(Arrays.toString(copy));
log.info(Arrays.toString(range));
//支持byte[],short[],int[],long[],char[],float[],double[],boolean[]等类型数组的复制
复制代码
Разделитель (итераторы)

tryAdvance способ представления каждого элемента forEachRemaining метода потребления является сегментированным представлением остальной части раскола из всех элементов с указанным методом потребить

int[] a = new int[]{1,2,3,4,8};
Spliterator.OfInt spliterator = Arrays.spliterator(a);
spliterator.tryAdvance((IntConsumer) value -> System.out.println(value * value));
spliterator.tryAdvance((IntConsumer) value -> System.out.println(value * value));
spliterator.forEachRemaining((IntConsumer) System.out::println);
复制代码
поток поток

Характеристики java8 Добавленные, просто чтобы показать вам простой использовать поток, а затем выделенные статьи разделят эту вещь.

List<Integer> integers = Arrays.asList(1, 2, 3, 4, 8);
List<Integer> collect = integers.stream().map(e -> e * e).collect(Collectors.toList());
log.info(collect.toString());
复制代码

резюме

  1. Сортировка методы сортировки и parallelSort более конкретны, но обратите внимание, что обязательным условием parallelSort
  2. методы поиска также должны знать, как сортировка, неосновные типы объектов должны реализовать интерфейс Сопоставимые или дополнительный проход в компараторе
  3. заполнить и копию неполной копии, не рекомендуются
  4. Этот метод пригоден для регулярного parallelPrefix относительно сильной, и результат вычисления предыдущего шага, используя сцену, и другой такой добавки
  5. Splitter spliterator чувствовать себя довольно интересно, передавая потребление функции потребления делится из элементов
  6. поток поток является главной особенностью java8, так как нет никакого расширения, сохраняется следующая статья
  7. Некоторые ToString, deepToString метод очень прост, который является рекурсивная операция

рекомендация

отjuejin.im/post/5db1c4ad51882564604823c7