标签:list集合、泛型
*数据结构
*栈结构(先进后出,后进先出)
特点:进栈的方式叫压栈
出栈的方式叫弹栈
*队列(先进先出)
*数组(查询快,增删慢)
*链表结构
有很多链子将多个节点连接起来
每一个节点(数据):数据域(值)和指针域
对于列表来说都是从第一个元素对应的指针域依次进行查询(从头开始找)
*查询慢,增删快
*List集合的子实现类的一些特点
*ArrayList集合
*底层数据结构是数组;满足查询快,增删慢的特点
*从线程考虑是线程不安全的,不同步,执行效率高
*由于ArrayList集合是List集合的子类那么他的元素是可以重复的,并且存储和取出是一致的
package arraylist;
//下面代码会出现黄色警告,是由于没有使用泛型
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo {
public static void main(String[] args) {
//创建一个集合对象;注意导包
ArrayList al=new ArrayList();
al.add("hello");
al.add("world");
al.add("JavaSE");
al.add("hello");//可以出现重复的元素
//获取迭代器对象,遍历元素
Iterator it=al.iterator();
//判断是否有下一个要遍历的元素
while(it.hasNext()){
String str=(String)it.next();
System.out.println(str);
}
}
}//没有使用泛型:有可能会出现ClassCastException(类型转换异常)
*Vector集合
*底层数据结构是数组形式可以实现可增长的对象数组,与数组一样,包含可以用整形索引进行访 问的组件
*线程安全,同步执行效率低
package vector;
import java.util.Enumeration;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
//创建Vactor对象
Vector v=new Vector();
//public void addElements(E obj);向集合中添加元素
v.addElement("hello");
v.addElement("worlde");
v.addElement("hello");
v.addElement("Java");
//获取迭代器对象
Enumeration en=v.elements();
//遍历输出
while(en.hasMoreElements()){
String str=(String)en.nextElement();
System.out.println(str);
}
}
}*LinkedList集合
*底层数据结构是链表;(增删快,查询慢)
*此实现类是不同步的:线程不安全
*如果使用多线程程序,一般要是安全的类:
StringBuffer,Vector<E>,hashtable<K,V>
synchronized(同步锁对象){
代码;
}
*特有功能:
*public void addElement(E obj)//相当于:add(Object e)
*public Enumeration<E> elements()//相当于:INterator iterator()
*Enumeration<E>
是一个接口:向量的组件枚举
boolean hasMoreElements()://相当于获取迭代器里面的hasNext()方法
Object nextElement()://相当于next()方法
package vector;
import java.util.Enumeration;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
//创建Vactor对象
Vector v=new Vector();
//public void addElements(E obj);向集合中添加元素
v.addElement("hello");
v.addElement("worlde");
v.addElement("hello");
v.addElement("Java");
//获取迭代器对象
Enumeration en=v.elements();
//遍历输出
while(en.hasMoreElements()){
String str=(String)en.nextElement();
System.out.println(str);
}
}
} *如果在一般的需求中没有指明采用是用什么集合去完成,都默认采用ArrayList集合
如果需求中考虑线程安全,那么使用Vector集合
*笔试中一般使用ArrayList集合,效率高,速度快
*LinkList集合
底层数据结构是链表,特点:查询慢,增删快;是一个线程不安全的类
*特有功能
*添加功能:
*public void addFirst(E e)//将指定的元素差插入此列表的开头
*public void addLast(E e)//将制定元素添加到此列表的末尾
*获取功能:
*public Object getFirst()//返回此列表的第一个元素
*public Object getLast();//返回此列表的最后一个元素
*删除功能:
*public Object moveFirst()//删除此列表第一个元素并返回
*public Object moveLast()//删除并返回此列表最后一个元素并返回
package linkedlist;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] agrs){
//创建集合对象
LinkedList lk=new LinkedList();
//向集合中添加元素
lk.add("hello");
lk.add("world");
lk.add("Java");
System.out.println("lk"+lk);
//在开头添加
lk.addFirst("JavaSe");
//在末尾添加
lk.addLast("JavaWeb");
System.out.println("lk:"+lk);
System.out.println("----------------------------");
//获取第一个元素并返回
Object obj=lk.getFirst();
//获取最后一个元素并返回
Object obj1=lk.getLast();
System.out.println("getFirst():"+obj+‘\n‘+"getLast():"+obj1);
System.out.println("lk:"+lk);
System.out.println("----------------------------");
//移除此列表第一个元素并返回
Object obj2=lk.removeFirst();
//移除最后一个元素并返回
Object obj3=lk.removeLast();
System.out.println("removeFirst():"+obj2+‘\n‘+"removeLast():"+obj3);
System.out.println("lk:"+lk);
}
}//模拟栈结构
package linkedlist;
import java.util.LinkedList;
//自定义栈集合
public class Stack {
private LinkedList link;
//通过无参构造创建LinkedList集合对象
public Stack() {
link=new LinkedList();
}
//向集合的开头添加元素;相当于压栈
public void add(Object obj){
link.addFirst(obj) ;
}
//获取集合第一个元素;相当于弹栈
public Object get(){
//removeFirst():移除第一个元素并返回
return link.removeFirst();
}
//判断集合是否为空
public boolean isEmpty(){
return link.isEmpty();
}
}
//测试类
package linkedlist;
public class StackDemo {
public static void main(String[] args){
Stack s=new Stack();
s.add("hello");
s.add("world");
s.add("JavaSE");
//这里做一个非空判断,否则会出错
while(!s.isEmpty()){
//获取集合中的元素;底层调用removeFirst()
System.out.println(s.get());
}
}
}//栈结构特点:先进后出
*泛型
一般的类和方法,只能使用具体的类型:;JavaSE5之后引出了泛型的概念,使代码可以应用多种类型
(只可以是引用类型,不可以是基本类型)
*好处:
*将运行时起一场提前到了编译时期
*解决了黄色警告线的问题
*在获取数据是不需要强制转换类型
*提高代码的安全性
泛型一般情况下可以应用在接口、类、方法上,主要在集合中应用
package generic;
public class ObjectTool {
private Object obj;
public Object getObj(){
return obj;
}
public void setObj(Object obj){
//Object obj = new Integer(27) ; //向上转型
this.obj = obj ;
}
}
package generic;
public class GenericDemo3 {
public static void main(String[] args) {
ObjectTool1<String> ot=new ObjectTool1<String>();
ot.setObj("卡卡西");
//Integer i = ot.getObj(); 由于给类上加入了泛型,在实际测试中,给定了数据类型
//获取数据的时候就必须应该类型来接收,否则不匹配
String name = ot.getObj() ;
System.out.println("姓名是:" +name);
//创建对象
ObjectTool1<Integer> ot2 = new ObjectTool1<Integer>() ;
//设置数据
ot2.setObj(27) ;
//获取数据
//String s = ot2.getObj() ;
Integer ig= ot2.getObj() ;
System.out.println("年龄是:"+ig);
}
}//对于基本类型的泛型
package generic;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericDemo {
public static void main(String[] args) {
//创建集合类;jsk 7.0泛型推断!:建议:后面永远给出类型
ArrayList<String> al=new ArrayList<String>();
//向集合中添加元素
al.add("hello");
al.add("world");
al.add("JavaSE");
//获取迭代器对象;使用泛型
Iterator<String> it=al.iterator();
//遍历集合,并打印
while(it.hasNext()){
//由于使用了泛型不需要强制转型
String str=it.next();
System.out.println(str);
}
}
}//应用泛型对ArrayList集合存储自定义对象并遍历
package generic;
public class Student{
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package generic;
import java.util.ArrayList;
import java.util.Iterator;
public class GenericDemo1 {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList<Student> al=new ArrayList<Student>();
//创建Student类对象
Student st1=new Student("卡卡西",24);
Student st2=new Student("佐助",17);
Student st3=new Student("鸣人",17);
Student st4=new Student("小樱",17);
//向集合中添加元素
al.add(st1);
al.add(st2);
al.add(st3);
al.add(st4);
//获取遍历器对象
Iterator<Student> it=al.iterator();
System.out.println("在Student中重写toString方法:");
while(it.hasNext()){
//由于这里是自定义类型Student,需要在Student里重写toString方法
Student st=it.next();
System.out.println(st);
}
System.out.println("用get方法:");
Iterator<Student> it1=al.iterator();
while(it1.hasNext()){
//如果不重写toString方法,就使用getXX()来获取
Student st6=it1.next();
System.out.println(st6.getName()+"-------"+st6.getAge());
}
}
}*将泛型定义在方法上
package generic;
public class ObjectTool2 {
//将泛型定义在方法上
public <T> void show(T t){
System.out.println(t);
}
}
package generic;
public class GenericDemo4 {
public static void main(String[] args){
ObjectTool2 obj=new ObjectTool2();
//在工具类中将泛型定义在了方法上
obj.show("hello");
obj.show("world");
obj.show("JavaSE");
}
}*泛型接口
*接口的子实现类已经知道传递的是一个什么类型的数据
package generic;
//将泛型定义在接口上
public interface Generic<T> {
public abstract void show(T t);
}
package generic;
//子实现类
public class GenericImpl<String> implements Generic<String>{
public void show(String str){
System.out.println(str);
}
}
package generic;
//测试类
public class GenericDemo5 {
public static void main(String[] args){
Generic<String> gl=new GenericImpl<String>();
gl.show("弋痕夕");
gl.show("天净沙");
gl.show("山鬼谣");
}
}*接口的子实现类在实现接口时不知道传递的是什么类型的数据类型,在测试类中才知道
package generic;
//在接口上定义泛型
public interface Generic1<T> {
public abstract void show(T t);
}
package generic;
public class GenericImpl1<T> implements Generic1<T> {
public void show(T t){
System.out.println(t);
}
}
package generic;
public class GenericDemo6{
public static void main(String[] args){
Generic1<Integer> gl=new GenericImpl1<Integer>();
gl.show(17);
gl.show(18);
gl.show(20);
}
}*泛型可以提供程序的安全性!
* 早期的时候,用Object类型代表任意的类型向上转型是不会出现问题的,但是向下转型的时候,由于隐 藏了类型转换,导致出现错误!
* JDK5以后,提供了泛型可以解决程序的安全性
标签:list集合、泛型
原文地址:http://13355940.blog.51cto.com/13345940/1982477