迅速なツールの使用を習得java.util.Arrays

配列紹介

アレイ配列がクラスAであり、ソートおよび検索を含むアレイの動作の多くの方法があります。あなたがリストとして配列を使用することができます静的なファクトリを持つクラスながら。

配列の特別なポイント

  1. MIN_ARRAY_SORT_GRAN = 1 << 13
    値は、遅いソートにつながる、メモリ競合が発生することが容易であるため、並列ソートアルゴリズムはさらに、タスクをソート分割されない配列の長さ未満である場合、長さインジケータ値8192のアレイです。
  2. プライベートアレイ(){}
    プライベートコンストラクタ
  3. NaturalOrder
    デフォルトを使用して、カスタムコンパレータを提供しない場合、これは、自然のソートコンパレータです
  4. LegacyMergeSort
    これはブール値であり、真の代表者は、マージソートの古いバージョンを使用します
  5. INSERTIONSORT_THRESHOLD
    この配列の長さの尺度であるが、挿入ソートと、7未満であり、ソートの代わりにマージ
  6. ArrayList <E>これは、Arrays.asList(T ... a)はリスト配列を変換する方法であって、ランダムアクセスとシリアルインターフェイスを実装するプライベート内部クラスであります

クイック配列

ソートソート

sortメソッドは、intは[]短い[]ロング[サポート ] char型[]バイト[]浮く[]ダブル[] 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がスローをするのは簡単:比較方法は、その一般的な契約に違反し、この例外、いくつかの情報を確認し、または!私はポイントとして根本原因の疑いを見つけられませんでした
ほぼ等しいと考えた場合%9000がなぜでき、1?
2.なぜ%9000、%ではなく、21億
3剰余演算、時には例外をスローを外し、時には例外をスローしませ
Wordの友人がアドバイスを取得する場合は、私を啓発してください。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[]等类型数组的复制
复制代码
スプリッタ(イテレータ)

各要素forEachRemaining消費方法を表すtryAdvanceの方法は、消費する指定されたメソッドを持つすべての要素のうち、分割の残りのセグメント化された表現であります

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. 検索方法はまた、ソートのように、オブジェクトの非基本的なタイプはComparableインタフェースまたはコンパレータ内の余分なパスを実装する必要があり、知っておく必要があります
  3. 記入し、コピーは浅いコピー、推奨されません
  4. この方法は、通常、比較的強いparallelPrefix、シーンを使用して前のステップの計算結果、及び他のこのような添加剤に適しています
  5. スプリッタspliterator、非常に興味深い感じ消費関数の消費量を渡すには、要素の外に分割されます
  6. ストリームの流れが大きな特徴のjava8で、何の拡張がされていない、次の記事を保持
  7. 再帰的な操作である、方法をdeepToStringことは非常に簡単ないくつかのtoString、

おすすめ

転載: juejin.im/post/5db1c4ad51882564604823c7