1、什么是框架?--感性认识
【备注】: 图中 虚线为接口 实线为类 加粗为常用集合类;
collections:集合操作工具类 arrays:数组操作工具类;
collection: 是所有集合框架的根接口;(list【列表】、set【集】都是其的直接衍生;Map【映射】是间接衍生) 实现这些操作要去操作他们的具体实现类【Arraylist / linkedlist / hashset / HashMap / TreeMap】
**使用集合框架对象装数据【之ArrayList,LinkedList--专门替代数组的】:
1、两者和superArray具备相同的功能的封装;
2、方法研究 clear、 isEmpty 、contains、
3、ArrayList,在底层数据存储上使用的是数组形式,完成的还是对数组的封装;
LinkedList,在每个元素的前面增加指向上一个元素的地址;后面增加一个下一个元素的地址;在底层已经没有采用数组的存储形式了;
因此:在查找中(get动作)使用ArrayList的效率高;
在大量
增加尾部
数据中使用ArrayList的效率高;
在大量删除,减少,增加中使用LinkedList效率高;
内存存放的区别【图】:
//产生集合类的对象
Arraylist 1st = new ArrayList();
//使用结合类对象
//1、放入元素
1st.add("hello");
1st.add( new Date() );
1st.add( 10 );
//2、得到放了多少个元素
int flag = 1st.size();
//3、可以根据位置获取某个元素
打印(1st.get(0 - 1st.lenght ))
//4、可以根据位置修改某个元素
1st.set(3 , 250 )
打印(1st.get(3))
//5、可以根据位置删除某个元素
1st.remove(3 , 250 )
打印(1st.get(3)
//6、对list进行遍历:
①普通for循环;
有下标使用优势;
下面两个方式都没有下标;
②for-each遍历; for(Object obj : 1st ){
打印obj;
}
③
集合类专用方式:迭代器(Interator) //
jdk 1.5之后就都使用for-each了;
Interator it = 1st.interator() ; //获得1st所有对象到迭代器中 it;
while(it.hasNext()){
Object obj = it.next();
打印obj;
}
**使用集合框架对象装数据【之set】:
/* Set: 集,用的最少的集合;重复项自然而然被排除;
** 特点:
不能存放重复元素(彩球放入),
无序--外部放入的顺序不是内部存放的顺序,所以没有
下标;
**常用子类: HashSet
; 可以使用泛型,泛型可以使用指定类型数据和其子类;
【为何将HashSet能判断两个对象是否重复】-
-重写要写在对象的方法中的;
1、重写了equals
public boolean equals(Object arg0){
if(arg0 instanceof Student){
Student stu = (Student)arg0;
if( this.name.equals( stu.getName() ) &&
this.age == stu.getAge() &&
this.secore == stu.getsceore() ){
return true;
}
}
return flase;
}
2、重写了hashCode;
public int hashCode(){
int hashCode = 0 ;
char[] array = this.name.toCharArray();
for( int i = 0 ; i < array.length ; i++ ){
hashCode += array[i];
}
hashCode += array.length + this.age + this.secore ;
return hashCode;
}
//首先产生集合对象
HashSet<> set = new HashSet<>();
//使用上:
1、添加上一样
2、得到元素个数 set.size();
3、不可以根据位置获取某个元素【没有下标】
4、不可以修改某个位置的元素:【没有下标】
5、不可以根据位置来删除元素;【没有下标】
6、可以根据传入的对象删除Set集合中的重复对象;
set.remove(元素对象);
7、
只能for-each或者迭代器Itertor遍历的方式;
**使用集合框架对象装数据【之Map--映射】:
**特点:1、键值对 key-valce 队的方式保存数据---数据是成对存放的,每个元素除了有值还有一个唯一的键需要定义;
** 2、常用子类: HashMap、Properties;
//首先产生集合对象
HashMap map = new HashMap();
HashMap<K,V> map = new HashMap<K,V>();
//使用:
1、放入元素:
map。put(1,“hello”) 创建值是“hello” 键是1的第一个对象;
map。put(“hello“,5) 创建了值为5,键为”hello“的第二个对象;
2、得到元素个数
map。size();
3、取数据--要根据键来获取值
map.get(1) / map.get("hello")
4、修改元素--调用PUT,方法,需要放入相同的键;
map.put( 1,new Date() );
5、删除元素--调用remove,根据键进行删除;
map.remove("1") ;
///在获取和删除元素中传入的键不存在,不会报错,
危险!!
///在修改元素的时候,如何传入键在map中不存在,就直接变成增加新元素,
危险!!
首先要多判断 map.containsKey(“1”); 基本数据类型可以直接判断; 但是如果是
自定义类做键
,那么就要重写equals和 hashCode方法;
一般使用时间来做键 / / String来做键;
6、对Map进行遍历:
(一)、键遍历
1、Map不能直接遍历--因为Map里的每一条记录都是一对,无法用变量来装;
2、Map只能遍历所有的键或者所有的值;
Set keySet = map.keySet( ); //把map中所有的键取出来放在一个Set集合中;
特别注意:map有申明泛型为String类型,则keySet必须使用泛型为String;
不放在list的原因:1.无序特点; 2、不重复;
然后for-each遍历 keySet;
(二)、值遍历:
1、存放在Collection中;(刻意重复--set,无序--list)
Collection values = map.values();
特别注意:map有申明泛型为String类型,则keySet必须使用泛型为String;
然后使用 for-each遍历(包含迭代器);
三、Collections:
resort 自动排序
reverse: 反转
binarySearch:二分法搜索(必须是按大小顺序排列好的)
max、min
//跟排序有关的方法:---只能操作list集合;
在集合中的泛型只能是类的类型;不能是基本数据类型,使用基本数据类型可以是用包装类
1、自然排序:Collections.sort( 集合 ) ; 从小到大;
反转排序:Collections.reverse(集合);
浑牌排序:Collections.shuffle(集合):
2、显示结果:
for(集合类型 in :集合 ){
System.out.println( in );
}
3、Compare:
功能:比较器//定义排序规则,String实现了其接口;
实现接口,,