package example6;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.junit.Test;

/*1.为什么要使用泛型?
 * 一般使用在集合上,比如现在将一个字符串类型放在集合里面,这时候,放入集合的字符会失去其本身的类型,只能是object类型,比如想要对这这个值进行转换,
 * 很容易出现类型转换错误。可以使用泛型解决这个问题。
 * 常用集合:list set map
 * list的三种实现(ArrayList  LinkedList   vector)
 * 此三者的区别:
 * 1.这三个类都实现了List接口,LinkList即存储在这两个集合中的元素的位置是不连续的,底层数据结构是列表结构。
 * 2.ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,查询速度快,
 * 但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
 * 3.LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入,修改,删除 速度较快.
 * 4.Vector是同步处理,性能较低;ArrayList是使用异步处理,性能高。
 * 5.Vector是线程安全的,ArrayList是非线程安全。LinkedList是非线程安全。
 * 6.一般情况都用ArrayList,ArrayList占据内存小,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。
 * 如果是对其它指定位置的插入、删除操作,最好选择LinkedList。
 * 7.泛型擦除
 * 首先泛型只是出现在源代码阶段,当编译之后泛型不存在了。
 * 注:在泛型里必须写一个对象,比如String,不能写基本数据类型,比如int。
 * 要写基本数据类型对应的包装类
 * byte---Byte
 * int---Integer
 * short---Short
 * loong---Long
 * float---Float
 * double---Double
 * boolean---Boolean
 * char---character
 * */

public class fanxing {

//将一个任意数组进行首尾颠倒
    public static void main(String[] args) {
        String[] array= {"sss","ddd","xxx","bbb","mmm","ccc"};
        System.out.println(Arrays.toString(array));
        reverses(array);
        System.out.println(Arrays.toString(array));
        
        Integer[] array1= {11,22,33,44,55,66};
        System.out.println(Arrays.toString(array1));
        reverses(array1);
        System.out.println(Arrays.toString(array1));
    }
    
    
    
    private static<T> void reverses(T[] array) {
        for(int i=0;i<array.length/2;i++) {
            T temp=array[i];
            array[i]=array[array.length-i-1];
            array[array.length-i-1]=temp;
        }
        /*private static void reverses(String[] array) {
            for(int i=0;i<array.length/2;i++) {
                String temp=array[i];
                array[i]=array[array.length-i-1];
                array[array.length-i-1]=temp;
            }*/
        
    }

// 泛型使用在set集合上
    @Test
    public void setList() {
        Set<String> set = new HashSet<String>();
        set.add("baojuan");
        set.add("xinxin");
        set.add("xuanxuan");
        // 遍历set集合只有两种方式(迭代器,增强for)
        for (String s1 : set) {
            System.out.println(s1);
        }
        // 迭代器
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("********************************");
    }

// 泛型在map集合上的使用(结构:key--value形式)
    @Test
    public void testMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("www", "111");
        map.put("qqq", "222");
        map.put("ttt", "333");
        // 遍历map集合(有两种方式)
        // 1.获取所有的key,通过key得到value,用get方法
        // 2.获取key和value的关系
        // 使用第一种方式遍历
        Set<String> sets = map.keySet();
        // 遍历所有key返回的set
        for (String key : sets) {
            // 得到所有key对应的value值
            String value = map.get(key);
            // 打印输出
            System.out.println(key + "=>" + value);
        }

// 第二种方式遍历
        //set集合存放通过map.entrySet()方法获得的key与value的关系
        Set<Entry<String, String>> set1 = map.entrySet();
        //遍历关系集合
        for (Entry<String, String> entry : set1) {
            //获取关系中的key值
            String s1 = entry.getKey();
            //获取关系中的value值
            String s2 = entry.getValue();
            System.out.println(s1+"=>"+s2);
        }

}

// 泛型在list集合上的使用
    @Test
    public void testList() {
        List<String> list = new ArrayList<String>();
        list.add("aaaa");
        list.add("bbbb");
        list.add("cccc");
        // 遍历list集合
        // 普通for循环,迭代器,增强for循环(三种方式)
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }
        System.out.println("===========================");
        // 增强for循环
        for (String s1 : list) {
            System.out.println(s1);
        }
        System.out.println("===========================");
        // 使用迭代器遍历集合
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("********************************");
    }
}

