JAVA语言基础:集合框架Collection 和Map

原创
2017/09/22 16:17
阅读数 62

集合框架

弥补了数组不能动态的缺陷并且提供更加强大的存储数据的功能。

映射 map

集合框架分两个概念: Collection 和Map

Collection是一种接口 下面的子接口有List,Set等

List接口 会按照插入的顺序排序。Set是无序的。并且不会有重复的元素。相同的元素会被覆盖。

Map也是一种接口,用来存储一系列的键值对的对象。

import java.util.List;位于util包下

List是接口不能new对象,必须通过他的实现类来new对象。

List的实现类有 ArrayList 同样是util报下的一个实现类,

通过ArrayList 实现类new出来对象后,就可以使用对象点出方法add来存入数据了。

例如:List list=new ArrayList(); new一个对象list 相当于一个数组一样。

 list.add(56);  对象点出add方法,存入一个数据,可以是任何类型。

如果知道这个new出来的对象list的长度呢?

直接使用list点出方法size 就可以知道目前的长度了,这个对象数组的长度会根据你存入数据的多少来不断变化。

记住数组的.length是属性。这里的.size是方法。别弄混淆。

list这个对象数组如果来取出存入的值呢?我们知道数组是通过下标来定位元素。list对象做什么都是通过方法来做到。

list.get();方法来取值。()中其实也是输入一个下标来定位数据。假如我们要取第一个值那么()中就是0.第二个就是1

现在值取到了。我们用什么数据类型来接收呢?返回的是什么类型我们只能用什么类型来接收。

Object a=list.get(0); Object 任何类型。所有类型的总称。

如果需要把这个存入的Object数据强制转换为int型。那么我们就需要int的包装类来强制转换

Integer a=(Integer)list.get(0);

打印的时候默认调用toString方法

有些时候我们使用ArrayList实现类的时候会遇到一些强制转换的错误。 特别是用循环取值的时候。因为存入的数据有很多种数据类型。

所有jad就提供一种限定数据类型的方式叫做:【泛型】

定义泛型格式。

ArrayList<Integer>list=new ArrayList<Integer>();

泛型就是限定了这个对象只能存入Integer的数据类型。

打印的值就add按照顺序存入的值。

对象得点出方法才会打印你需要的值

List 作为一个接口 它当然有一些方法

除了我们刚刚使用的add get等等方法外还有 isEmpty clear contains indexOf 等等。。。

indexOf 这个方法用来取存入值的下标。如果为-1就表示不存在和contains有同样的判断一个数据中是否有其中一个数据

addall 这个方法导入另一个对象中存入的所有数据。 isEmpty is开头的方法都是会返回一个布尔值的。这里也不例外 来检验一个对象是否为空。ture表示就是空的。flase就是有数据

clear 这个方法就是清楚对象中存入的所有值

contains 这个方法用来判断存入的数据中是否有其中一个数据

lastIndexOf 有相同两个元素的时候,使用这个方法取最后一个元素的下标

Set 接口 它是无序的,并且不会有重复的数据 同样使用泛型

它的实现类有HashSet

new一个对象 Set <Integer> set=new HashSet<Integer>(); 其实set是有序的,只不过不是你存入进去的数据所排列的序。

set不可以使用get下标来取值,也就是说不可以用for的常规方式取值。只能使用for的加强版

equals 方法比较2个字符串是否相同 Object包下

String username="天天看到你"; System.out.println(username.equals("天天看到你"));

我们在类中加入equals方法和hashCode两个方法

public boolean equals(Object Obj) { System.out.println("调用了类student的equals方法"); return true;

} public int hashCode(){ System.out.println("调用了类student的hashcode方法"); return 1; }

new出对象后HashSet会默认调用这2个方法.来比较里面的元素是否是同一个元素

我们可以改变HashSet默认比较2个元素的方式达到我们想要的目的。

Set 虽然是无序的,但是我们可以使用API提供的TreeSet实现类来重新排序

Set 接口下的另一个实现类 刚刚我们学习的HashSet

同样没有get方法点出里面的元素,不过我们可以自定义规则来排序

我们同样可以通过for循环的加强版来排序。不过我们可以自定义规则来排序

