首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师_集合框架-Map(五)

2012-11-05 
黑马程序员_集合框架-Map(五)-------android培训、java培训、java学习型技术博客、期待与您交流! ----------M

黑马程序员_集合框架-Map(五)

-------android培训、java培训、java学习型技术博客、期待与您交流! ----------

Map和Collection一样,是集合框架顶层接口之一。下面讲的内容是Set以及Collections工具类、Arrays工具类,还有System、Runtime、Date、Math类。

Map

一次添加一对元素,conllection一次添加一个元素

Conllection是单列集合,map是双列集合。其实map集合中存储的就是键值对。

Map集合中必须保证键的唯一性。

1、常用的方法

u  添加

    value put(key,value):费前一个和Key关联的值,如果没有返回null

u  删除

    void clear():清空Map集合。

    value remove(key):根据指定的Key翻出这个键值对。

u  判断

    Booelean containsKey(key):判断是否包含指定的建

         Boolean containsValue(value):判断是否包含指定的值

         Boolean isEmpty():判断是否为空

u  获取

value get(key):通过键获取值,如果没有改建返回null,当然可以通过返回Null,来判断是否包含指定键。

int size():获取键值对的大小

2、从map中获取值的方法

@Test

    publicvoid show(){

        Map<Student,String>map = newHashMap<Student,String>();

        map.put(new Student("mm",23),"湖北");

        map.put(new Student("lisi",27),"北京");

        map.put(new Student("wangwu",29),"山东");

        map.put(new Student("zhaoliu",43),"四川");

        map.put(new Student("houqi",33),"深圳");

        map.put(new Student("maba",53),"江苏");

        map.put(new Student("wangcai",13),"浙江");

        /*for (Integer i : map.keySet()) {

            System.out.println(map.get(i));

        }*/

        for (Entry<Student,String> it :map.entrySet()) {

            Student s =it.getKey();

            String str =map.get(it.getKey());

          //System.out.println(it.getKey()+"\t"+map.get(it.getKey()));

            System.out.println(s.getName()+":\t"+s.getAge()+"\t"+str);

        }

    }

Map常用的子类;

Hashtable:内部结构是哈希表,是同步的,不允许Null作为建,null作为值,

  Properties:用来存储简直对型对配置文件的信息,可以和IO技术相结合。

Hashmap:内部构造是哈希表,不是同步的。允许null键,null为null

Treemap:内部构造是二叉树,不是同步的,可以对map集合进行排序

给非同步的集合加锁

非同步的----List list=new ArrayList();

返回同步----list=Mycollecitions.sycList(list);

Class Mycollections{

Public List staticsycList(List list){

     Return new MyList(list);

}

}

Class MyList implements List{

   Private List list;

   Private static vfinal Objectlock=new Object();

MyList(List list){

     This.list=list;

}

   Public Boolean add(Object obj){

  Synchoronized(lock){

                   Return list.add(obj);

        }

   }

   Public Boolean remove(Objectobj){

Synchoronized(lock){

                          Returnlist.remove(obj);

                }

}

}

3、Map和Collection的区别?

    1.collection是用于存储单列对象的集合,可以使一组单个对象,而map是存储双列对象集合,也就是以键值对的形式存储。是两组对象,一组是用来存储键,一组是存储值。

    2.collection增加的方法是add,mapput.

    3.如果要取出集合中的元素,collection可以直接使用迭代器,但是map不能直接用迭代器,可以先把Map集合转换成set集合,再用迭代器取出元素。

    4.如果没有映射关系,使用collection,对象与对象之间产生映射关系就用map集合。

4、Map的练习(字母次数),明确查表的应用,注重思想?

publicclass MapTest1 {

    /**

     * 1.将字符串转成字符数组

     * 2.因为字符串中单个字符和字符出现的个数产生了对应关系,所以使用了map集合

     * 3.对字符数组进行遍历,得到数组中的元素,并对其进行判断,非a到z,或A到Z不能进行操作

     * 4.定义一个计数器变量

     * 5.将数组中的元素取出来,得到元素和出现的次数,并存储在集合中

     * 6.将集合中的元素迭代,并以字符串的形式打印出来

     */

    publicstaticvoid main(String[] args) {

        String str = "abwwbaabbwwdsdscabcssas";

        String s = getCount(str);

        System.out.println(s);

    }

    publicstatic StringgetCount(String str){

        char[] chs = str.toCharArray();

TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

        for (char c : chs) {

            if(!(c>='a'&&c<='z'||c>='A'&&c<='Z')){

                continue;

            }

            int count =1;

            Integer value =tm.get(c);

            if(value!=null){

                count =++value;

            }

            tm.put(c, count);

        }

        StringBuilder sb = new StringBuilder();

        for (char c :tm.keySet()) {

            sb.append(c).append("(").append(tm.get(c)).append(")");

        }

        return sb.toString();

    }

}

