集合框架
弥补了数组不能动态的缺陷并且提供更加强大的存储数据的功能。
映射 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实现类按照你插入的数据来排序