Java学习札记——集合框架一
2013-04-26 21:37
302 查看
---------------------超人学院hadoop、spark、storm大数据--------------------
一、什么是集合?
Java JDK 有两个很容易搞混的东东,一个是接口Collection,另一个是类Collections。
Collection是最基本的集合接口,一个Collection代表一组Object对象,即Collection的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些
collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
所有实现Collection接口的类都必须提供两个标准的 构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这
个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator();//获得一个迭代因子
while(it.hasNext()) {
Object obj = it.next();//得到下一个元素
}
由Collection接口派生的两个接口是List和Set。
常见的集合组成
Cololection
|——List:元素是有序的,元素可以重复,因为该集合体系有索引
| |——ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步。
| |——LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
| |——Vector:底层是数组数据结构。线程同步。被ArrayList代替了。
|
|——Set:元素师无序的,元素不可以重复。
先来看List接口:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector。
List子类共有的一些方法:
增
add(index , element);
addAll(index,Collection);
删
remove(index)
改
set(index,element);
查
get(index);
subList(from,to);
listIterator();
以ArrayListList为例说明:代码很简单,掩饰ArrayList的一些基本方法
相比于List的有序,Set则是无序集合。
|--Set:元素师无序(存入取出是无序的),元素不可以重复
|--HashSet:底层数据结构式哈希表
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成的。
如果元素的HashCode相同。才会判断equals是否为true
如果元素的HashCode不同,不会调用equals、
注意:对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashCode和equals方法。
ArrayList判断元素是否相同依赖的是equals(),HashSet判断元素是否相同先依赖hashCode再依赖equals。
|--TreeSet:
Set集合的功能和List是一样的。
自不多说,举一例说明:
在学习,集合的时候,老师还讲了一个很重要的概念,泛型!
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处
1、将运行时期出现的问题ClassCastException。转移到了编译时期, 方便与程序员解决问题,让运行时期减少问题
2、避免了强制转换的麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型。
其实<>就是用来接收类型的。
当时用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
举一个例子说明:演示了泛型的使用。
明天完成接下来的Map和Collections工具类。
一、什么是集合?
Java JDK 有两个很容易搞混的东东,一个是接口Collection,另一个是类Collections。
Collection是最基本的集合接口,一个Collection代表一组Object对象,即Collection的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些
collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
所有实现Collection接口的类都必须提供两个标准的 构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这
个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator();//获得一个迭代因子
while(it.hasNext()) {
Object obj = it.next();//得到下一个元素
}
由Collection接口派生的两个接口是List和Set。
常见的集合组成
Cololection
|——List:元素是有序的,元素可以重复,因为该集合体系有索引
| |——ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步。
| |——LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
| |——Vector:底层是数组数据结构。线程同步。被ArrayList代替了。
|
|——Set:元素师无序的,元素不可以重复。
先来看List接口:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector。
List子类共有的一些方法:
增
add(index , element);
addAll(index,Collection);
删
remove(index)
改
set(index,element);
查
get(index);
subList(from,to);
listIterator();
以ArrayListList为例说明:代码很简单,掩饰ArrayList的一些基本方法
/* 1、add方法的参数类型是Object,一边与接收任意类型的对象。 2、集合中存储的都是对象的引用(地址) 3、什么是迭代器?其实就是集合的去除原生的方式。
*/ class ArrayListDemo { public static void main(String[] args) { //base_method_2(); method_get(); } public static void method_get() { ArrayList al = new ArrayList(); //1、添加元素 al.add("java01");//add(Object obj) al.add("java02"); al.add("java03"); al.add("java04"); /* Iterator it = al.iterator();//获取迭代器,用于去除集合中的元素 while(it.hasNext()) { sop(it.next()); } */ for(Iterator it = al.iterator();it.hasNext() ;) { sop(it.next()); } } public static void sop(Object obj) { System.out.println(obj); } public static void base_method_2() { ArrayList al1 = new ArrayList(); al1.add("java01");//add(Object obj) al1.add("java02"); al1.add("java03"); al1.add("java04"); ArrayList al2 = new ArrayList(); al2.add("java03");//add(Object obj) al2.add("java04"); al2.add("java05"); al2.add("java06"); //al.retainAll(a2);//取交际,al中只会保留和a2中相同的元素 al1.removeAll(al2); sop("al1:"+ al1); sop("al2:"+ al2); } public static void base_method() { //创建一个集合容器,使用Collection接口的子类,ArrayList ArrayList al = new ArrayList(); //1、添加元素 al.add("java01");//add(Object obj) al.add("java02"); al.add("java03"); al.add("java04"); //打印原集合 sop(al); //2、获取个数,集合长度 sop("size: " + al.size()); //3、删除元素。 sop("------------修改后的集合-------"); al.remove("java02"); sop(al); sop("size: " + al.size()); sop("------------修改后的集合1-------"); //al.clear() //4、判断元素 sop("java03是否存在?" + al.contains("java03")); sop("集合是否为空?" + al.isEmpty()); } }
相比于List的有序,Set则是无序集合。
|--Set:元素师无序(存入取出是无序的),元素不可以重复
|--HashSet:底层数据结构式哈希表
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成的。
如果元素的HashCode相同。才会判断equals是否为true
如果元素的HashCode不同,不会调用equals、
注意:对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashCode和equals方法。
ArrayList判断元素是否相同依赖的是equals(),HashSet判断元素是否相同先依赖hashCode再依赖equals。
|--TreeSet:
Set集合的功能和List是一样的。
自不多说,举一例说明:
class HashSetTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { HashSet hs = new HashSet(); hs.add(new Person("a1",30)); hs.add(new Person("a2",31)); hs.add(new Person("a3",32)); hs.add(new Person("a4",34)); // hs.add(new Person("a2",31)); sop("a1:" + hs.contains(new Person("a5",30))); hs.remove(new Person("a3",32)); for(Iterator it = hs.iterator();it.hasNext();) { Person p = (Person)it.next(); sop(p.getName() + " ... " + p.getAge()); } } } class Person { private String name; private int age; Person(String name , int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public String toString() { return this.name + " ... " + this.age; } public int hashCode() { System.out.println(this.name + " **** " ); return name.hashCode() + age * 39;//乘以29是为了尽量为了保证hash值的唯一性。 } public boolean equals(Object obj) { if(!(obj instanceof Person)) return false; Person p = (Person)obj; System.out.println(this.name + " ------ " + p.name); return this.name.equals(p.name) && this.age == p.age; } }
在学习,集合的时候,老师还讲了一个很重要的概念,泛型!
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处
1、将运行时期出现的问题ClassCastException。转移到了编译时期, 方便与程序员解决问题,让运行时期减少问题
2、避免了强制转换的麻烦。
泛型格式:通过<>来定义要操作的引用数据类型。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型。
其实<>就是用来接收类型的。
当时用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
举一个例子说明:演示了泛型的使用。
class GenericDemo { public static void main(String[] args) { TreeSet<String> ts = new TreeSet<String>(new LenComparator()); ts.add("abcd"); ts.add("cc"); ts.add("cba"); ts.add("aaa"); ts.add("z"); ts.add("hahaha"); for(Iterator<String> it = ts.iterator();it.hasNext();) { String s = (String)it.next(); System.out.println(s); } } } class LenComparator implements Comparator<String> { public int compare(String o1 , String o2) { int num = new Integer(o2.length()).compareTo(new Integer(o1.length())); if(num == 0) return o1.compareTo(o2); return num; } }
明天完成接下来的Map和Collections工具类。
相关文章推荐
- Java学习札记——集合框架二 Map
- Java学习札记20:Java程序员集合框架面试题
- Java集合源码学习(一)集合框架
- Java集合与框架总结与学习
- Java集合框架学习(十二) Arrays类详解
- java 集合框架学习总结
- 黑马程序员----Java集合框架学习笔记2 Map-工具类-泛型
- java学习日记_83:集合框架之JDK5的特性
- 黑马程序员--Java学习笔记之集合框架
- Java学习第15-16天:集合框架之Map和泛型(半壁江山了)
- Java集合与框架总结与学习
- (38)Java学习笔记——集合框架 / Collections工具类
- JAVA学习第四十四课 — 集合框架工具类(二)
- JavaSE入门学习38:Java集合框架之迭代器
- java大数据学习笔记(三) 集合框架
- java学习--集合框架
- java学习笔记之集合框架
- 【Java学习笔记】14.集合框架和泛型
- Java集合与框架总结与学习
- java 集合框架再学习