码迷,mamicode.com
首页 > 编程语言 > 详细

Java学习lesson 14

时间:2017-11-16 18:37:01      阅读:203      评论:0      收藏:0      [点我收藏+]

标签: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以后,提供了泛型可以解决程序的安全性



    

Java学习lesson 14

标签:list集合、泛型

原文地址:http://13355940.blog.51cto.com/13345940/1982477

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!