这是我第一次写博客,学习java之路相通过写博客记录下来,如果描述有错误,请多多指导!
1.1 集合的演变
早期java中只有3个集合类,分别为Vector类,Hashtable类和Stack类。这3个类提供了基本的集合功能,但并不令人完全满意。该方案没有足够的灵活性让我们实现多种情况的功能,所有方法都是同步方法,用于保证线程安全性,但这也造成了性能损失。
但Java5后出现了另外一个重大的变化,新增特性甚至改变了集合类的使用语法。
java5之前,集合中中无法直接添加基本类型值,例如,添加int值时必须先将其封装在相应Integer包装器的实例中。不过。自从java5引入名为 自动拆箱/装箱的特性,我们并不需要手动封装在相应的Integer包装器的实例中,由IDE自动为我们完成,我们并不会看到该过程。
Map map=new HashMap(); //java1.5之前,添加int值必须先将其封装在相应的Integer包装器的实例中 map.put("one", new Integer(1)); //自动为我们装箱 map.put("two", 1);
1.2 集合类与接口
添加到集合中的对象称为元素(element),一些集合类允许存在重复元素,而一些事不允许的。这里的重复是指用equals()方法比较2个元素,如果返回值为true,则重复,否则相反。
1.21 Collection
集合类层次结构的最顶端是Collection接口,大部分集合类实现经常用到该接口中的方法。
如果想访问集合元素,可通过iterator()方法访问,并指出该方法返回的对象实现了Iterator接口,也就是iterator()方法返回一个Iterator对象,使用该对象提供的方法我们就能依次读取对象中的集合。
List<Student> list=new ArrayList<Student>(); Student student1=new Student(); student1.setStuName("小瀚"); student1.setStuAge(20); Student student2=new Student(); student2.setStuName("小瀚"); student2.setStuAge(20); list.add(student1); list.add(student2); //得到当前Iterator对象 Iterator<Student> it=list.iterator(); //提示迭代器是否已经返回集合中所有对象的引用 while(it.hasNext()){ //返回指向集合中下一个对象的应用 Student stu=it.next(); System.out.println(stu.getStuName()+" "+stu.getStuAge()); }
1.22 List
集合类的其中一个特点是对集合中元素进行有意义的排序,List接口定义了这种排序,也就是说,如果使用List实现并检索元素的引用,那么返回元素的顺序是可以预订的,该顺序是是由元素在集合中的位置决定的,并且在添加元素的时候可以显示或隐式地指定元素位置。下面我使用如下代码来演示下
List<Student>stuList=new ArrayList<Student>(); stuList.add(new Student(123,"小瀚",22)); stuList.add(new Student(456,"小露",22));
代码中姓名为 小瀚 的对象占用列表的第一个位置,也就是索引0,而 小露 对象占用第二个位置,也就是说,如果没有显示指定元素的位置,则element插入到末尾。相反,如果我们指定特定位置,可以写Demo试试看
List<Student> list=new ArrayList<Student>(); Student student1=new Student(); student1.setStuName("小瀚"); student1.setStuAge(20); Student student2=new Student(); student2.setStuName("小露"); student2.setStuAge(20); Student student3=new Student(); student3.setStuName("小miss"); student3.setStuAge(20); list.add(student1); list.add(student2); list.add(1,student3); //得到当前Iterator对象 Iterator<Student> it=list.iterator(); //提示迭代器是否已经返回集合中所有对象的引用 while(it.hasNext()){ //返回指向集合中下一个对象的应用 Student stu=it.next(); System.out.println(stu.getStuName()+" "+stu.getStuAge()); }
输出结果为:
小瀚 20
小miss 20
小露 20
list.add(1,student3);
该add()重载调用中,第一个参数表示该Student对象插入到列表中对应的索引1的位置,该位置原来由 小露 对象占用,执行这段代码后,新增的对象会插入到集合中的2个原有对象之间,因此 小露对象的索引变成了2。
还有另外一个方法,set()方法,与add类似,不过set()方法使用来替换指定位置的当前对象。
List接口不但定义了带索引未知的add()方法,还包含按索引移除对象的remove()方法,如下代码
stuList.remove(0);
这样将移除索引位置0上的对象,也就是小瀚这个对象,移除集合的第一个元素,其他对象索引由于移位操作而向下移位。remove()方法内部原理应该是这样的吧,调用remove()方法会依次查找整个列表并将列表中的每一个元素与传入该方法的对象相比较,如果List中包含的元素不多,或需要移除的element位置靠前,那么过程很快,但是,如果List较大或是比较靠后,那么需要多次遍历和比较才能找到对应的对象,并移除掉。不只是remove()方法是这样的,例如Collection接口中定义的contains()方法和indexOf()方法都有此限制。
1.23 ArrayList
ArrayList的一些特质,如下
(1)ArrayList中能够包含重复的元素
(2)ArrayList中能够添加空值
(3)ArrayList类不是固有线程安全,因此在创建多线程使用ArrayList时,需要自行负责同步对ArrayList的修改。
这是我学java的第一篇博客,不对的地方请多多指教!