通过实现这个Comparator接口来定义规则

重新定义一个类,实现这个Comparator接口的方法。

重写方法后,new出来对象。TreeSet实现类new出对象后在()内加入通过实现Comparator接口的类new出来的对象名就会自动调用Comparator方法。实现我们自定义的排序

        public static void main(String[] args) {
	
            Integertest inte=new Integertest();
	
	Set<Integer>tree=new TreeSet<Integer>(inte);

以下这段代码的意思是:如果第一个数比第二个数小就返回一个正数。大的数就自动前移。反之返回一个负数,小的后移。。改成2或者-2一样效果 改变大于小于号。或者改名前面是-1后面是1都可以达到排序效果实现从大到小或者从小到大排序 if(o1<o2){ return 1; o1如果比o2小那就就返回一个大的数也就是返回o2

	}else{
		return -1;  反之返回o1小的数。
	}

TreeSet取值的时候如果是Integer包类型的数据元素,通过for循环的加强版来取值一切正常,可是如果是对象的话。那么你不定义一个类实现一个接口,然后new出对象加入到TreeSet的构造方法()中就会报错。

TreeSet 实现类下面可以有重复的数据

String 类下的length是方法 集合是size方法 只有数组的length是属性

面试的时候切记

Map 是一个键值对的结构 Map也是接口不过不是继承Collection

Map需要传入2个值 他最常见的实现类是HashMap

Map<Integer,String>map=new HashMap<Integer,String>();

map.put(6,"张理斌"); 泛型限制什么类型就用什么类型

前面的值key是键。后面的value才是值

集合类都有size

map取值不是通过下标来取值。而是通过key来得到值或者说是映射一个值

遇到这种键值对的时候就必须使用map

Map结构中同样的键会被覆盖掉。

map.put(90 ,"学生3"); map.put(90 ,"学生4");

后面的键会覆盖前面的。get键90只会打印学生4

map不能直接进行for来取值,需要把它转化为set然后for循环取值。

转换的书写方式是:

Set<Map.Entry<Integer,String>>map_set=map.entrySet();

for(Entry<Integer,String>ent:map_set){ System.out.println(ent.getKey()+":"ent.getValue().getName()); }

Entry也是一个接口。并且是Map的子接口内部接口

Entry用来描述map里面的每一个元素的。

Entry在很多包里面都有。我们为了反正调用错误很多时候需要把全包名写出来 以防掉错包!例如 Map.Entry 表示是map包下面的entry . 点出来

Student su=(Student)map.get(60); 新建一个对象su把map.get(60)的键

转换后排序为无序因为set本身就是无序。

为了输出的方便,一般情况下,要输出Map中的key 和 value 是先得到key的集合,然后再迭代(循环)由每个key得到每个value而Entry可以一次性获得这两个值

迭代器和循环一个意思。迭代式开发

集合框架的api提供的统一迭代功能List Set Map

迭代器对象iterator(迭代器的意思)也是接口 并且会带有泛型

迭代器用在while循环里面

while (it.hasNext()){ 判断是否有下一条 it是迭代器接口类下创建的对象 hasNext是迭代器里面的方法。 String item=it.next();

}

Set 下面的迭代器排序是无序的。。

Map使用迭代器的时候也需要用到Entry内部接口。如下:

Set<Map.Entry<Integer, Student>>mt=map.entrySet(); Iterator<Entry<Integer,Student>>student1=mt.iterator();

Map本身不是用来循环的。这里只是演示Map使用迭代器

Map用来缓存,把数据缓存到内存里面

提供一种统一的迭代方式 is has 开头的方法一般都是返回一个布尔值 java的命名规范

for(;it.hasNext();){ String item=it.next(); }

这里for循环和while一模一样

总结:

List:这个集合有序。而且便于随机访问元素,下面的ArrayList比较常用。但是对于插入和删除元素不方便,需要的话使用LinkedList

Set:HashSet是无序的,TreeSet可以自定义排序的规则,不可有重复数据。Set存储速度快

Map:键值对结构。可以根据KEY来获取值。键一样会被覆盖

LinkedList实现类按照你插入的数据来排序

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部