写在前面:
我也是一名java语言的爱好者,仅以此文作为学习的记录,对于文中出现的代码规范,代码格式,算法效率等问题,希望各路大神不吝赐教,在下感激不尽。同是学习的同学也同样希望互相交流,取长补短。
以下内容是学习《java编程思想》(《Thinking in Java》)的笔记,包括对习题的实现。
java容器类库中的两种主要类型:他们的区别在于容器中的每个“槽”保存的元素个数
1.Collection在每个槽中只能保存一个元素,此类容器包括
<1.1>list,它以特定的顺序保存一组元素
<1.2>set, 元素不能重复
<1.3>Queue,只允许在容器的一端插入对象,并从另一端移除对象
2.Map在每个槽内保存了两个对象,即键和与之关联的值
在一个Collection中添加一组元素的方法。Arrays.asList()接受一个数组或是一个用逗号分隔的元素列表,并将其转换为一个List对象,
例如使用Collection构造器来初始化容器
Collection
Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,将元素添加到Collection中
例如:
Collections.addAll(collection,11,12,13,14,15)
一.List
List承诺可以将元素维护在特定的序列中,List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
有两种类型的List。(1)基本的ArrayList,它用于随机访问元素,但是在List的中间插入和移除元素较慢
(我尝试了一下两种对ArrayList的初始化方式,貌似结果没有什么区别:
public class test {
public static void main(String[] args){
List list = new ArrayList(Arrays.asList(1,2,3));
List list2 = Arrays.asList(1,2,3);
System.out.println(list.getClass());
System.out.println(list2.getClass());
}
}
查询api chm文档,找到ArrayList的构造函数:
(2)LinkedList,它通过代价较低的在List中间进行插入和删除操作,提供了优化的顺序访问,LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大(这个特性集我没搞懂是什么意思?)
书上的例子是以导入的Pet类为例子,而225页的练习五,要求修改例子,使用Integer而不是Pet
代码实现:
package ListContainer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class ListFeatures {
public static void main(String[] args){
Random random = new Random(5);
List intLists = new ArrayList(Arrays.asList(40,20,3,4,5,6,7,8));//构造一个集合
System.out.println("1: "+intLists);
Integer i = new Integer(10);
intLists.add(i);
System.out.println("2: "+intLists);
System.out.println("3: "+intLists.contains(i));
intLists.remove(i);//去掉元素i
Integer i2 = intLists.get(2);
System.out.println("4: "+i2+" "+intLists.indexOf(i2));
Integer i3 = new Integer(5);
System.out.println("5: "+intLists.indexOf(i3));
System.out.println("6: "+intLists.remove(i3));
System.out.println("7: "+intLists.remove(i2));
System.out.println("8: "+intLists);
intLists.add(3,new Integer(19));
System.out.println("9: "+intLists);
List sub = intLists.subList(1, 4);
System.out.println("subList: "+sub);
System.out.println("10: "+intLists.containsAll(sub));
Collections.sort(sub);
System.out.println("sorted subList: "+sub);
System.out.println("11: "+intLists.containsAll(sub));
Collections.shuffle(sub,random);
System.out.println("shuffle subList: "+sub);
System.out.println("12: "+intLists.containsAll(sub));
List copy = new ArrayList(intLists);
sub = Arrays.asList(intLists.get(1),intLists.get(4));
System.out.println("sub: "+sub);
copy.retainAll(sub);//交集操作,保留所有copy与sub相同的元素,这样子看来应该还是sub
System.out.println("13: "+copy);
copy = new ArrayList(intLists);
copy.remove(2);
System.out.println("14: "+copy);
copy.removeAll(sub);//移除sub的元素
System.out.println("15: "+copy);
copy.set(1, 99);//和之前的add方法不同的是,add是在这个位置增加一个元素,而set方法是在指定位置Replace an element
System.out.println("16: "+copy);
copy.addAll(sub);//再把sub添加回来
System.out.println("17: "+copy);
System.out.println("18: "+intLists.isEmpty());//判断是否为空
intLists.clear();//清空容器
System.out.println("19: "+intLists);
System.out.println("20: "+intLists.isEmpty());
intLists.addAll(Arrays.asList(6,5,4,3,2,1));
System.out.println("21: "+intLists);
Object[] o = intLists.toArray();
System.out.println("22: "+o[3]);
Integer[] array = intLists.toArray(new Integer[0]);//toArray方法,作用是把任意的Collection转换成一个数组,无参的时候返回一个Object类型的数组,有参数的时转为与参数同类型的数组,(假如这个参数(数组)能通过参数类型检查)
System.out.println("23: "+array[3]);
}
}
实现结果:
关于java.util.Random这个类,构造函数中Random()包括无参和有参Random(seed),有参构造方法的种子有何作用 在另一篇文章中有说明
List的两种实现方式ArrayList和LinkedList,顾名思义一个底层为数组,另一个底层为链表。
具体的区别,点击这篇文章http://blog.csdn.net/qq_37935670/article/details/79594159