黑马程序员<a href="http://www.itheima.com" target="blank">java培训</a>

                    第十六天代码

1.数据结构

数据结构:用来存储数据的方式

常见的数据结构:堆,栈,队列,数组,树

2.数据结构之栈和队列

栈:先进后出

队列:先进先出

3.数据结构之数组和链表

数组:在内存中拥有一片连续的区域。内存地址是连续的。

       特点:查询速度快,添加或删除操作性能比较低

  链表:它在内存中不是连续的区域,它是通过一个一个的节点连接起来,在节点中存储数据和下一个节点的地址,形成一个链。

        特点:查询速度慢,添加或删除性能高

注意:数组长度能不能改变(可变数组)

  1. 先创建一个新数组,它比old数组长度长
  2. 将old数组中的元素copy到新数组中
  3. 将原来指向old的引用重新指向新数组
  4. Arraylist:

4.List的三个子类特点

ArrayList底层就是使用数组实现。

特点:查询性能高,插入或删除性能低

  1. LinkedList

LinkedList底层是用链表实现。

特点:查询性能低,插入和删除方便

  1. Vector

Vector底层也是使用数组实现

在实际开发中现在已经不适合Vector

  1. ArrayList和Vector的区别

ArrayList是异步的-------安全性差,性能高

Vector是同步的-------安全性高,性能低

 

 

 

5.ArrayList存储字符串并遍历

  1.ArrayList有三种遍历方式,传统的for遍历,iterator遍历,listIterator遍历

  代码演示:

 


//ArrayList存储字符串并遍历
public class ArrayListDemo1 {

public static void main(String[] args) {
// 1.创建一个ArrayList集合
ArrayList list = new ArrayList();
// 2.向集合中添加元素 String
list.add("tom");
list.add("fox");
list.add("james");
// 3.遍历list集合
// 第一种
for (int i = 0; i < list.size(); i++) {
String s = (String) list.get(i); //强制转换
System.out.println(s);
}

// 第二种
for (Iterator it = list.iterator(); it.hasNext();) {
String s = (String) it.next(); //强制转换
System.out.println(s);
}

// 第三种
for (ListIterator lit = list.listIterator(); lit.hasNext();) {
String s = (String) lit.next();//强制转换
System.out.println(s);
}

 

6.Arraylist存储自定义对象并遍历

 

//向ArrayList中存储三个Student对象,并遍历
public class ArrayListDemo2 {

    public static void main(String[] args) {
        // 1.创建ArrayList
        ArrayList list = new ArrayList();
        // 2.向集合中添加元素
        list.add(new Student(1, "tom", "男"));
        list.add(new Student(2, "fox", "男"));
        list.add(new Student(3, "kobe", "男"));
        //3.遍历集合
        //在开发中我们一般使用比较多的方式是1.for+size+get   2.Iterator
        
        //3.1使用for+size+get
        
        // for (int i = 0; i < list.size(); i++) {
        // Student s=(Student)list.get(i); //集合中是什么类型,我们在使用时就转换成什么类型
        // System.out.println(s.getId()+"  "+s.getName());
        // }
        
        //3.2迭代器
        for(Iterator it=list.iterator();it.hasNext();){
            Student s=(Student)it.next();
            System.out.println(s);
        }
    }
}

 

7.Vector的特有功能

Vector它与ArrayList使用方式一样,现在开发中应用比较少了

对与Vector它有一些特殊的方法:

8.Linkedlist的特有功能

LinkedList底层实现是链表。 在API中我们知道 LinkedList可以直接对头元素或尾元素进行 get,remove,insert操作

//LinkedList介绍
public class LinkedListDemo1 {

    public static void main(String[] args) {
        // 1.创建一个LinkedList
        LinkedList ll = new LinkedList();
        // 2.向集合中添加元素
        ll.add("a");
        ll.add("b");
        ll.add("c");
        ll.add("d");

        // 3.遍历
        // for(Iterator it=ll.iterator();it.hasNext();){
        // String s=(String) it.next();
        // System.out.println(s);
        // }
        //
        // for(int i=0;i<ll.size();i++){
        // System.out.println(ll.get(i));
        // }

        // System.out.println("获取头元素:"+ll.getFirst());
        // System.out.println("获取尾元素:"+ll.getLast());

        // ll.removeFirst(); //将头元素remove
        // System.out.println(ll);

        // ll.removeLast(); //将尾元素remove
        // System.out.println(ll);
        
//        ll.addFirst("first"); //添加头元素
//        System.out.println(ll);
        
        ll.addLast("end");
        ll.add("e");
        System.out.println(ll);

    }
}
/**
 * LinkedList底层实现是链表。 在API中我们知道 LinkedList可以直接对头元素或尾元素进行 get,remove,insert操作.
 * 
 * 对头尾元素进行get操作. getFirst getLast 对头尾元素进行remove操作 removeFirst removeLast
 * 对头尾元素进行insert操作 addFirst addLast
 * 
 */

 

9.泛型概述和基本使用

用来约束集合数据的类型,是jdk1.5以后提供的一个新功能。

优点:

不需要强制转换

将原来在运行阶段产生的问题,拿到编译阶段来解决问题

在设计阶段更加方便

 

12.ArrayList存储字符串并遍历泛型

如果使用了泛型,get方法可以直接得到对应的类型。

如果使用泛型,使用Iterator时也需要指定泛型,这样在使用next时不需要强转

 

 

13.泛型类的概述及使用

 在类上声明的泛型

格式    class 类名<T>

注意:在类上声明的泛型,可以在类的成员上使用

简单说,就是可以在类的成员方法,成员变量上使用.

静态成员上不能使用.

 

14.泛型方法的概述及使用

    在方法上声明泛型,格式

         修饰符 <类型> 返回值类型  方法名(参数。。。){

注意:泛型要在返回值类型前。

 

问题:在方法上声明的泛型,它可以在哪些位置使用?

  1. 在方法外可不可以使用?

不可以使用,作用域问题

  1. 只能在方法上使用,那么在方法哪些位置上可以使用?

a)        参数上可以使用

b)        在返回值类型上也可以使用

c)         在方法体内部可以使用。

