发表于: 2021-01-30 23:26:46
1 1253
今天完成的事情:
学习集合
明天计划的事情:
继续学习List
遇到的问题:
暂无
收获:
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* 一、集合框架的概述
*
* 1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器。
* 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)
*
* 2.1 数组在存储多个数据方面的特点:
* > 一旦初始化以后,其长度就确定了。
* > 数组一旦定义好,其元素的类型也就确定了。我们也就只能操作指定类型的数据了。
* 比如:String[] arr;int[] arr1;Object[] arr2;
* 2.2 数组在存储多个数据方面的缺点:
* > 一旦初始化以后,其长度就不可修改。
* > 数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
* > 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
* > 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
*
* 二、集合框架
* |----Collection接口:单列集合,用来存储一个一个的对象
* |----List接口:存储有序的、可重复的数据。 -->“动态”数组
* |----ArrayList、LinkedList、Vector
*
* |----Set接口:存储无序的、不可重复的数据 -->高中讲的“集合”
* |----HashSet、LinkedHashSet、TreeSet
*
* |----Map接口:双列集合,用来存储一对(key - value)一对的数据 -->高中函数:y = f(x)
* |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
*
*
* 三、Collection接口中的方法的使用
*
*/
public class CollectionListTest {
@Test
public void test1() {
Collection coll = new ArrayList();
//add(Object e):将元素e添加到集合coll中
coll.add("AA");
coll.add("CC");
coll.add(123);//自动装箱
coll.add(new Date());
//size():获取添加的元素的个数
System.out.println(coll.size());//4
//addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中
Collection cc = new ArrayList();
cc.add(456);
cc.add("DD");
coll.addAll(cc);
System.out.println(coll.size());//6
System.out.println(coll);
//clear():清空集合元素
coll.clear();
//isEmpty():判断当前集合是否为空
System.out.println(coll.isEmpty());
}
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* Collection接口中声明的方法的测试
*
* 结论:
* 向Collection接口的实现类的对象中添加数据object时,要求object所在类要重写equals().
*
*/
public class CollectionOrPerson {
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(new Person("Bob",20));
coll.add(123);
coll.add(456);
coll.add(false);
// Person p = new Person("Bob",20);
// coll.add(p);
//1.contains(Object obj):判断当前集合中是否包含obj
//我们在判断时会调用obj对象所在类的equals()。
System.out.println(coll);
boolean contains = coll.contains(123);
System.out.println(contains);//true
// System.out.println(coll.contains(p));//true
//需要在实体类中重写equals,不然就是调用object中的方法 就是== 判断内存位置,而不是判断值
System.out.println(coll.contains(new Person("Bob",20)));//false -->true
//2.containsAll(Collection coll1):判断形参coll1中的所有元素是否都存在于当前集合中。
Collection coll1 = Arrays.asList(123,4567);
System.out.println(coll.containsAll(coll1));//false
}
@Test
public void test2(){
//3.remove(Object obj):从当前集合中移除obj元素。
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//remove当中有equals方法,先判断是否相等,再来移除
coll.remove(123);
System.out.println(coll);
coll.remove(new Person("Jerry",20));
System.out.println(coll);
//4. removeAll(Collection coll1):差集:从当前集合中移除coll1中所有的元素。
Collection coll1 = Arrays.asList(123,456);
coll.removeAll(coll1);
System.out.println(coll);
}
@Test
public void test3(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//5.retainAll(Collection coll1):交集:获取当前集合和coll1集合的交集,并返回给当前集合
// Collection coll1 = Arrays.asList(123,456,789);
// coll.retainAll(coll1);
// System.out.println(coll);//[123, 456]
//6.equals(Object obj):要想返回true,需要当前集合和形参集合的元素都相同。
Collection coll1 = new ArrayList();
coll1.add(456);
coll1.add(123);
coll1.add(new Person("Jerry",20));
coll1.add(new String("Tom"));
coll1.add(false);
System.out.println(coll.equals(coll1));//false,说明ArrayList是有顺序的,ArrayList实现了 List 接口
}
@Test
public void test4(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//7.hashCode():返回当前对象的哈希值
Collection coll2 = new ArrayList();
coll2.add(new String("kuangbokai"));
System.out.println(coll.hashCode());//701070075
System.out.println(coll2.hashCode());//-1433095083
//8.集合 转换成 数组:toArray()
Object[] arr = coll.toArray();
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
//拓展:数组 转换成 集合:调用Arrays类的静态方法asList()
List<String> list = Arrays.asList(new String[]{"AA", "BB", "CC"});
System.out.println(list);//输出:"AA", "BB", "CC"
List arr1 = Arrays.asList(new int[]{123, 456});
System.out.println(arr1.size());//1,这个会被识别成一个元素,就把这当作一个对象来看
List arr2 = Arrays.asList(new Integer[]{123, 456});
System.out.println(arr2);//2,两个元素,两个对象
//9.iterator():返回Iterator接口的实例,用于遍历集合元素。放在IteratorTest.java中测试
}
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* 集合元素的遍历操作,使用迭代器Iterator接口
* 1.内部的方法:hasNext() 和 next()
* 2.集合对象每次调用iterator()方法都得到一个全新的迭代器对象,
* 默认游标都在集合的第一个元素之前。
* 3.内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
*
*/
public class IteratorTest {
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Bob",20));
coll.add(new String("Tom"));
coll.add(false);
Iterator iterator = coll.iterator();
//方式一:
// System.out.println(iterator.next());
// System.out.println(iterator.next());
// System.out.println(iterator.next());
// System.out.println(iterator.next());
// System.out.println(iterator.next());
// //报异常:NoSuchElementException,没有元素了
// System.out.println(iterator.next());
//方式二:不推荐
// for(int i = 0;i < coll.size();i++){
// System.out.println(iterator.next());
// }
//方式三:推荐
////hasNext():判断是否还有下一个元素
while(iterator.hasNext()){
//next():①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
}
@Test
public void test2(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//错误方式一:迭代器Iterator先下移,然后再将值返回。所以下面的方式,回下移两次,然再返回值。最好没有元素返回,报错。
Iterator iterator = coll.iterator();
while((iterator.next()) != null){
System.out.println(iterator.next());
}
//错误方式二:
//集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
// while (coll.iterator().hasNext()){
// System.out.println(coll.iterator().next());
// }
}
//测试Iterator中的remove()
//如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,
// 再调用remove都会报IllegalStateException。
@Test
public void test3(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//删除集合中"Tom"
Iterator iterator = coll.iterator();
while (iterator.hasNext()){
// iterator.remove(); //报错 :java.lang.IllegalStateException 这时指针还为移到下一个元素,此时指针指向 空
Object obj = iterator.next();
if("Tom".equals(obj)){
iterator.remove();
// iterator.remove();
}
}
// //遍历集合
iterator = coll.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class ForTest {
@Test
public void test1(){
Collection coll = new ArrayList();
coll.add(123);
coll.add(456);
coll.add(new Person("Jerry",20));
coll.add(new String("Tom"));
coll.add(false);
//集合元素的类型 局部变量:集合对象 这两个对象必须相同
for(Object obj : coll){
System.out.println(obj);
}
}
@Test
public void test4(){
List list = new ArrayList();
// list.add("小猫");
// list.add("小狗");
// list.add("大黄");
// list.add("小猫");
// list.add("小狗");
// list.add("大黄");
//方式二:添加对象
list.add(new Person("Jerry",20));
list.add(new Person("Jerry",20));
list.add(new Person("Jerry",20));
list.add(new Person("Jerry",20));
list.add(new Person("Jerry",20));
list.add(new Person("Jerry",20));
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println((Person)iterator.next());
}
for(int i =0; i <list.size(); i++){
System.out.println(list.get(i));
}
}
@Test
public void test2(){
int[] arry = new int[]{1,2,3,4,5};
for (int a : arry){
System.out.println(a);
}
}
//练习题
@Test
public void test3(){
String[] arr = new String[]{"MM","MM","MM"};
// //方式一:普通for赋值
// for(int i = 0;i < arr.length;i++){
// arr[i] = "GG";
// }
//方式二:增强for循环
for(String s : arr){
s = "GG";
}
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);
}
}
}
/**
* 1. List接口框架
*
* |----Collection接口:单列集合,用来存储一个一个的对象
* |----List接口:存储有序的、可重复的数据。 -->“动态”数组,替换原有的数组
* |----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
* |----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
* |----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储
评论