黑马程序员--------java Collections、Arrays、高级for、可变参数、静态导入、System、Runtime、Math、Date、Calendar

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

集合框架的工具类

Collections:给集合提供更多的功能,都是静态方法,不需要创建对象,直接调用即可

1、常用方法:

   *Collections.sort(list) :对list集合进行自然顺序的排序

   *Collections.sort(list,new MyCompare()) :按指定的比较器方法对list集合排序

             class MyCompare implements Comparator<String>

             {

                     public intcompare(String s1,String s2)

                    {

                           int x =s1.length()-s2.length();

                           returnx==0?s1.compareTo(s2):x;

                    }

             } 

   *Collections.max(list) :返回list集合中自然顺序最大的元素

   *int index=Collection.binarySearch(list,”kk”):使用二分法查找,返回角标。条件要先用sort进行排序

   *Collections.reverseOrder() : 返回一个比较器,它强行逆转实现了 Comparable 接口的对象collection 的自然顺序

   *Collections.shuffle(list) :随机对list中的元素进行位置的置换

2、将非同步集合转成同步集合的方法:XXXsynchronizedXXX(XXX)

   *List synchronizedList(list)

   *Map synchronizedMap(map)

3、Collection和Collections的区别

   1)Collections是java.util下的类,是针对集合的一个工具类,提供一系列静态方法,实现对集合的查找、替换、线程安全化(将非同步转换为同步)等操作

   2)Collection是java.util下的接口,它是各种集合结构的父接口,只要有List和Set,提供了关于集合的一些操作,例如添加、删除、判断、遍历等

//Collections 练一练
import java.util.*;
class CollectionsLian 
{
	public static void fuc (Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		ArrayList<String> al = new ArrayList<String>();
		al.add("bc");
		al.add("z");
		al.add("acc");
		al.add("adec");
		al.add("bcddd");
		al.add("abc");
		fuc(al);
		Collections.sort(al);//按元素的自然顺序排序
		fuc(al);
		int index = Collections.binarySearch(al,"z");//使用二分法查找元素z在al中的位置
		fuc(index);
		Collections.sort(al,new myCompare());// 按指定的比较器比较
		fuc(al);
		Collections.reverse(al);
		fuc(al);
		Collections.shuffle(al);//随机调换al中的元素位置
		fuc(al);
		fuc(Collections.max(al));//返回al中自然顺序最大
		fuc(Collections.min(al));//返回al中自然顺序最小的	
	}
}
class myCompare implements Comparator<String>
{
	public int compare(String s1,String s2)
	{
		if(s1.length()>s2.length())
			return 1;
		if(s1.length()==s2.length())
			return s1.compareTo(s2);
		else
			return -1;
	}
}

//自定义二分法查找
import java.util.*;
class CollectionsDemo1
{
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args)
	{
		ArrayList<String> al = new ArrayList<String>();
		al.add("abc");
		al.add("c");
		al.add("ac");
		al.add("abcd");
		al.add("abced");
		Collections.sort(al);//对List集合进行自然顺序的排序
		fuc(al);
		int i = Collections.binarySearch(al,"ac");//直接调用Collections的二分法查找方法,集合先要是有序
		fuc(i);
		int x = half(al,"ac");
		fuc(x);

	}
	public static int half(ArrayList<String> al,String key)//自定义二分法擦找判断对象在集合中是否存在
	{
		int max,min,mid;//定义三个变量
		max=al.size();//初始化max值为集合的最后一个对象角标
		min=0;
		while(min<=max)
		{
			mid =(min+max)>>1;//mid等于最大值加最小值除2
			String s =al.get(mid);//获取中间值角标对应的对象
			int num = s.compareTo(key);//比较中间值角标对象和设定的对象是否相同
			if(num>0)
			{
				max=mid-1;//如果中间值角标的对象大于设定的,max值就等于mid-1,逐渐缩小查找范围
			}
			else if(num<0)//如果中间值角标对象小于设定值,min值等于mid加一,
			{
				min=mid+1;
			}
			else
				return mid;//如果相等就说明找到了,直接放回mid
		}return -min-1; //不存在返回设定对象的插入点加一在取反
	}
	
}

