集合框架
定义
集合与数组类似,只不过集合中的数据量可以动态的变化。
List、Set集合属于单列集合
Map属于双列集合
1.List集合
==定义:==存放的数据可重复,并且有顺序
1.1 ArrayList
(1)容器的创建
ArrayList aList = new ArrayList();
注意
只装Object数据类型
(2)add()方法
向ArrayList集合中添加数据
aList.add(8);
aList.add(“终稿”);
aList.add(true);
aList.add(‘c’);
Object是所有类的超类,基本数据类型的包装类的父类都是Object。
(3)get()方法
获取ArrayList集合中某一个数
aList.get(index);
注意
因为Object是所有基本数据类型的父类,当已知其中一个数的数据类型时,接收该数据时,需要使用强制数据类型转换。
例如:String str = aList.get(2);
应为: String str = (String)aList.get(2) ;
(4)remove()方法
根据下标来删除指定的数据,返回删除的元素
aList.remove(2);
aList.clear(); 把集合全清空,慎用
(5)set()方法
修改集合中的元素
aList.set(index ,Object);
(6)计算List集合的长度
int len = aList.size();
(7) 检测集合中是否包含某元素
其方法的返回值为布尔类型,方法为判断指定数据在ArrayList集合中是否存在
Boolean flag = aList.contains("");
1.2 LinkedList
LinkedList bList = new LinkedList ();
方法同ArrayList。
1.3 泛型
==定义:==指定集合等中存放的具体数据类型。
ArrayList aList = new ArrayList();
List aList = new ArrayList();
例如:
List<Integer> aList = new ArrayList<Integer>();aList.add(1);aList.add(2);aList.add(3);
以上代码可简化为:
List<Integer> aList = Array.asList(1,2,3);
Array.asList(T… a); List–java.util.Arrays
1.4 区别
ArrayList 与 LinkedList的区别(重):
1)ArrayList 底层是数组,而且是Object[];LinkedList 底层是链表。
2)ArrayList 查询数据很快,但是增删改查很慢;LinkedList 增删数据很快,但是查询数据较慢。add()方法用较多,使用LinkList,get()方法用较多,使用ArrayList。
2.Set集合
==定义:==存放的数据不能重复,无序
2.1 HashSet
底层是哈希表
(1)创建HashSet对象
HashSet aSet = new HashSet();
(2)add()方法
增加数据
aSet.add("孙五点");
aSet.add("孙悟空");
aSet.add("孙五点");
打印结果为:
孙五点 孙悟空
因为Set集合不能存放重复数据,当存放相同数据时打印时仍打印一次,且打印结果没有顺序。
(3)remove()方法
删除数据
boolean flag = aSet.remove("孙悟空");
List数组底层实现是数组所以根据下标删除,Set因为无序所以直接删除指定元素即可。
(4)修改数据
需要先删除再添加
aSet.remove("孙悟空");aSet.add("唐僧");
(5) contains()方法
查询HashSet集合中是否存在指定的数据
boolean flag = aSet.contains("唐僧");
(6)计算HashSet集合中的数据条数
int len = aSet.size();
2.2 TreeSet
底层是二叉树
3.Map集合
键值对
3.1 HashMap
(1)容器的创建
HashMap()构造方法
HashMap<Integer,String> aMap = new HashMap<Integer,String>();
(2)put()方法
添加数据(key-value):
key值必须唯一,不能够重复,如果重复,后者会覆盖前者。
aMap.put(1,"张三");aMap.put(2,"张五");aMap.put(3,"张六");
针对无参的构造方法,初始化创建16个空间,一旦超出默认加载因子为0.75;即28个空间,依次计算。
(3)打印结果
因为HashMap覆盖toString()方法,所以可以直接打印。
打印结果是无序的。
system.out.println(aMap);
(4)删除
删除是根据key值,因为具有唯一性,同时返回值为value所对应的数据类型,返回的为value值
aMap.remove(1);
String value = aMap.remove(3);
(5) 修改
覆盖原理,用put()方法即可
aMap.put(2,"刘三");
(6)查询
根据key值获取value值
String value = aMap.get(2);sout("aMap.get(2)="+value);
指定value值在HashMap中是否存在,返回为布尔值
Boolean flag = aMap.containsValue("王五");
对HashMap集合进行遍历
forEach循环可以直接对List集合、Set集合、数组进行直接遍历,但是不可以对Map集合遍历。
思路:
1)将Map类型转化为Set类型即可以实现遍历。
2)将一条数据key 和 value 键值对按一条条目存放,即Entry类型。
操作:
1.1 aMap.entrySet(): Set<Entry<Integer,String>> 方法
Set<Entry<Integer,String>> entrySet = aMap.entrySet();
1.2
for(Entry<Integer,String> temp :entrySet){sout(temp);}
打印结果:2=刘三 //通过等号分割key value值
补充:改变分隔符
Set<Entry<Integer,String>> entrySet = aMap.entrySet();
for(Entry<Integer,String> temp :entrySet){Integer key= temp.getKey(); String value = temp.getValue();sout(key+":"+value);}
可简化为:
for(Entry<Integer,String> temp :aMap.entrySet()){sout(temp.getKey()+":"+temp.getValue());}
思想:temp获取变量,变量由条目组成,条目有相关方法可以获取到key 和 value的值,打印时候分开打印中间即可添加不同分隔符。
3.2 TreeMap
3.3 Hashtable(过时)
补充
可变参数
(int…attr)int类型参数的个数是从0~N
底层实现依旧是数组,遍历数组方法遍历即可,例如forEach遍历。
注意
当函数传参时,有多个不同类型和可变参数时候,可变参数必须放在最后。
例如
public static void demo(float f,String str,int…attr){}
Junit测试
方便测试代码
1.新建测试包 cn.java.junit
2.在方法上加注解 @Test
3.引入Add JUnit 4 library to the build path,即导入import org.junit.Text;
注意
1)方法名和类名不能叫Test
2)函数应该为实例方法不能有返回值 public void test1(){}
3)通过Junit测试的方法,不能有返回值、不能写形参,访问修饰符使用public修饰