标签:
黑马程序员<a href="http://www.itheima.com" target="blank">java培训</a>
第十六天代码
数据结构:用来存储数据的方式
常见的数据结构:堆,栈,队列,数组,树
栈:先进后出
队列:先进先出
数组:在内存中拥有一片连续的区域。内存地址是连续的。
特点:查询速度快,添加或删除操作性能比较低
链表:它在内存中不是连续的区域,它是通过一个一个的节点连接起来,在节点中存储数据和下一个节点的地址,形成一个链。
特点:查询速度慢,添加或删除性能高
注意:数组长度能不能改变(可变数组)
ArrayList底层就是使用数组实现。
特点:查询性能高,插入或删除性能低
LinkedList底层是用链表实现。
特点:查询性能低,插入和删除方便
Vector底层也是使用数组实现
在实际开发中现在已经不适合Vector
ArrayList是异步的-------安全性差,性能高
Vector是同步的-------安全性高,性能低
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);
}
//向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); } } }
Vector它与ArrayList使用方式一样,现在开发中应用比较少了
对与Vector它有一些特殊的方法:
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 * */
用来约束集合数据的类型,是jdk1.5以后提供的一个新功能。
优点:
不需要强制转换
将原来在运行阶段产生的问题,拿到编译阶段来解决问题
在设计阶段更加方便
如果使用了泛型,get方法可以直接得到对应的类型。
如果使用泛型,使用Iterator时也需要指定泛型,这样在使用next时不需要强转
在类上声明的泛型
格式 class 类名<T>
注意:在类上声明的泛型,可以在类的成员上使用
简单说,就是可以在类的成员方法,成员变量上使用.
静态成员上不能使用.
在方法上声明泛型,格式
修饰符 <类型> 返回值类型 方法名(参数。。。){
}
注意:泛型要在返回值类型前。
问题:在方法上声明的泛型,它可以在哪些位置使用?
不可以使用,作用域问题
a) 参数上可以使用
b) 在返回值类型上也可以使用
c) 在方法体内部可以使用。
注意:一般情况下,都是方法的返回值类型或方法的参数使用。
三种通配符:
对”?”通配符它有三种用法:
第一种: List<?> 匹配任意类型
第二种: ? extends E 通配的是E类型或E的子类类型
第三种: ? super E 通配E类型或E的父类型。
作用:对容器进行遍历
格式:for(类型 引用:容器)
优点:比传统的for循环简单方便
缺点:不能对集合的数据进行精确的控制。
问题:什么样的容易可以被增强for(foreach)来操作
只有实现了Iterable接口的容器才可以被foreach操作
问题:增强for对集合进行遍历时,它的原理是什么?
它的底层就是你使用Iterable
思考题:使用增强for可不可以遍历
Jdk1.5提供的一个新功能。
格式:import .static 包名.类名
作用:在使用静态成员的时候,不用类名.方法
缺点:
不利于阅读代码
方法名相同时可能引起冲出
格式:方法名(类型…名称)
使用时可以传递参数,也可以不传递参数。
注意事项:可变参数的后面不可以有其他参数。一个方法里面有且仅有一个可变参数。
优点:对程序进行优化,简化代码。
使用的注意事项:
1如果操作的是基本数据类型的数组,那么它是将数组作为集合的元素。
2.如果list集合是由数组转换过来的,不可以使用集合中改变长度的方法。
标签:
原文地址:http://www.cnblogs.com/liman/p/4430701.html