import java.util.*;
class CollectionsDemo2
{
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		//fillDemo();
		//replaceAllDemo();
		orderDemo();
	}
	public static void orderDemo()
	{
		TreeSet<String> ts = new TreeSet<String>( Collections.reverseOrder());//逆转对象自然顺序  也可以调用手写的 new Com()比较器;还可以反向一个手写比较器
		ts.add("abc");
		ts.add("cad");
		ts.add("bec");
		ts.add("bbc");
		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			fuc(it.next());
		}
	}
	public static void replaceAllDemo()
	{
		List<String> list = new ArrayList<String>();
		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		fuc(list);
		Collections.replaceAll(list,"aaa","ccc");//将aaa替换为ccc
		fuc(list);
		Collections.reverse(list);//反转集合
		fuc(list);
	}
	/*
	练习:fill方法可以将List集合中所有的元素替换成指定元素
	要求:将List集合中部分元素替换成指定元素
	*/
	public static void fillDemo()
	{
		List<String> list = new ArrayList<String>();
		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		fuc(list);
		Collections.fill(list,"mm");
		fuc(list);
	}
}
class Com implements Comparator<String>
{
	public int compare(String s1,String s2)
	{
		return s2.compareTo(s1);
	}
}

java.util.*

Arrays:用于操作数组对象的工具类,里面都是静态方法

1、数组转集合

   *asList方法:将数组转成List集合

    String[] str = {“abc”,”aaa”,”sss”};

    List<String> list = Array.asList(str);//将str数组转成List集合

    好处:可以通过List集合中的方法来操作数组中的元素:isEmpty()、contains()、indexOf()、set()。

注意(局限性):数组的长度是固定的,不可以使用集合对象进行增加、删除等。会改变数组长度方法如add、remove、clear(会报不支持操作异常UnsupportedOperationException)

    如果数组中存储的引用数据类型,直接作为集合的元素可以直接运用集合的方法操作

    如果数组中存储的是基本数据类型,asList会将数组实体作为集合元素存在。

/*
Arrays:用于操作数组的工具类,里面都是静态方法,用于对数组元素的排序sort、查找binarySearch、和转换为字符串 toString

asList:将数组变成List集合
*/
import java.util.*;
class ArraysDemo
{
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		String[] arr = {"abc","bcd","cccc"};
		/*
		把数组变成List集合有什么害处?
		可以使用集合的思想和方法来操作数组中的元素。

		注意:将数组变成集合,不可以使用集合的增,删方法
		      因为数组的长度是固定的,否则编译失败
		*/
		List<String> list = Arrays.asList(arr);
		fuc(list.contains("abc"));
		/*
		如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素
		如果数组中的元素是基本数据类型,那么就会将该数组作为集合中的元素存在
		*/
		int[] i = {2,3,4};//数组中的元素为基本数据类型
		Integer[] in ={2,3,5};//数组在的元素为对象
		List<Integer> ls = Arrays.asList(in);
		fuc(ls);
	}
}

2、集合变数组

  *用的是Collection接口中的方法:toArray();

   如果给toArray传递的指定类型的数组长度小于了集合的size,那么toArray方法,会自动再创建一个该类型的数组,长度为集合的size

   如果传递的指定类型的数组的长度大于了集合的size,那么toArray方法,就不会创建新数组,直接使用该数组即可,并将集合中的元素存储到数组中,其它空余位值为null,所以,在传递指定类型的数组时,最好的方式就是指定数组的长度和size相等

   好处:限定了集合中的元素进行增删操作,只需获取这些元素即可

/*
集合变数组
Collection中的 toArray()方法
*/
import java.util.*;
class ArraysDemo1 
{
	public static void main(String[] args) 
	{
		ArrayList<String> al = new ArrayList<String>();
		al.add("abc");
		al.add("bcd");
		al.add("cba");
		/*
		1、指定类型的数组到底要多长呢?
		   当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size
		   当指定类型的数组长度大于了集合的size,那么就不会创建数组了,而是使用传递进来的数组
		   所以创建一个刚刚好的数组最优

		 2、为什么要让集合变数组?
		    为了限定对元素的操作,不需要进行增删了
		*/
		String[] arr = al.toArray(new String[al.size()]);
		System.out.println(Arrays.toString(arr));
	}
}

JDK1.5新特性——增强for循环

Collection在jdk1.5以后,有了一个父类接口Iterable,这个接口的出现将iterator方法进行了抽取,提高了扩展性。

——————————————————————

1、方法:增强for循环:foreach语句,foreach简化了迭代器

   格式:增强for循环括号里写两个参数,第一个是声明一个变量,第二个是需要迭代的容器

   for(元素类型 变量 : Collection集合&数组){----}

2、高级for循环与传统for循环区别

  1)高级for循环在使用时,必须要明确被遍历的目标。这个目标可以是Collection集合或者数组,如果遍历Collection集合,在遍历过程中还需要对元素进行操作,比如删除,就必须要使用迭代器了

  2)如果遍历数组,还需要对数组元素进行操作,建议使用传统for循环,因为可以定义角标,通过角标操作元素。如果只为遍历获取,就可以简化成高级for循环,它的出现简化了书写

