一、集合
(1):集合:
-
集合就是由若干个确定的元素所构成的整体,存储对象的容器,可以存储任意数量、任意类型。
-
为了方便统一处理一组类似或相同类型的数据。
-
持有java对象,并对外提供访问接口。
(2):满足的目标:
-
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
-
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
-
对一个集合的扩展和适应必须是简单的。
(3):集合与数组的区别:
-
数组初始化后大小不可变;只能按照索引顺序存取。
-
集合存储的长度是可变的;只能存储对象。
二、Collection接口
List接口
-
List{ArrayList,LinkedList}; 存储有序 不唯一的集合元素。
-
ArrayList:数组形式 连续的存储空间 查询速度快 增删速度慢。
-
LinkedList:双向链表 不连续的存储空间 增删速度快 查询速度慢。
ArrayList和LinkedList和Vactor的区别
区别 | ArrayList | LinkedList | Vactor |
---|---|---|---|
实现的接口不同 | 没有实现Queue,Deque接口,不支持队列操作 | 实现了Queue和Deque接口,支持栈操作和队列操作 | 没有实现Queue,Deque接口,不支持队列操作 |
内部实现不同 | 内部采用数组存储元素 | 采用双向链表来存储元素 | 内部采用数组存储元素 |
删除效率不同 | 删除慢 | 删除快 | 删除慢 |
是否支持随机访问 | 随机访问效率高 | 低 | 随机访问效率高 |
线程安全 | 非线程安全,适用与单线程环境 | 非线程安全,适用于多线程安全 | 线程安全,适用于多线程环境 |
扩容方式不同 | 倍数增长 | 固定增量 | 不必进行扩容 |
package com.Demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
//ArrayList<String> A_list=new ArrayList<String>();
//接口不能实例化 只能通过子类
List<String> list=new ArrayList<String>();
//添加数据
list.add("lmy");
list.add("zs");
list.add("ls");
System.out.println(list);
System.out.println(list.get(0));//获取下标索引的名字的值
System.out.println("list.size():"+list.size());//获取集合中有多少元素
System.out.println(list.remove(1));//删除指定的索引值 并返回此值
System.out.println("list.size():"+list.size());//获取集合中有多少元素
//判断是否存在指定的元素
System.out.println("list.contains('zs'):"+list.contains("zs"));
//set 按照参数内容替换指定索引处的值
System.out.println("-------set()---------");
System.out.println(list.get(1));
System.out.println(list.set(1,"zs"));
System.out.println(list.get(1));
//indexOf 指定元素在集合中出现的位置
System.out.println("-------indexOf()------");
System.out.println(list);
System.out.println("list.indexOf:"+list.indexOf("lmy"));
System.out.println("list.lastIndexOf:"+list.lastIndexOf("lmy"));
//集合中是否为空
System.out.println("list.isEmpty():"+list.isEmpty());
//toArray 转换为数组
/* Object[] strArray = list.toArray();
for (Object str : strArray) {
System.out.println("str==="+str);
}*/
String[] strArray = list.toArray(new String[0]);
for (String s : strArray) {
System.out.println(s);
}
//清除集合中的元素
list.clear();
System.out.println(list.isEmpty());
list.add("lmy");
list.add("zs");
list.add("ls");
list.add("ww");
System.out.println(list);
//获取集合中所有的元素内容 --->遍历集合
//1:普通的for循环
System.out.println("第一种for循环========");
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}
//2:使用foreach循环 (加强for循环)
System.out.println("第二种foreach循环========");
for (String str : list) {
System.out.println(str);
}
//3:使用迭代器 对于集合遍历统一处理的一种方式
System.out.println("第三种iterator循环========");
Iterator<String> iterator = list.iterator();
//iterator.hasNext() 判断是否还有元素
//iterator.next() 返回下一个元素
//iterator.remove() 删除
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
package com.Demo;
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> list=new LinkedList<String>();
list.add("刘梦园");
list.add("张三");
list.add("李四");
System.out.println("原本的集合结果:"+list);
list.addFirst("张三");
System.out.println("addFirst的集合结果:"+list);
list.addLast("木子李");
System.out.println("addLast的集合结果:"+list);
//list.getFirst()
System.out.println("list.getFirst():"+list.getFirst());
//list.getLast()
System.out.println("list.getLast():"+list.getLast());
System.out.println("删除之前的数据结果:"+list);
System.out.println(list.removeFirst());
System.out.println(list.removeLast());
System.out.println("删除之后的数据结果:"+list);
//for
System.out.println("第一种for循环========");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("第二种foreach循环========");
for (String str : list) {
System.out.println(str);
}
//3:使用迭代器 对于集合遍历统一处理的一种方式
System.out.println("第三种iterator循环========");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
Set接口
-
Set{HashSet,TreeSet}; 存储是无序的 唯一的集合元素 允许有null值
-
实现Set接口的集合有:EnumSet、HashSet、TreeSet.
-
EnumSet 枚举专用的Set,所有元素都是枚举类型。
-
HashSet 底层是哈希表,线程不同步,无序,高效。HashSet堪称查询最快的集合,因为其内部是以HashCode实现的。它内部的顺序有哈希码来决定,所以不保证Set的迭代顺序。
-
LinkedHashSet 有序 ,HashSet的子类。LinkedHashSet 不允许集合元素重复。
-
TreeSet 底层是二叉树, 线程不同步。 基于TreeMap,生成一个总是处于排序状态的Set,内部以TreeMap来实现,利用元素的自然顺序对元素进行排序,或者根据创建时提供的Comparator进行排序。TreeSet底层使用红黑树结构存储数据,非线程安全的。
-
package com.Demo;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args) {
//重复数据的筛选
HashSet<String> set=new HashSet<String>();
set.add("刘梦园");
set.add("张三");
set.add("李四");
set.add("李四");
System.out.println(set);
System.out.println("remove之前的结果条数:"+set.size());
System.out.println(set.remove("刘梦园"));
System.out.println("remove之后的结果条数:"+set.size());
//遍历集合
System.out.println("第一种foreach循环========");
for (String str : set) {
System.out.println(str);
}
System.out.println("第二种iterator循环========");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
Set和List的区别
-
Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。
-
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
-
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
三、Map
Map 接口存储一组键值对象,提供key(键)到value(值)的映射。不能存在相同的 Key,实现Map的有:HashMap、TreeMap、HashTable、Properties、EnumMap . Map要保证键的唯一性。
-
HashTable 底层哈希表,线程同步,不能存在Null键,Null值。线程同步,以哈希表的数据结构实现,解决冲突时与HashMap一样也是采用散列表的形式,不过性能比HashMap要低。
-
HashMap 底层哈希表,线程不同步,不能存在Null键,Null值。 以哈希表数据结构实现,查找对象时通过hash值计算其位置,它是为快速查询而设计的,内部定义了一个Hash表数组(Entry[] table),元素会通过hash转化函数转为在数组中的索引,如果有冲突的,则用散列链表的形式串起来。
-
LinkedHashMap Map接口的哈希表和链接列表实现,具有预知的迭代顺序。
-
TreeMap 底层二叉树,可以对Map集合中的键进行制定顺序的排序。键以某种排序规则排序,内部以Red-balck(红-黑树)数据结构实现。实现了SortedMap接口。
package com.Demo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTest {
public static void main(String[] args) {
HashMap<String,String> map=new HashMap<String,String>();
//存储值put
map.put("name","刘梦园");
//获取值get
System.out.println(map.get("name"));
//删除值remove
System.out.println(map.remove("name"));
System.out.println("删除之后的值:"+map.get("name"));
map.put("name","刘梦园");
map.put("sex","女");
map.put("address","许昌");
map.put("phone","298392423");
//遍历HashMap中所有的内容key value
//1:Key Value 作为一个整体
System.out.println("第一种 key value 全部的值================");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()){
Map.Entry<String, String> next = it.next();
String key=next.getKey();
String value=next.getValue();
System.out.println(key+":"+value);
}
System.out.println("第二种 key的值================");
Iterator<String> it2 = map.keySet().iterator();
while (it2.hasNext()){
String key = it2.next();
String value=map.get(key);
System.out.println(key+":"+value);
}
System.out.println("第三种 value的值================");
Iterator<String> it3 = map.values().iterator();
while (it3.hasNext()){
String value = it3.next();
System.out.println("value:"+value);
}
}
}
四、Collections类常用方法总结
sort
对集合进行排序
小结:
-
String本身含有compareTo方法,可以直接调用sort方法,按自然顺序排序
-
compareTo方法使用,升序排序(参数左比右),降序排序(参数右比左);另外compareTo方法里面传入参数类型是Integer类型的比较内容
-
使用sort方法进行规则比较,都需要实现Comparator,只是方式不同
private void test() {
//排序字符串集合
List<String> listS = new ArrayList<>();
listS.add("2");
listS.add("5");
listS.add("3");
listS.add("7");
listS.add("4");
//listS中的对象String本身含有compareTo方法,所以可以直接调用sort方法,按自然顺序排序
Collections.sort(listS);
Log.d("TAG", "listS:" + listS);//[2, 3, 4, 5, 7]
//排序对象元素
List<Employer1> list1 = new ArrayList<Employer1>();
Employer1 a1 = new Employer1();
Employer1 b1 = new Employer1();
Employer1 c1 = new Employer1();
a1.setName("a1");
a1.setAge(44);
b1.setName("b1");
b1.setAge(55);
c1.setName("b1");
c1.setAge(33);
list1.add(a1);
list1.add(b1);
list1.add(c1);
Collections.sort(list1, new MyCompare());
//[name is b1 age is 33, name is a1 age is 44, name is b1 age is 55]
Log.d("TAG", "list1:" + list1);
List<Employer2> list2 = new ArrayList<Employer2>();
Employer2 a2 = new Employer2();
Employer2 b2 = new Employer2();
Employer2 c2 = new Employer2();
a2.setName("a2");
a2.setAge(66);
b2.setName("b2");
b2.setAge(33);
c2.setName("b2");
c2.setAge(22);
list2.add(a2);
list2.add(b2);
list2.add(c2);
Collections.sort(list2, new Comparator<Employer2>() {
@Override
public int compare(Employer2 o1, Employer2 o2) {
//比较规则,年龄比较,降序排序(右比左)
//注意:compareTo方法里面传入Integer类型的比较内容
return o2.getOrder().compareTo(o1.getOrder());
}
});
//[name is a2 age is 66, name is b2 age is 33, name is b2 age is 22]
Log.d("TAG", "list2:" + list2);
List<Employer3> list3 = new ArrayList<Employer3>();
Employer3 a3 = new Employer3();
Employer3 b3 = new Employer3();
Employer3 c3 = new Employer3();
a3.setName("a3");
a3.setAge(77);
b3.setName("b3");
b3.setAge(55);
c3.setName("b3");
c3.setAge(99);
list3.add(a3);
list3.add(b3);
list3.add(c3);
Collections.sort(list3);
//[name is b3 age is 55, name is a3 age is 77, name is b3 age is 99]
Log.d("TAG", "list3:" + list3);
}
class Employer1 {
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//重载了Object类里的toString方法,使之可以按照我们要求的格式打印
@Override
public String toString() {
return "name is " + name + " age is " + age;
}
}
//比较类
class MyCompare implements Comparator<Employer1> {
@Override
public int compare(Employer1 o1, Employer1 o2) {
//比较规则,年龄比较,升序排序(左比右)
return o1.getAge().compareTo(o2.getAge());
}
}
class Employer2 {
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public Integer getOrder() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//重载了Object类里的toString方法,使之可以按照我们要求的格式打印
@Override
public String toString() {
return "name is " + name + " age is " + age;
}
}
class Employer3 implements Comparable<Employer3> {
private String name;
private Integer age;
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//重载了Object类里的toString方法,使之可以按照我们要求的格式打印
@Override
public String toString() {
return "name is " + name + " age is " + age;
}
//重载了Comparable接口里的compareTo方法来实现具体的比较
@Override
public int compareTo(Employer3 a) {//第二个参数(右)
return this.age.compareTo(a.getAge());
}
}
shuffle
对集合进行随机排序 (有可能排序过的集合元素位置不变)
public void shuffle(){
List c = new ArrayList();
c.add("w");
c.add("o");
c.add("r");
c.add("l");
c.add("d");
Log.d("TAG", "初始集合:"+c);//[w, o, r, l, d]
Collections.shuffle(c);
Log.d("TAG", "随机一集合:"+c);//[l, o, d, w, r]
Collections.shuffle(c);
Log.d("TAG", "随机二集合:"+c);//[r, w, o, l, d]
}
max
前者采用Collection内含自然比较法,后者采用Comparator进行比较
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
min
前者采用Collection内含自然比较法,后者采用Comparator进行比较
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
copy
将集合n中的元素全部复制到m中,并且覆盖相应索引的元素 (从0开始覆盖,后面的元素向后移)
public void copy() {
List m = Arrays.asList("one two three four five six siven".split(" "));
Log.d("TAG", "初始集合:" + m);//[one, two, three, four, five, six, siven]
List n = Arrays.asList("我是 复制 过来的哈".split(" "));
Log.d("TAG", "待复制集合:" + n);//[我是, 复制, 过来的哈]
Collections.copy(m, n);
Log.d("TAG", "复制后集合:" + m);//[我是, 复制, 过来的哈, four, five, six, siven]
}