运行结果:

qqq=>222
ttt=>333
www=>111
qqq=>222
ttt=>333
www=>111
aaaa
bbbb
cccc
===========================
aaaa
bbbb
cccc
===========================
aaaa
bbbb
cccc
********************************
xinxin
xuanxuan
baojuan
xinxin
xuanxuan
baojuan
********************************

Java中泛型的运用实例的更多相关文章

  1. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  2. Java中泛型使用

    Java中泛型使用 泛型作用: 泛型:集合类添加对象不用强转 反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码: ArrayList<Ls> ff=new ArrayList ...

  3. Java 中静态变量和实例变量区别

    Java 中静态变量和实例变量区别 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量. 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量. 在程序运行时的区别: 实例变量属于某个对 ...

  4. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  5. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  6. Java中泛型的理解

    Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型.这种数据类型可以用在类.接口和方法创建中.即泛型类.泛型接口.泛型方法.这样说可能不够生动 ...

  7. Java中泛型Class<T>、T与Class<?>、 Object类和Class类、 object.getClass()和Object.class

    一.区别 单独的T 代表一个类型(表现形式是一个类名而已) ,而 Class<T>代表这个类型所对应的类(又可以称做类实例.类类型.字节码文件), Class<?>表示类型不确 ...

  8. java中反射讲解及实例

    Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...

  9. Java中泛型的详细解析,深入分析泛型的使用方式

    泛型的基本概念 泛型: 参数化类型 参数: 定义方法时有形参 调用方法时传递实参 参数化类型: 将类型由原来的具体的类型参数化,类似方法中的变量参数 类型定义成参数形式, 可以称为类型形参 在使用或者 ...

随机推荐

  1. 第6课 仿Siri机器人-语音朗读和语音识别

    一.功能设计 输入文本,单击“朗读”按钮,由手机读出该文本(如果没有输入文本,则弹出消息框警告“请输入文本):单击“识别”按钮,读入语音,从文本框中输出文字.(另,增加识别的视觉效果,如果读入的文本含 ...

  2. Qt判断鼠标在控件上

    QT判断鼠标是否在某子窗口控件上方 需要注意的是,子窗口获取geometry,是相对于父窗口的相对位置,QCursor::pos()获取的是鼠标绝对位置,要不将父窗口的相对位置进行换算,要不将鼠标的绝 ...

  3. GitHub教程(一) 使用指南

    刚进公司上班的时候,技术总监让我熟悉一下Git(分布式版本控制工具)操作命令和GitHub(代码托管平台),说实话之前我也没有具体使用过Git工具,但是GitHub我还是注册过账号的.在练习将本地仓库 ...

  4. mongodb 3.4复制搭建

    mongodb数据库主从复制的原理:在主从结构中,主节点的操作记录称为oplog(operation log).oplog存储在一个系统数据库local的集合oplog.$main中,这个集合的每个文 ...

  5. .Net中初探Redis

    一.简介 Redis是著名的NOSQL数据库,本质就是存储键值对结构的数据,为存储键值对数据做了优化,在大型网站中应用很多.Redis提供了数据的自动过期处理,因此适合存储临时数据. 和Redis类似 ...

  6. 《C++ Primer Plus》读书笔记之——处理数据

    本文旨在记录在阅读<C++ Primer Plus>第五版的过程中,一些重点的知识点,方便以后查阅.本文将不断更新...... 一.第三章 处理数据 1.无符号整型不能存储负数值,其优点是 ...

  7. 记一次JVM调优之旅(斗争full gc)

    俗话说技多不压身,当年苦读<深入理解JVM>还专门整理了笔记,现在就用上了- 笔记 http://www.cnblogs.com/syjkfind/p/3901774.html [症状]  ...

  8. June 21st 2017 Week 25th Wednesday

    Discontent is the first step in progress. 不知足是前进中的第一步. Several days ago, I wrote down a quote which ...

  9. CSV 文件读写

    转自:http://www.cnblogs.com/Clin/archive/2013/03/14/2959022.html public class CSVFileHelper { /// < ...

  10. boost::intrusive_ptr原理介绍

    boost::intrusive_ptr一种“侵入式”的引用计数指针,它实际并不提供引用计数功能,而是要求被存储的对象自己实现引用计数功能,并提供intrusive_ptr_add_ref和intru ...