3、高级for循环不可以遍历Map集合。但是可以将Map转换为Set后就可以使用

4、常见的使用方式及使用之一事项

   1)作用:对存储对象的容器进行迭代:数组  Collection Map

   2)增强for循环迭代数组

        String[] str ={“abc”,”sss”,”ccc”};

        for(String s : str){

        System.out.println(s);

        }

3)单列集合Collection

     List list = new ArrayList();

     list.add(“aaa”);

     list.add(“ccc”);

    //增强for循环,没有使用泛型的集合能不能用增强for循环迭代?

    for(Object obj : list){

      String str =(String)obj;

      System.out.println(str);

   }

4)双列集合Map

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

    map.put(“01”,”aaa”);

    //传统的两种取出元素的方式 重点掌握

    Set<String> keyset = map.keySet();

    for(Iterator<String> it =keyset.iterator();it.hasNext();){

        String key = it.next();//取出存在set集合中的所有键

        String value = map.get(key);//通过键获取值

    }

   //第二种

   Set<Map.Entry<String,String>> entry= map.entrySet();

   for(Iterator<Map.Entry<String,String>> it =entry.iterator();it.hasNext();){

       Map.Entry<String,String> me =it.next(); //取出存放于set集合中左右的键值对

       String key = me.getKey();

       String value = me.getValue();

    }

   //增强for循环迭代:原则上map集合是无法使用增强for循环类迭代的,因为增强for循环只针对实现了Iterable接口的集合进行迭代;Iterable是JDK1.5中新定义的接口,就一个方法Iterator,只有实现了Iterable接口的类,才能保证一定有iterator方法,java有这样的限定是因为增强for循环内部还是用迭代器实现的,实际上我们可以通过某种方式来使用增强for循环

      for(Object obj : map.entrySet()){

      Map.Entry me =(Entry)obj;

      System.out.println(me.getKey()+”...”+me.getValue())

  5)集合迭代注意问题:在集合迭代过程中,不能使用集合的方法进行增删操作(会报并发修改异常);可以使用迭代器的方法进行操作。list集合特有迭代器listIterator有增删操作

  6)增强for循环注意问题:使用增强for循环时,不能对元素进行赋值

        int[] arr ={1,2,3}

        for(int x : arr){

           x=0;  //错误操作

           }

可变参数     

1、符号 (...) 三个点就代表是可变参数

2、可变参数:其实就是数组的简写格式,不用每次都建立数组对象,只要将操作的元素作为数组传递即可,隐式将这些参数封装成了数组 

3、注意:可变参数一般要定义在参数列表的最后面

/*
JDK1.5版本出现的新特性

可变参数 :...
注意:可变参数一定要定义在参数列表的最后面
 */
class ParamMethodDemo 
{
	public static void main(String[] args) 
	{
		/*
		可变参数:其实就是数组的简写格式
		不用每次都建立数组对象
		只要将操作的元素作为数组传递即可
		隐式将这些参数封装成了数组
		*/
		show("String",2,3,4,5,6);
		//show(2,3,4,5,6,8,5,4);
	}
	public static void show(String str,int... arr)
	{
		
		int sum =0;
		System.out.println(arr.length);
		for(int x=0;x<arr.length;x++)
		{	
			sum+=arr[x];
		}
		System.out.println(sum);
	}
}

静态导入 

1、静态导入:StaticImport 导出类中的所有静态成员,在调用时不需要写 类名. 直接写方法名就行,简化了静态成员的书写

/*
静态导入:StaticImport

当类名重名时,需要指定具体的包名
当方法重名时,需要指定具体所属的对象或者类
*/
import java.util.*;
import static java.util.Arrays.*;//导入的是Arrays这个类所有的静态成员
class StaticImport //extends Object
{
	public static void main(String[] args) 
	{
		int[] arr = {1,4,2,5};
		sort(arr);
		int x = binarySearch(arr,2);
		System.out.println(x);
		System.out.println(Arrays.toString(arr));//这里的Arrats.不能去掉,因为Object也有toString方法
	}                                            //去掉了会认为是调用Object里面的toString方法
}

其他对象API:    

 

java.lang.System

1、System 类包含一些有用的类字段和方法。属性和行为都是静态的它不能被实例化。