注意:一般情况下,都是方法的返回值类型或方法的参数使用。

15.泛型高级之通配符

三种通配符:

对”?”通配符它有三种用法:

         第一种:  List<?> 匹配任意类型

         第二种:  ? extends E  通配的是E类型或E的子类类型

         第三种:  ? super E 通配E类型或E的父类型。

 

16.增强for循环

作用:对容器进行遍历

格式:for(类型 引用:容器)

优点:比传统的for循环简单方便

缺点:不能对集合的数据进行精确的控制。

问题:什么样的容易可以被增强for(foreach)来操作

       只有实现了Iterable接口的容器才可以被foreach操作

问题:增强for对集合进行遍历时,它的原理是什么?

      它的底层就是你使用Iterable

思考题:使用增强for可不可以遍历

17.静态导入

Jdk1.5提供的一个新功能。

格式:import .static 包名.类名

作用:在使用静态成员的时候,不用类名.方法

缺点:

不利于阅读代码

方法名相同时可能引起冲出

18.可变参数的概述和使用

格式:方法名(类型…名称)

使用时可以传递参数,也可以不传递参数。

注意事项:可变参数的后面不可以有其他参数。一个方法里面有且仅有一个可变参数。

    优点:对程序进行优化,简化代码。

Array工具类中的asList的使用

使用的注意事项:

1如果操作的是基本数据类型的数组,那么它是将数组作为集合的元素。

2.如果list集合是由数组转换过来的,不可以使用集合中改变长度的方法。

posted on 2015-04-15 23:53  星之钥匙  阅读(96)  评论(0编辑  收藏  举报