5、Collecitons中常见方法举例?

    static<T extends Comparable<? super T>> void sort(List<T> list):将集合进行排序,并可以指定集合参数的类型,要继承comparable接口,

    static voidswap(List<?> list, int i, int j) :根据指定的位置交换集合中的元素

    static voidshuffle(List<?> list) :对集合中元素位置随机发生变化

    static <T>int  binarySearch(List<? extendsComparable<? super T>> list, T key):使用二分查找给出指定的值在集合中的位置

static<T>List<T>synchronizedList(List<T> list)

6、Collection和Collections的区别?

collection  

        collection是所有单列集合中的父接口,是以一组单个对象存储形式,根据需求,对象在内存中存储数据结构形式不同,collection就产生许多子接口,其中常用的是list接口和set接口,而List有ArrayList和linkedList两个常用的实现类,它是有序可重复的,set接口有hashset和treeset两个实现类,是无序不可重复的。

collections    

        他是对集合操作的一种工具类,类中的方法全部都是静态的,可以对集合的排序,交换位置,二分查找,元素顺序随机变化。等操作。      

7、Arrays常见方法?

          static <T> List<T>asList(T...a):将数组转换成List集合

          static int binarySearch(int[]a,int key):使用二叉树查找法早找指定元素在数组中的位置

          static int[]copyOf(int[] original,int newLength):指定数组的长度并复制到其他数组

          static int[]copyOfRange(int[] original, int from,int to):复制指定的范围

          static boolean equals(int[]a,int[] a1):判断两个数组是否相等,

          statid void fill(int[]a,int val):将数组中的值变为指定的值,相当于初始化值

          static int hashCode(int[]a):返回数组的哈希值

          static void sort(int[]a,int fromIndex,int toIndex):指定数组范围并进行排序

          static <T> StringtoString(int[]a):将数组转换成字符串

          static boolean deepEqasls(Object[]al,Object[] a2):判断两个对象的深度是否相等

8、数组和集合转换,数组转集合为什么?集合转数组为什么?要注意什么?

         数组转集合:可以对数组中的元素通过集合中的方法进行操作,只要不影响其长度,可以使用集合中的任意方法。集合转数组:为了限制集合中元素操作,他只有一个length属性可以操作

    注意:不管是集合转数组还是数组转集合,长度是不可以改变的,不能对其进行增删操作。

9、增强for循环和传统for循环的区别?foreach可以遍历map吗?什么时候使用map?

       在循环多次的时候,传统的循环可以对其循环条件的控制,而增强for不能控制,增强for只能是简化书写,遍历集合或数组中的元素,不能直接遍历map集合,但是可以通过把map集合转成set集合后,再根据set集合迭代出元素。当分析问题时,发现存在着映射关系,这时可以考虑到数组和map。

10、可变参数的使用方式,和注意事项,并举例?

          可变参数的使用格式:

  1.int add(T... a):该函数可以添加多个同种类型的数据,相当于函数的参数是数组形式。

  2.int add(T a,T...a1):在传参数是,除了第一个为a,其他全部都是属于可变参数。

注意:可变参数必须放在其他参数的最后边。传入的实参必须是根据形参的同种类型的参数

 

一、System类1、特点

不能实例化对象,提供的方法都是静态的。

2、System类中获取本地系统信息的方法

系统属性信息:程序在运行时获取到Jvm以及所在操作系统的一些固有信息,获取了这些信息,能为后面的程序运行提供了数据。

publicstaticvoid systemMethodDemo(){

        //获取系统信息并存储到Properties中

        Properties p = System.getProperties();

        //properties是map集合的小弟,可以将其转成set集合获取其中的信息

        Set<String> set= p.stringPropertyNames();

        for (String string : set) {

            System.out.println(string+p.getProperty(string));

        }

        //获取指定名称的系统信息

        System.out.println(p.getProperty("os.name"));

}

获取不同系统中的换行符:-------->将其定义为一个常量!

publicclass SystemDemo {

    privatestaticfinal StringLINE_SEPARATOR = System.getProperty("line.separator");

    publicstaticvoid main(String[] args) {

        systemMethodDemo();

    }

    publicstaticvoid systemMethodDemo(){

        System.out.println("hello"+LINE_SEPARATOR+"world");

    }

}