2、方法:

    *long currentTimeMillis(); //返回当前时间的毫秒值

    *exit();  //退出虚拟机

    *PropertisgetPropertis(); //获取当前的系统信息

       ProPerties prop = System.getProPerties(); //获取系统信息,并将这些信息存储properties集合中,它是Hashtable的子类,属于Map集合。

       System.setProperties(“myName”,”lisi”); //给系统属性信息添加具体的信息

       //临时设置方法:运行JVM时,也可以通过JVM的参数进行系统属性的临时设置,可以在java命令后面加入-DmyName=lisi    用法:java –DmyName=lisi 执行类名

   *String name = System.getProperties(“os.name”); //获取系统类型名称  win7

      //判断该系统是否是某一个软件支持的系统

             Set<String>set = new HashSet<String>();

             set.add(“WindowsXP”);

             set.add(“Windows7”);

            if(set.contains(name));

                   System.out.println(“支持”);

            else

                   System.out.println(“不支持”);

/*
System:类中的方法和属性都是静态的
out:标准输出,默认控制台
in:标准输入 ,默认键盘

描述系统一些信息

获取系统属性信息:ProPerties getProperties
*/
import java.util.*;
class SystemDemo 
{
	public static void main(String[] args) 
	{
		Properties prop = System.getProperties();
		//因为Propertis是Hashtable的子类,也就是Map集合的一个子类对象
		//那么可以用Map的方法取出该集合中的元素
		//该集合中存储的是字符串,没有定义泛型
		for(Object obj:prop.keySet())
		{
			String value = (String)prop.get(obj);
			System.out.println(obj+"::"+value);
		}

		//如何在系统中自定义一些特有信息
		System.setProperty("maykey","mayValue");

		//获取指定属性信息
		String value = System.getProperty("os.name");//获取系统名称
		System.out.println("value="+value);

		// 在jvm启动时,动态加载一些属性信息
		String v = System.getProperty("haha");
		System.out.println("v="+v);//java -Dhaha=aaaaa SystemDemo 会打印出v的值为aaaaa(通过—D的方式)			 
	}
}


java.lang.Runtime

1、Runtime类中没有构造方法,不能创建对象,但是又有非静态方法,可以想到该类肯定提供了获取本类对象的方法,而且该方法是静态的,返回值是Runtime类型。这个方法就是static Runtime getRuntime(); 由上述特点可以看出该类使用了单例设计模式

2、基本应用:

class RuntimeDemo
{
	public static void main(String[] args) throws Exception
	{
		Runtime r = Runtime.getRuntime();
		Process p = r.exec("notePad.exe SystemDemo.java");//用记事本打开程序
		//Process p = r.exec("E:\\Program Files\\KuGou\\KGMusic\\KuGou.exe");
		//Thread.sleep(4000);//让主线程等待4秒
		//p.destroy();//杀死打开程序
	}
}


java.util.Math

1、Math类是用于数学运算的工具,属性和行为都是静态的,该类是final,不允许被继承

2、方法:

  *static double ceil(double a); //返回大于指定数值的最小整数

  *static double floor(double a); //返回小于指定数值的最大整数

  *static long round(long a); //四舍五入成整数

  *static double pow(double a,double b); //a的b次方

  *static double random(); //返回0-1的伪随机数

/*
数值计算的工具类:
*/
import java.util.*;
class MathDemo 
{
	public static void main(String[] args) 
	{
		//show();

		 Random r = new Random();//随机数
		 for(int x=0;x<10;x++)
		{
			//int d = (int)(Math.random()*10+1);//使用Random类就不需要进行强转了
			int d = r.nextInt(10);
			fuc(d);
		 }
	}
	public static void show()
	{
		double d = Math.ceil(14.22);//ceil返回大于指定数据的最小整数
		double d1 = Math.floor(12.23);//floor返回小于指定数据的最大整数

		long l = Math.round(16.66);//四舍五入
		fuc("d="+d);
		fuc("d1="+d1);
		fuc("l="+l);

		double d2 = Math.pow(2,3);//2的3次方
		fuc("d2="+d2);
	}
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
}

java.util.Date 日期类

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

   1)日期对象转成毫秒值。Date类中的getTime方法

      Date d = new Date();

      long time1 = d.getTime();

      long time2 = System.currentTimeMillis();//毫秒值

  2)如何将获取到的毫秒值转成具体的日期:Date类中的setTime方法。也可以通过构造函数方式。

     long time = 122342714376222;

     Date d = new Date();

     d.setTime(time);

