------http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:ArrayList集合类
(集合中的元素通过get方法取出使用时要强制类型转换,不然不能使用)
1).是一个具体的类继承于List,底层的数据结构是数组,查找快,增删慢,线程不安全,效率高。
2).没有特有方法,都是使用的父接口中定义的;
3).实例:
A:存储字符串并遍历
public class Demo {
public static void main(String[] args) {
//1.定义一个ArrayList
ArrayList list = new ArrayList();
//2.填充集合
list.add("章子怡");
list.add("高圆圆");
list.add("刘亦菲");
list.add("夏添");
//尝试存储重复元素;
list.add("夏添");
list.add("刘亦菲");
//3.遍历的方式:三种:1.toArray();2.迭代器;3.List接口-->get(int index)
//1.toArray();
Object[] objArray = list.toArray();//★★★
for(int i = 0;i < objArray.length ; i++){
String s = (String)objArray[i];
System.out.println(s);
}
System.out.println("*******使用迭代器***********");
//2.迭代器
Iterator it = list.iterator();//用ListIterator也可以;
while(it.hasNext()){
String s = (String)it.next();
System.out.println(s);
}
System.out.println("******使用for循环***********");//取出时的顺序和存入时的顺序是一样的。
//3.结合:Collection的size()和List的get()方法,使用for循环
for(int i = 0;i < list.size() ; i++){
// String s = (String)list.get(i);
// System.out.println(s);
Object o = list.get(i);
System.out.println(o);
}
//4.直接打印Arraylist的引用
System.out.println("************直接打印引用*********");
System.out.println(list);//打印结果是[章子怡, 高圆圆, 刘亦菲, 夏添, 夏添, 刘亦菲]
} //
}
B:存储自定义对象并遍历
public class Student {
String name;
int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override //重写student类的tostring()方法:使其打印其引用的时候,
//可以返回的是其对象的内容,而不是以前的那种地址值
public String toString() {
return "Student [姓名=" + name + ", 年龄=" + age + "]";
}
}
public class Demo {
public static void main(String[] args) {
//1.定义一个ArrayList
ArrayList list = new ArrayList();
//2.填充集合
list.add(new Student("刘亦菲",20));
list.add(new Student("夏添",22));
list.add(new Student("高圆圆",24));
list.add(new Student("章子怡",26));
//尝试存储重复值的对象:
list.add(new Student("章子怡",26));
//3.使用for遍历
for(int i = 0; i < list.size() ; i++){
//为什么要强转?我们要访问Student内的特有成员
// Student stu = (Student)list.get(i);
// System.out.println(stu.name + "," + stu.age);
//Student重写toString()后:
System.out.println(list.get(i));
//println在使用的时候会默认的调用所要打印的对象的tostring()方法,
//如果,此对象所在的类重写了tostring()方法,就按照重写的打印,否则就按照objct类中的打印。
}
}
}
Vector类:
1).底层数据结构也是数组,同样查找快,增删慢。但是是线程安全,可效率不高。
2).是list的子类,具有list和collection的所有方法
3)特有的方法:
public void addElement(Object obj):向集合添加一个obj(引用型的元素),添加到集合的末尾;
public Object elementAt(int index):获取指定索引上的元素,作用等同于:List-->get(int index);
public Enumeration elements():返回一个枚举
LinkedList类:
1).底层数据结构是“链表”,查找慢,增删快
2).线程不安全,效率高
3).特有方法:
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
4).如果将LinkeList作为链表使用:(先进后出)
A.使用addFirst()进行添加;
使用get(int index)进行获取;
B.使用addFirst()进行添加;
使用getFirst()获取;
使用removeFirst()移除第一个元素;
C.使用add(Object o)进行添加;
使用getLast()进行获取
使用removeLast()移除最后的元素;
如果将LinkedList作为普通的集合使用:(先进先出)
使用add()添加;
使用get()获取;
LinkedList list = new LinkedList();
list.add("章子怡");
list.add("张三丰");
list.add("张学友");
for(int i = 0;i < list.size(); i++){
System.out.println(list.get(i));
}
二、list集合的练习
1).去除集合中字符串的重复值(字符串的内容相同)
方式一:
* 1.跟之前我们做的一个练习:获取20个不重复的随机数思路差不多;
* 2.开辟一个新集合。
* 3.遍历原集合,并获取每一个元素;
* 4.在新集合中判断,是否存在该元素,
* 如果不存在,则存储到新集合中;
* 如果存在,就取下一个元素;继续遍历
*/
public class Demo
{
public static void main(String[] args){
ArrayList list=new ArrayList ();
list.add("刘亦菲");
list.add("王菲");
list.add("章子怡");
list.add("章子怡");
list.add("刘亦菲");
ArrayList list2=new ArrayList<>();
//遍历第一个容器
for (int i=0;i
方法二:
1.在原集合上进行遍历,并判断;
2.将每个元素,依次和它后面的每个元素进行比较;
3.如果发现重复,将把后面的元素删除掉;
注意:删掉元素后,集合的大小将立即发生改变;将循环变量减1;
ArrayList list=new ArrayList();
for(int i=0;i
public class Demo {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add(new Student("高圆圆",32));
list.add(new Student("赵翠翠",28));
list.add(new Student("赵梅香",27));
list.add(new Student("张慧慧",25));
list.add(new Student("赵梅香",27));
//定义一个新的集合
ArrayList list2=new ArrayList<>();
//list2.add(list.get(0));
for(int i=0;i
方法二:
public class Demo {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
list.add(new Student("高圆圆",32));
list.add(new Student("赵翠翠",28));
list.add(new Student("赵梅香",27));
list.add(new Student("张慧慧",25));
list.add(new Student("赵梅香",27));
System.out.println("移除之前打印"+list);
//创建循环
for(int i=0;i
3)使用LinkedList模拟栈结构
A.要求:自定义一个集合类;
B.这个集合类要模拟栈的结构:先进后出
C.自定义的集合类,内部可以使用LinkedList实现
public class Demo {
public static void main(String[] args) {
//1.先实例化一个自定义的集合,它就相当于LinkedList
MyLinkedList list = new MyLinkedList();
//2.填充元素:
list.addFirst("aaa");
list.addFirst("bbb");
list.addFirst("ccc");
//3.提取元素,看是不是会先进后出
Object o = list.getFirst();
System.out.println(o);
o = list.getFirst();
System.out.println(o);
o = list.getFirst();
System.out.println(o);
}
}
public class MyLinkedList {
private LinkedList linkedList = new LinkedList();
//实际上就是模拟linkedlist的三中方法:添加,获取,长度
//不过由于获取是按照栈结构,要先进后出。
//模拟LinkedList的行为:addFirst();
public void addFirst(Object obj){
this.linkedList.addFirst(obj);
}
//模拟LinkedList的getFirst();
//java.util.LinkedList的getFirst()方法只获取第一个元素,但不做其他操作,每次获取的都是相同的元素;
//这里我们进行一下改进,每次获取完第一个元素后,将第一个元素删除掉;
public Object getFirst(){
//先取出第一个元素;
Object obj = this.linkedList.getFirst();
//删除掉第一个元素
this.linkedList.removeFirst();
//将刚刚获取的第一个元素返回
return obj;
}
//要遍历这个集合,还得提供一个size()方法
public int size(){
return this.linkedList.size();
}
}