---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------
对于学习中发掘的问题,借鉴了老师视频中的讲解和演示资料,进行了部分归纳总结。
有利于在后面的学习中进行回顾,抓住重点。
希望自己和走过路过的朋友们都有些收获吧。
(1)集合的由来?因为面向对象的语言对事物的描述都是以对象体现,如果要对多个对象进行存储和遍历操作,
就需要用一个容器存储,而对象数组的弊端是长度固定,所以,为了符合要求,java就提供了
集合类供我们使用。
(2)集合和数组的区别?
A:集合
长度可以改变(这里的长度可变,是种动态的扩充,更为灵活)
只能存储对象类型
可以存储不同类型的对象
B:数组
长度固定(数组虽然没有集合这么广泛的应用,但是由其优势,在查询和简单数据操作上,效率较高)
可以存储对象类型,也可以存储基本类型
但是只能存储同一种类型的对象
(3)集合继承体系的由来?
由于数据结构不同,就会有多种集合的存在,而这多种集合本身有共性的内容,
通过不断的向上抽取,最终就形成了集合的继承体系结构。
Collection
|--List
|--ArrayList 数组列表
|--Vector 矢量
|--LinkedList 连串列表
|--Se
|--HashSet 无序
|--TreeSet 有序
针对一种继承体系,是如何学习和使用的呢?
学习:顶层,因为顶层定义的是共性内容。
使用:底层,因为底层才是具体的实现,而且具有在继承的基础上建立的独有方法。
A:添加功能// 补充,部分collection中,一些元素是被限制不能添加的。
add(Object obj)
B:删除功能 可以对collection上的一个对象进行操作,但是不能分拆。
remove(Object obj)
C:判断功能 使用这个方法,可以对判断是否已经存在这个值。
contains(Object obj)
D:迭代器功能
Iterator iterator()
E:长度功能
size()
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class StudentTest {
public static void main(String []args){
//第一步,建立集合对象,需要导入两个
Collection c = new ArrayList();
//创建对象
Student s1=new Student("黄药师",60);
Student s2=new Student("欧阳峰",60);
Student s3=new Student("段那啥",61);
Student s4=new Student("洪七公",70);
//添加到集合——————————————————————————————添加
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
//添加完数据,该进行遍历输出,迭代方法 也需要导入包。这里的c作为父类,可以引用子类的方法
// Iterator it = c.iterator();—————————————————————————————————
// while (it.hasNext()) {————————————————————————————这里是迭代的使用
// System.out.println(it.next());————————————————————————————
// }
//System.out.println("c:"+c.remove(s1));_______________________________删除。
// System.out.println("c:"+c.contains(s1));_______________________________比较
// System.out.println("c:"+c.size()); _______________________________集合的长度方法。
}
}
(5)迭代器:
迭代器就是遍历集合元素的一种方式,它依赖集合而存在。
Iterator
|--hasNext()
|--next()
List
(1)List的特点:
Collection
|--List
元素有序(存储顺序和取出顺序一致),元素可以重复
|--Set
元素无序,唯一
(2)List的特有功能:
A:添加
add(int index,Object obj)
B:删除
remove(int index)
C:获取
Object get(int index)
D:列表迭代器
ListIterator listIterator()
E:修改
set(int index,Object obj)
(3)List的案例:( 这个时候的遍历方式有两种 迭代器,普通for循环)
List存储字符串并遍历: List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
//迭代器
Iterator it = list.iterator();
while(it.hasNext())
{
String s = (String) it.next();
System.out.println(s);
}
//普通for循环
for(int x=0; x<list.size(); x++)
{
String s = (String)list.get(x);
System.out.println(s);
}
List存储自定义对象并遍历:
public class ListTest {
public static void main(String[] args) {
//1,创建集合对象,2,建立对象,3,添加元素,4,遍历;
List list = new ArrayList();
Student s1 = new Student("小兔子乖乖",3);
Student s2 = new Student("狼外婆坏坏",9);
list.add(s1);
list.add(s2);
Iterator it = list.iterator();
while(it.hasNext()){
Student s = (Student)it.next();
System.out.println(s);
}
}
}
(4)ListIterator的特殊用法:
A:可以逆向遍历,但是需要先正向遍历,一般不用。
B:并发修改异常
原因:在迭代器遍历的时候,不要使用集合修改集合本身。
解决方案:
A:使用迭代器遍历的时候,通过迭代器修改集合。
B:使用集合遍历,通过集合修改集合。
List集合的子类:
(1)List的子类特点:List
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
(2)到底使用谁?
根据需求看。
要安全吗:
要:Vector
不要:ArrayList,LinkedList
查询多:ArrayList
增删多:LinkedList
什么都不知道用ArrayList。
(3)ArrayList
案例:
A:存储字符串并遍历:
ArrayList<String> array = new ArrayList<String>();
array.add("hello");
array.add("world");
array.add("java);
//方式1
Iterator<String> it = array.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s);
}
//方式2
for(int x=0; x<array.size(); x++)
{
String s = array.get(x);
System.out.println(s);
}
//方式3
for(String s : array)
{
System.out.println(s);
}
(4)Vector
有特有功能,但是写法复杂,所以不使用。
(5)LinkedList
存储字符串并遍历:
public static void main(String[] args) {
// 创建集合对象
LinkedList<String> list = new LinkedList<>();
// 添加对象。
list.add("牛大胆 ");
list.add("大胆牛");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
}
Set
(1)HashSet存储元素和保证元素的唯一性
A:HashSet的底层数据结构是哈希表,保证元素的唯一性.
B:如何保证的呢?
它底层依赖两个方法:hashCode()和equals()。
顺序:
首先判断hashCode()是否相同:
是:继续equals()方法
返回false:说明集合中没有这个元素,添加
返回true:说明集合中有这个元素,不添加
否:直接添加到集合。
(2)HashSet存储字符串和自定义对象(同一个对象是根据需求)并遍历(掌握)
A:字符串
B:自定义对象(姓名和年龄都相同极为同一个人)
public class Student
{
private String name;
private int age;
//构造方法和get/set方法省略...
//自己在写一遍,以后就自动生成。
public int hashCode()
{
return this.name.hashCode()+this.age*13;
}
public boolean equals(Object obj)
{
if(this==obj)
{
return true;
}
if(!(obj instanceof Student))
{
return false;
}
Student s = (Student)obj;
return this.name.equals(s.name) && this.age == s.age;
}
}
(3)TreeSet存储字符串和自定义对象保证元素唯一性和排序
TreeSet的底层数据结构是二叉树。
是怎么保证的呢?
根据返回值是否是0来判断元素是否重复。
根据返回值是正数还是负数来判断元素该如何存储。
有几种方案:
元素具备比较性:
就是实现自然排序接口Comparable
集合具备比较性:
就是实现比较器接口Comparator
(4)TreeSet存储字符串和自定义对象(同姓名同年龄即为同一个人,按照年龄排序)并遍历(理解)
(5)LinkedHashSet:
请问这个集合是什么意思?
元素有序,唯一。
由链表保证元素有序,由哈希表保证元素唯一。
2:集合常见的数据结构:
(1)ArrayXxx 底层数据结构是数组,查询快,增删慢
(2)LinkedXxx 底层数据结构是链表,查询慢,增删快
(3)HashXxx 底层数据结构是哈希表,保证元素唯一依赖两个方法:hashCode()和equals()
(4)TreeXxx 底层数据结构是二叉树,保证元素唯一和排序:自然排序,比较器排序。
3:Arrays
(1)是操作数组的工具类
(2)使用功能
A:转字符串功能 public static String toString(int[] a)
B :排序 public static void sort(int [] a)
C: 查找 public static int binarySearch(int [] a )
方法都是静态的。
(2)
Arrays里面有一个把数组转成集合的方法 public static <T> List<T> asList(T... a)
注意:如果把一个数组的元素转出成了一个集合,不能对集合进行增删操作,但可以进行写该操作
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net