2、将日期字符串转成日期对象:使用的DataFormat方法中的 Dataparse(String source);

     //方法一 自定义格式化

    public static void method()Throws Exception{

          String time = “2014/12/20”;

          DateFormat df = new SimpleDateFormat(“yyyy年MM月dd日”);//SimpleDataFormat作为可以指定用户自动以的格式来完成格式化

         Date d = df.parse(time);

    }

   //方法二:如果不需特定的格式化风格,完全可以使用DateFormat类中的静态方法获取集体的已经封装好的方法:getInstance()  getDateTimeInstance();

     Date d = new Date();

     DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);

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

     String time = df.format(d);

  

    //将日期对象转换成字符串的方式:DateFormat类中的format方法

    //创建日期格式对象

       DateFormat df = newSimpleDateFormat();//该对象的建立会封装一个默认的日期格式——14-12-20 下午16:00

    //如果想要自定义日期格式的话。可以使用SimpleDateFormat 的构造函数,将具体的格式作为参数传入到构造函数

      Date d = new Date();

     DateFormat df = new SimpleDateFoemat(“yyyy年MM月dd日 HH:mm:ss”);

    //调用DateFormat中的format方法,对已有的日期对象进行格式

     String time = df.format(d)

import java.util.*;
import java.text.*;
class DateDemo 
{
	public static void main(String[] args) 
	{
		Date d = new Date();
		System.out.println(d);//打印时间看不懂,希望有些格式

		//将模式封装到SimpleDateformat对象中
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E hh:mm:ss");
		//调用format方法让模式格式化指定Date对象

		String time = sdf.format(d);
		System.out.println("time="+time);
	}
}

java.util.Calendar  日历类

import java.util.*;
import java.text.*;
class CalendarDmeo 
{
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Calendar c =  Calendar.getInstance();

		String[] mons = {"一月","二月","三月","四月",
			           "五月","六月","七月","八月",
			         "九月","十月","十一月","十二月"};
		
		String[] weeks ={"","星期日","星期一","星期二","星期三",
			"星期四","星期五","星期六"};
		
		int index = c.get(Calendar.MONTH);//计算机的月份是0-11
		int index1 = c.get(Calendar.DAY_OF_WEEK);//1-7对应星期日到星期六

		fuc(c.get(Calendar.YEAR)+"年");
		//fuc((c.get(Calendar.MONTH)+1)+"月");
		fuc(mons[index]);//获取月份的角标,查表
		fuc(c.get(Calendar.DAY_OF_MONTH)+"日");
		//fuc("星期"+c.get(Calendar.DAY_OF_WEEK));
		fuc(weeks[index1]);//获取星期的角标,
	}
}
*/
import java.util.*;
class CalendarDemo2 
{
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Calendar c =  Calendar.getInstance();
		//c.set(2015,2,4);
		c.add(Calendar.DAY_OF_MONTH,10);//时间量的偏移,可以是年月日
		printCalendar(c);
	}
	public static void printCalendar(Calendar c)
	{
		String[] mons = {"一月","二月","三月","四月",
			           "五月","六月","七月","八月",
			         "九月","十月","十一月","十二月"};
		
		String[] weeks ={"","星期一","星期二","星期三",
			"星期四","星期五","星期六","星期日"};
		
		int index = c.get(Calendar.MONTH);
		int index1 = c.get(Calendar.DAY_OF_WEEK);

		fuc(c.get(Calendar.YEAR)+"年");
		//fuc((c.get(Calendar.MONTH)+1)+"月");
		fuc(mons[index]);
		fuc(c.get(Calendar.DAY_OF_MONTH)+"日");
		//fuc("星期"+c.get(Calendar.DAY_OF_WEEK));
		fuc(weeks[index1]);
	}
}

/*
两个练习:
1、获取任意年的2月有多少天
   思路:根据指定年设置一个时间就是
         c.set(year,2,1)//某一年的3月1日
		 c.add(Calendar.DAY_OF_MONTH,-1)//3月1日往前推一天,就是2月的最后一天,也就是2月的天数

2、获取昨天的现在这个时刻
   c.add(Clendar.DAY_OF_MONTH,-1)现在这个时刻减去一天

*/
import java.util.*;
class CalendarTest 
{
	public static void fuc(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Calendar c = Calendar.getInstance();
		getTime(c);
		
		getDays(c);
	}
	public static void getDays(Calendar c)
	{
		c.set(2020,2,1);//设置时间为2020.3.1
		c.add(Calendar.DAY_OF_MONTH,-1);//减去一天获得2月的最后一天
		fuc(c.get(Calendar.DAY_OF_MONTH));//打印2月的最后一天

	}
	public static void getTime(Calendar c)
	{
		c.add(Calendar.DAY_OF_MONTH,-1);
		fuc(c.get(Calendar.DAY_OF_MONTH)+"日"+c.get(Calendar.HOUR_OF_DAY)+"时"+c.get(Calendar.MINUTE)+"分");
	}
}


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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值