Java集合
集合
-
对象的容器,实现对对象常用的操作。可实现数组的功能。
-
和数组的区别:
-
数组长度固定,集合长度不固定。
-
数组可以存储基本类型和引用类型,集合只能存储引用类型。
Collection父接口
代表一组任意类型的对象,无序、无下标、不能重复。
接口的使用
-
创建和添加元素。
创建 Collection collection = new ArrayList();
添加 collection.add();
-
删除元素。
collection.remove();
-
遍历元素。
增强for遍历,迭代器遍历
-
判断。
collection.contains();
1、元素的创建和添加
public static void main(String[] args) {
//1、创建元素
Collection collection = new ArrayList();
collection.add("苹果");
collection.add("西瓜");
collection.add("榴莲");
collection.add("橘子");
System.out.println("元素个数:"+collection.size());
System.out.println(collection);
结果
元素个数:4
[苹果, 西瓜, 榴莲, 橘子]
删除之后:3
2、删除元素
//2、删除元素
collection.remove("榴莲");
System.out.println("删除之后:"+collection.size());
//清空 collection.clear();
结果
-------使用增强for-------
苹果
西瓜
橘子
3、遍历元素
其中迭代器不能用collection.remove的方法
删除元素,只能用迭代器自带的it.remove();
//3、遍历元素
//使用增强for
System.out.println("-------使用增强for-------");
for (Object object:collection){
System.out.println(object);
}
//使用迭代器(迭代器:专门用来遍历集合的一种方式)
//hasNext() 有没有下一个元素
//next() 获取下一个元素
//remove() 移除当前元素
System.out.println("-------使用迭代器------");
Iterator it = collection.iterator();
while (it.hasNext()){
String s = (String) it.next();
System.out.println(s);
//迭代器使用中不能使用remove方法 collection.remove();
// it.remove();//迭代器的删除方法 遍历完也删除完了。
System.out.println("元素个数:"+collection.size());
结果
-------使用增强for-------
苹果
西瓜
橘子
-------使用迭代器------
苹果
西瓜
橘子
元素个数:3
4、判断
//4、判断
System.out.println("---------判断--------");
System.out.println(collection.contains("西瓜"));
System.out.println(collection.isEmpty());//判断是否为空
结果
---------判断--------
true
false
collection的使用:保存学生信息。
student类
{
private String name;
private int sge;
public Student() {
}
public Student(String name, int sge) {
this.name = name;
this.sge = sge;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSge() {
return sge;
}
public void setSge(int sge) {
this.sge = sge;
}
//重写ToString方法
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sge=" + sge +
'}';
}
}
在使用collecting时,先创建collection对象
public static void main(String[] args) {
//新建collection对象
Collection collection = new ArrayList();
Student s1 = new Student("a", 20);
Student s2 = new Student("b", 24);
Student s3 = new Student("c", 13);
//1、添加数据
collection.add(s1);
collection.add(s2);
collection.add(s3);
System.out.println("元素个数:"+collection.size());
System.out.println(collection.toString());
//2、删除元素
//collection.remove(s1);
collection.remove(new Student("c",13));
System.out.println("删除之后:"+collection.size());
//3、遍历
//增强for
System.out.println("----------增强for----------");
for (Object object: collection){
Student s = (Student) object;
System.out.println(s.toString());
}
//迭代器
System.out.println("----------迭代器----------");
Iterator it = collection.iterator();
while (it.hasNext()){
Student s = (Student) it.next();
System.out.println(s.toString());
}
//4、判断
System.out.println(collection.contains(s1));
System.out.println(collection.isEmpty());
}
结果
元素个数:3
[Student{name='a', sge=20}, Student{name='b', sge=24}, Student{name='c', sge=13}]
删除之后:3
----------增强for----------
Student{name='a', sge=20}
Student{name='b', sge=24}
Student{name='c', sge=13}
----------迭代器----------
Student{name='a', sge=20}
Student{name='b', sge=24}
Student{name='c', sge=13}
true
false
Process finished with exit code 0
List子接口
有序,有下表,元素可以重复。
首先创建List
List list = new ArrayList();
1、添加元素
//1、添加元素
list.add("小米");
list.add("苹果");
list.add("联想");
list.add(0,"华为");
list.add(0,"诺基亚");//0代表插入的位置
System.out.println("元素个数:"+list.size());
System.out.println(list.toString());
元素个数:5
[诺基亚, 华为, 小米, 苹果, 联想]
2、删除元素
//2、删除元素
list.remove("联想");
list.remove(0);
System.out.println("删除之后:"+list.size());
System.out.println(list.toString());
删除之后:3
[华为, 小米, 苹果]
3、遍历
for
System.out.println("-----------for----------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
-----------for----------
华为
小米
苹果
增强for
System.out.println("-----------增强for---------");
for (Object object:list){
System.out.println(object);
}
-----------增强for---------
华为
小米
苹果
迭代器
System.out.println("------------迭代器-----------");
for (Object o : list) {
System.out.println(o);
}
------------迭代器-----------
华为
小米
苹果
列表迭代器:从前往后
//列表迭代器 和Iterator的区别:
//listIterator可以向后,向前遍历。可以添加,删除和修改元素。
System.out.println("-----------列表迭代器----------");
System.out.println("---------从前往后-----------");
ListIterator lit = list.listIterator();
while (lit.hasNext()){
System.out.println(lit.nextIndex()+":"+lit.next());
}
-----------列表迭代器----------
---------从前往后-----------
0:华为
1:小米
2:苹果
列表迭代器:从后往前
把从前往后的next关键字换为previous关键字
System.out.println("---------从后往前-----------");
while (lit.hasPrevious()){
System.out.println(lit.previousIndex()+":"+lit.previous());
}
---------从后往前-----------
2:苹果
1:小米
0:华为
4、判断
//4、判断
System.out.println("------------判断----------");
System.out.println(list.contains("苹果"));
System.out.println(list.isEmpty());
------------判断----------
true
false
5、获取位置
//5、获取位置
System.out.println("----------获取位置--------");
System.out.println(list.indexOf("华为"));
----------获取位置--------
0
{ //创建集合
List list = new ArrayList();
//1、添加数字数据
list.add(20);
list.add(30);
list.add(40);
list.add(50);
list.add(60);
list.add(70);
System.out.println("元素个数:"+list.size());
System.out.println(list.toString());
//2、删除操作
//list.remove(0); 加的是下角标
list.remove(new Integer(20));
System.out.println("删除元素:"+list.size());
System.out.println(list.toString());
//3、补充方法sublist,返回子集和,含头含尾
List list1 = list.subList(0, 3);
System.out.println(list1.toString());
}
List实现类
ArrayList
数据结构实现,查询快、增删慢。
JDK1.2,运行速率快,线程不安全。
Vector
数组结构实现,查询快、增删慢。
Jdk1.0版本,运行速率慢、线程安全。
LinkedList
链表结构实现,增删快,查询快。
Arraylist(重点)
相当于一个数组
DEFAULT_CAPACITY=10;默认容量。
如果集合中没添加元素,默认容量是0。
每次扩容到原来的1.5倍。
elementDate存放元素的数组。
size实际的元素个数。
add添加元素。
public static void main(String[] args) {
//创建集合
ArrayList arrayList = new ArrayList<>();
//1、添加元素
Student s1 = new Student("小明",20);
Student s2 = new Student("小白",10);
Student s3 = new Student("小刚",25);
Student s4 = new Student("小黑",34);
arrayList.add(s1);
arrayList.add(s2);
arrayList.add(s3);
System.out.println("元素个数:"+arrayList.size());
System.out.println(arrayList.toString());
//2、删除元素
arrayList.remove(s1);
//arrayList.remove(new Student("小白",10)); 不能用(改Student中的equals方法后才可以用)
System.out.println("删除之后:"+arrayList.size());
//3、遍历元素【重点】
System.out.println("-------遍历元素--------");
//迭代器
System.out.println("--------迭代器--------");
Iterator it = arrayList.iterator();
while (it.hasNext()){
Student s = (Student) it.next();
System.out.println(s.toString());
}
//列表迭代器
System.out.println("----------列表迭代器-------");
ListIterator lit = arrayList.listIterator();
while (lit.hasNext()){
Student s = (Student) lit.next();
System.out.println(s.toString());
}
//逆序遍历
System.out.println("--------逆序遍历-------");
while (lit.hasPrevious()){
Student s = (Student) lit.previous();
System.out.println(s.toString());
}
//4、查找
System.out.println(arrayList.contains(new Student("小白",10)));
System.out.println(arrayList.isEmpty());
//5、判断
System.out.println(arrayList.indexOf(new Student("小白",10)));
}
结构
元素个数:3
[Student{name='小明', sge=20}, Student{name='小白', sge=10}, Student{name='小刚', sge=25}]
删除之后:2
-------遍历元素--------
--------迭代器--------
Student{name='小白', sge=10}
Student{name='小刚', sge=25}
----------列表迭代器-------
Student{name='小白', sge=10}
Student{name='小刚', sge=25}
--------逆序遍历-------
Student{name='小刚', sge=25}
Student{name='小白', sge=10}
true
false
0
vector
public static void main(String[] args) {
//创建集合
Vector vector = new Vector();
//1、添加元素
vector.add("aa");
vector.add("bb");
vector.add("cc");
vector.add("dd");
vector.add("ee");
//2、删除
vector.remove(0);
vector.remove("bb");
System.out.println("个数:"+vector.size());
//3、遍历
//使用枚举器
Enumeration en = vector.elements();
while (en.hasMoreElements()){
String o = (String) en.nextElement();
System.out.println(o);
}
//4、判断
System.out.println(vector.contains("dd"));
System.out.println(vector.isEmpty());
//5、其他方法
System.out.println(vector.firstElement());
System.out.println(vector.lastElement());
}
结果
个数:3
cc
dd
ee
true
false
cc
ee
Process finished with exit code 0
LinkedList
相当于一个双向链表
public static void main(String[] args) {
//创建集合
LinkedList linkedList = new LinkedList();
//1、添加元素
Student s1 = new Student("aaa",10);
Student s2 = new Student("bbb",20);
Student s3 = new Student("ccc",30);
linkedList.add(s1);
linkedList.add(s2);
linkedList.add(s3);
//linkedList.add(s3); 可以重复添加
System.out.println("元素个数:"+linkedList.size());
System.out.println(linkedList.toString());
//2、删除
linkedList.remove(s1);
System.out.println(linkedList.size());
//清空 linkedList.clear();
//3、遍历
//for遍历
System.out.println("--------for--------");
for (int i = 0; i < linkedList.size(); i++) {
System.out.println(linkedList.get(i));
}
//增强for遍历
System.out.println("--------增强for-------");
for (Object object:linkedList){
Student s = (Student)object;
System.out.println(s.toString());
}
//迭代器
System.out.println("----------迭代器---------");
Iterator it = linkedList.iterator();
while (it.hasNext()){
Student s = (Student) it.next();
System.out.println(s.toString());
}
//
ListIterator listIterator = linkedList.listIterator();
while (listIterator.hasNext()){
Student s = (Student) listIterator.next();
System.out.println(s.toString());
}
//4、判断
System.out.println("--------判断------");
System.out.println(linkedList.contains(s1));
System.out.println(linkedList.isEmpty());
//5、获取
System.out.println("--------获取--------");
System.out.println(linkedList.indexOf(s2));
}
结果
元素个数:3
[Student{name='aaa', sge=10}, Student{name='bbb', sge=20}, Student{name='ccc', sge=30}]
2
--------for--------
Student{name='bbb', sge=20}
Student{name='ccc', sge=30}
--------增强for-------
Student{name='bbb', sge=20}
Student{name='ccc', sge=30}
----------迭代器---------
Student{name='bbb', sge=20}
Student{name='ccc', sge=30}
Student{name='bbb', sge=20}
Student{name='ccc', sge=30}
--------判断------
false
false
--------获取--------
0
Process finished with exit code 0
泛型
本质是参数化类型,把类型作为参数传递。
常见形式有泛型类、泛型接口、泛型方法。
好处:提高代码的重用性。防止类型转换异常,提高代码的安全性。
泛型类
类名
T是占位符,表示一种引用类型。编写多个使用逗号隔开。
public class Demo1<T> {
//使用泛型T
//1、创建变量
T t;
//2、添加方法
public void show(T t){
System.out.println(t);
}
//3、泛型作为方法的返回值
public T getT(){
return t;
}
}
注意:
泛型只能使用引用类型。不同的泛型类型对象之间不能相互复制。
public static void main(String[] args) {
//使用泛型类创建对象
//注意:泛型只能使用引用类型。不同泛型类型对象之间不能相互复制
Demo1<String> demo1 = new Demo1<String>();
demo1.t = "hello";
demo1.show("大家好");
String t = demo1.getT();
System.out.println(t);
Demo1<Integer> demo2 = new Demo1<Integer>();
demo2.t=100;
demo2.show(200);
Integer integer = demo2.getT();
}
大家好
hello
200
泛型接口
接口
public interface Demo2<T> {
String name = "张三";
T server(T t);
}
1、无法改变类型
public class Test2 implements Demo2<String> {
@Override
public String server(String s) {
System.out.println(s);
return s;
}
}
2、可以在创建对象的时候改变类型
public class Test2_2<T> implements Demo2<T>{
@Override
public T server(T t) {
System.out.println(t);
return null;
}
}
main
Test2 test2 = new Test2();
test2.server("aaaaa");
Test2_2<Integer> test21 = new Test2_2<>();
test21.server(1000);
结果
aaaaa
1000
泛型方法
public <T> T show(T t){
System.out.println("泛型方法"+t);
return t;
}
类型可以根据所给类型转变
Demo3 demo3 = new Demo3();
demo3.show("aa");
demo3.show(100);
结果
泛型方法aa
泛型方法100
泛型集合
object 强转运行会报错
ArrayList arrayList = new ArrayList();
arrayList.add("aa");
arrayList.add("dd");
arrayList.add(10);
arrayList.add(20);
for(Object object:arrayList){
String str = (String) object;
System.out.println(object);
}
泛型集合在编译时,类型不对情况下便会显示错误。
ArrayList<String> arrayList2 = new ArrayList<>();
arrayList2.add("aa");
arrayList2.add("dd");
//arrayList2.add(11); 编译就报错
for (String s:arrayList2){
System.out.println(s);
}
其他类调用,标明泛型类型
ArrayList<Student> arrayList1 = new ArrayList<>();
Student s1 = new Student("小明",20);
Student s2 = new Student("小白",10);
Student s3 = new Student("小刚",25);
Student s4 = new Student("小黑",34);
arrayList1.add(s1);
arrayList1.add(s2);
arrayList1.add(s3);
arrayList1.add(s4);
Iterator<Student> it = arrayList1.iterator();
while (it.hasNext()){
Student s = it.next();
System.out.println(s.toString());
}
Set子接口
无序,无下标,元素不可重复。
全部继承自collection
Set实现类
HashSet,TreeSet
//创建集合
Set<String> set = new HashSet<>();
//1、添加数据
set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ddd");
System.out.println("个数:"+set.size());
System.out.println(set.toString());
//2、删除
set.remove("aaa");
//3、遍历
//增强for
System.out.println("-----增强for-----");
for (String string:set
) {
System.out.println(string);
}
//迭代器
System.out.println("--------迭代器-------");
Iterator<String> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//4、判断
System.out.println(set.contains("bbb"));
System.out.println(set.isEmpty());
HashSet
哈希表(数组+链表+红黑树)
不重复,无序
//新建集合
HashSet<String> hashSet = new HashSet<>();
//1、添加元素
hashSet.add("aaa");
hashSet.add("bbb");
hashSet.add("ccc");
hashSet.add("ddd");
hashSet.add("ddd");
System.out.println("个数:"+hashSet.size());
System.out.println(hashSet.toString());
//2、删除元素
hashSet.remove("aaa");
System.out.println("个数"+hashSet.size());
//3、遍历
System.out.println("-------增强for-------");
for (String string : hashSet) {
System.out.println(string);
}
System.out.println("-------迭代器--------");
Iterator<String> it = hashSet.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//4、判断
System.out.println(hashSet.contains("ccc"));
System.out.println(hashSet.isEmpty());
结果
个数:4
[aaa, ccc, bbb, ddd]
个数3
-------增强for-------
ccc
bbb
ddd
-------迭代器--------
ccc
bbb
ddd
true
false
Process finished with exit code 0
存储过程
- 1、根据hashcode计算保存的位置。如果为空则直接保存。否则继续执行下面的
- 2、再执行equals方法,如果equals为true,则认为重复。否则形成列表。
TreeSet
存储结构:红黑树
顺序存储,不会重复。
//1、创建集合
TreeSet<String> treeSet = new TreeSet<>();
//2、添加元素
treeSet.add("aaa");
treeSet.add("bbb");
treeSet.add("ccc");
treeSet.add("ddd");
System.out.println("元素个数:"+treeSet.size());
System.out.println(treeSet.toString());
//3、删除
treeSet.remove("aaa");
System.out.println("个数:"+treeSet.size());
//3、遍历
System.out.println("---------增强for-------");
for (String string : treeSet) {
System.out.println(string);
}
System.out.println("---------迭代器--------");
Iterator<String> it = treeSet.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//4、判断
System.out.println(treeSet.contains("aaa"));
结果
元素个数:4
[aaa, bbb, ccc, ddd]
个数:3
---------增强for-------
bbb
ccc
ddd
---------迭代器--------
bbb
ccc
ddd
false
Process finished with exit code 0
TreeSet保存数据
红黑树
要求元素必须要实现Comparable方法
CompareTo方法的返回为0,认为是重复,不添加。
Person类对CompareTo方法的实现
@Override
public int compareTo(Person o) {
//先比较姓名,再比较年龄
int n1 = this.getName().compareTo(o.getName());
int n2 = this.age-o.getAge();
return n1==0?n2:n1;
main方法
因为CompareTo是比较名字和年龄是否相同的。
所以即使是没有对象名的对象依然可以进行添加和比较。即,可以使用new出的进行添加和比较。
//创建
TreeSet<Person> person = new TreeSet<>();
//1、添加
Person p1 = new Person("aaa",10);
Person p2 = new Person("bbb",50);
Person p3 = new Person("ccc",15);
Person p4 = new Person("ddd",20);
person.add(p1);
person.add(p2);
person.add(p3);
person.add(p4);
System.out.println("个数:"+person.size());
System.out.println(person.toString());
//2、删除
person.remove(p1);
//比较的是是否重复,所以可以删除。
person.remove(new Person("bbb",50));
System.out.println(person.size());
//3、遍历
System.out.println("--------增强for---------");
for (Person p : person) {
System.out.println(p.toString());
}
System.out.println("--------迭代器--------");
Iterator<Person> it = person.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//4、判断
System.out.println(person.contains(p3));
//比较名字年龄是否相同,可以比较
System.out.println(person.contains(new Person("ccc",15)));
结果
个数:4
[Person{name='aaa', age=10}, Person{name='bbb', age=50}, Person{name='ccc', age=15}, Person{name='ddd', age=20}]
2
--------增强for---------
Person{name='ccc', age=15}
Person{name='ddd', age=20}
--------迭代器--------
Person{name='ccc', age=15}
Person{name='ddd', age=20}
true
true
Process finished with exit code 0
compare
认为,当返回值为负数时,左边小于右边,左边排在右边的上面。
案例
public static void main(String[] args) {
//定制比较器
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int n1 = o1.length()-o2.length();
int n2 = o1.compareTo(o2);
return n1==0?n2:n1;
}
});
treeSet.add("helloworld");
treeSet.add("zhang");
treeSet.add("lisi");
treeSet.add("wangwu");
treeSet.add("beijing");
treeSet.add("xian");
treeSet.add("nanjing");
System.out.println(treeSet.toString());
}
结果
[lisi, xian, zhang, wangwu, beijing, nanjing, helloworld]
Map
用于存储任意键值对。
键:无序、无下标、不允许重复。
值:无序、无下标、允许重复。
添加元素用map.put
public static void main(String[] args) {
//创建Map集合
Map<String,String> map = new HashMap<>();
//1、添加元素
map.put("cn","中国");
map.put("uk","英国");
map.put("usa","美国");
map.put("cn","中国");
System.out.println("元素个数:"+map.size());
System.out.println(map.toString());
//2、删除
map.remove("usa");
System.out.println("个数:"+map.size());
//3、遍历
System.out.println("--------keyset--------");
//Set<String> keyset = map.keySet();
for (String key:map.keySet()) {
System.out.println(key+"----"+map.get(key));
}
//entry是映射对 效率更高
System.out.println("-------entrySet-----");
Set<Map.Entry<String,String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"----"+entry.getValue());
}
//4、判断
System.out.println(map.containsKey("cn"));
System.out.println(map.containsValue("英国"));
}
结果
元素个数:3
{usa=美国, uk=英国, cn=中国}
个数:2
--------keyset--------
uk----英国
cn----中国
-------entrySet-----
uk----英国
cn----中国
true
true
Process finished with exit code 0
HashMap
存储结构:哈希表(数组+链表+红黑树)
添加的时候,编译从上往下添加,打印从下往上打印。
key重复会覆盖Value的值,即使没有对象名的对象依然可以覆盖有对象名的对象的Value。
值(Value)可以重复。key不可以重复。
不重写hashcode和equals的话,根据对象名判断是否重复,此时可以用new创建新的对象。重写hashcode和equals后根据内容判断是否重复。
刚创建hashmap集合时,没有添加元素table=null
size = 0。
public static void main(String[] args) {
//创建集合
HashMap<Student,String> students = new HashMap<Student,String>();
//添加对象:从下往上添加
//key重复会覆盖Value值,即使是无对象名的对象也可以把有对象名的对象覆盖
Student s1=new Student("aa",10);
Student s2=new Student("bb",20);
Student s3=new Student("cc",30);
students.put(s1,"北京");
students.put(s2,"北京");//值可以重复
students.put(s3,"杭州");//key不可以重复
students.put(s3,"天津");
//判断是否相同通过对象名判断,而不通过内容。若想相同的元素不加上来重写equals方法
students.put(new Student("cc",30),"南京");
System.out.println("个数:"+students.size());
System.out.println(students.toString());
//删除
students.remove(s1);
System.out.println("个数:"+students.size());
//遍历
System.out.println("--------keySet------");
for (Student key : students.keySet()){
System.out.println(key.toString()+"----"+students.get(key));
}
System.out.println("-------entrySet------");
for (Map.Entry<Student,String> entry:students.entrySet()) {
System.out.println(entry.getKey()+"----"+entry.getValue());
}
//判断
System.out.println(students.containsKey(s1));
System.out.println(students.containsValue("南京"));
}
结果
个数:3
{Student{name='bb', stuNo=20}=北京, Student{name='aa', stuNo=10}=北京, Student{name='cc', stuNo=30}=南京}
个数:2
--------keySet------
Student{name='bb', stuNo=20}----北京
Student{name='cc', stuNo=30}----南京
-------entrySet------
Student{name='bb', stuNo=20}----北京
Student{name='cc', stuNo=30}----南京
false
true
Process finished with exit code 0
1、hashmap刚创建,table是null,为节省空间,当添加第一个元素时,table容量调整为16。
2、当元素阈值(16*.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
3、jdk1.8 当每个链表长度大于8,并且元素个数大于等于64时,会调整红黑树,目的是提高效率
4、jdk1.8 当链表长度小于16,调整链表
5、jdk1.8之前是链表头插插入,jdk108之后是链表尾插入
Colletions工具类
reverse 反转集合中元素的顺序。
shuffle 随机重置集合元素的顺序。
sort 升序排序(元素类型必须实现Comparable接口)
List<Integer> list = new ArrayList<>();
list.add(20);
list.add(22);
list.add(50);
list.add(51);
list.add(64);
list.add(82);
list.add(14);
//sort排序
System.out.println("sort排序之前:"+list.toString());
Collections.sort(list);
System.out.println("sort排序之后:"+list.toString());
//bineraySearch 二分查找
int i = Collections.binarySearch(list,50);
System.out.println(i);
//copy复制
List<Integer> dest = new ArrayList<>();
for (int i1=0;i1<list.size();i1++){
dest.add(0);
}
Collections.copy(dest,list);
System.out.println(dest.toString());
//reverse反转
Collections.reverse(list);
System.out.println("反转之后:"+list);
//shuffle打乱
Collections.shuffle(list);
System.out.println("打乱之后:"+list);
结果
sort排序之前:[20, 22, 50, 51, 64, 82, 14]
sort排序之后:[14, 20, 22, 50, 51, 64, 82]
3
[14, 20, 22, 50, 51, 64, 82]
反转之后:[82, 64, 51, 50, 22, 20, 14]
打乱之后:[20, 50, 14, 51, 64, 22, 82]
list转成数组
数组长度小于list数组。输出数组长度等于list长度。若大于则多出的为null。
// 数组长度小于list数组。输出数组长度等于list长度。若大于则多出的为null
Integer[] arr = list.toArray(new Integer[0]);
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
结果
7
[20, 50, 14, 51, 64, 22, 82]
数组转成集合
数组转成的集合是一个受限集合,不能添加和删除。
把基本类型数组转成集合时,需要修改为包装类型。
String[] names = {"张三","李四","王五"};
//数组转成的集合是一个受限集合,不能添加和删除
List<String> list1 = Arrays.asList(names);
System.out.println(list1);
//把基本类型数组转成集合时,需要修改为包装类型
Integer[] nums = {100,200,300,500,600,800};
List<Integer> list2= Arrays.asList(nums);
System.out.println(list2);
结果
[张三, 李四, 王五]
[100, 200, 300, 500, 600, 800]
总结
集合:对象的容器,和数据类似。定义了多个对象进行操作的常用方法。
list集合:有序,有下标,元素可以重复。
ArrayList,LinkedList,Vector。
Set集合:无序,无下标,元素不可重复。
HashSet(数组+链表+红黑树),TreeSet(红黑树)。
Map集合:存储一对数据,无序,无下标,键不可重复,值可以重复。
HashMap(哈希表),HashTable,TreeMap(红黑树)。
Collections:集合工具类,定义了除啦存取以外的集合常用方法。
浙公网安备 33010602011771号