static longcurrentTimeMillis():获取当前时间,以毫秒为单位。

         static void exit(int status) :退出当前程序。

         static void gc():调用垃圾回收器。

         static Properties getProperties():获取当前系统属性

         static String getProperty(String key):根据关键字获取系统属性名称

         static String setProperty(String key, String value):设置属性的键和值。

Properties类

properties集合中存储都是string类型的键和值,最好使用它自己的存储和取出的方法来完成元素的操作。

常用方法:

         PropertiesgetProperty(String key):返回指定的属性

         ObjectsetProperty(String key,String value):设置属性的键和值

         voidload(InputStream inStream) :加载输入流

         Set<String>stringPropertyNames() :返回属性键的集合。

二、Runtime类

         没有构造方法摘要,说明该类不可以创建对象,又发现还有非静态的方法,说明该类应该提供静态的返回该类对象的方法,而且只有一个,说明runtime类使用了单例设计模式。

1、Runtime api查阅时,你看到了什么,想到了什么?

         我看到了exec方法返回的是一个进程,想到了系统中的可执行文件可以通过该方法启动一个程序。

         Runtimer=Runtime.getRuntime();

         r.exec("notepad.exe");//打开记事本程序

  //r.exec("baofengyinying.exe" e:\\dianying\\变形金刚);//使用暴风影音播放变形金刚电影。

三、Math类

public static void main(String[] args) {

    double d =    Math.ceil(12.34);

    System.out.println(d);//13.0

    double d1=    Math.floor(12.34);

    System.out.println(d1);//12.0

    double d2 =    Math.round(12.34);

    System.out.println(d2);//12.0

    double d3 =    Math.round(12.56);

    System.out.println(d3);//13.0

}

1、Math中的常见方法使用

提供了操作数学元素的方法,都是静态的

int abs(int a)返回整数的绝对值

int max(int a, int b)返回两个整数的最大值

double random()返回一个伪随机值(0--1之间)

double sqrt(double a)返回一个数的平方根

double ceil()返回大于参数的最小整数

double floor():返回小于参数的最大整数

double round():返回四舍五入的值。

double pow(a,b):a的b次方

四、Date类

Date():将当前日期和时间封装成对象

Date(long time):将指定毫秒值封装成Date对象。

1、日期对和毫秒值之间的转换 毫秒值----->日期对象

           1.通过Date对象的构造方法newDate(timeMilles)

Date d = newDate(122394272384947)

           2.还可以通过setTime方法设置

Date d = new Date();

d.setTime(122394272384947);

 为什么要把毫秒值转成日期对象呢?

         因为你可以通过Date对象的方法对该日期中的各个字段(年月日等)进行操作

        

  日期对象----->毫秒值long getTime()方法

  为什么要把日期对象转成毫秒值呢?

                  因为可以通过绝缘体的数值进行运算。

2、对日期对象进行格式化

将日期对象----->日期格式的字符串,使用的是DateFormat类中的format方法

获取日期格式对象,具体默认的风格。FULL、LONG等可以指定风格

publicstaticvoid dateFormatDemo(){

    Date d = new Date();

    //使用默认风格

    DateFormat df = DateFormat.getDateInstance();//获取DateFormat对象

    //使用指定风格

    df = DateFormat.getDateInstance(DateFormat.FULL);

    //使用指定风格,包含日期和时间

df= DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);

    //使用自定义风格

    df = new SimpleDateFormat("yyyy/MM/ddHH:mm:ss");

      

    String str_date =df.format(d);//将日期对象----->日期格式的字符串

    System.out.println(str_date);

}

将日期格式的字符串----->日期对象,使用的是DateFormat类中的parse方法

publicstaticvoid dateFormatDemo1()throws ParseException{

    //日期字符串

    String str_date ="2012-8-1";

    //定义日期格式化对象

    DateFormat df = DateFormat.getDateInstance();

    Date date = df.parse(str_date);

    System.out.println(date);

}

自定义日期格式,使用SimpleDateFormat构造完成

练习:2012/4/12和2012/6/2相差多少天?

publicclass DateTest {

    publicstaticvoid main(String[] args)throwsParseException {

       String str1 = "2012/4/12";

       String str2 = "2012/6/2";

       long day =getDay(str1,str2);

       System.out.println(day);

    }

    publicstaticlonggetDay(String str1,String str2) throwsParseException{

       DateFormat df =newSimpleDateFormat("yyyy/MM/dd");

       Date d1 =df.parse(str1);

       Date d2 =df.parse(str2);

       long time1 = d1.getTime();

       long time2 = d2.getTime();

       long time = Math.abs(time1-time2)/1000/60/60/24;

       return time;

 

 

                                 -------android培训、java培训、??java学习型技术博客、期待与您交流! ----------

更多详情请查看:http://edu.csdn.net

热点排行