JavaSE_jdk新特性_2

NewMethod_JDK_Wrapper

package uncommitted;
import java.util.Arrays;

import org.junit.Test;
public class NewMethod_JDK_Wrapper {
   @Test
   public void method3() {
      /** 练习:对字符串中的数值从小到大进行排序*/
      String numStr="32,45,57,85,-3,64";
      final String SPERATOR=",";
      //String[] arr1=numStr.split(",");
      String[] arr1=numStr.split(SPERATOR);
      int len=arr1.length;
      int[] arr2=new int[len];
      for (int i = 0; i < len; i++) {
         arr2[i]=Integer.parseInt(arr1[i]);
         System.out.println(arr2[i]);
      }
      //使用数组工具的排序方法
      Arrays.sort(arr2);
      //传统的连接成串方法
      StringBuilder sb=new StringBuilder();
      sb.append("[");
      for (int i = 0; i < arr2.length; i++) {
         if(i!=arr2.length-1)
            //sb.append(arr2[i]+",");
            sb.append(arr2[i]+SPERATOR);
         else
            sb.append(arr2[i]+"]");
      }
      System.out.println(sb);
      //或者使用经典的数组toString
      //System.out.println(myToString(arr2));
   }
   //自定义将数组成员相连
    // 数组toString的经典实现!
    public String myToString(int[] a) {
         if (a == null)
             return "null";
         int iMax = a.length - 1;
         //下面是健壮性判断
         if (iMax == -1)
             return "[]";
         StringBuilder b = new StringBuilder();
         b.append('[');
         for (int i = 0; ; i++) {//中间省略条件判断,提高效率!
             b.append(a[i]);
             if (i == iMax)
                 return b.append(']').toString();
             b.append(",");
         }
    }
    @Test
   public void method2() {
      Integer i1=new Integer("23");
      Integer i2=new Integer(23);
      System.out.println(i1==i2);//false因为==是两个地址
      System.out.println(i1.equals(i2));
      //true,因为Integer复写了equal方法,比较数值大小
      Integer i3=new Integer(60);
      Integer i4=new Integer(10);
      System.out.println(i1.compareTo(i2));
      //数值相等:0   在数值上比较两个Integer对象
      System.out.println(i1.compareTo(i3));
      //前<后: -1  在数值上比较两个Integer对象
      System.out.println(i1.compareTo(i4));
      //前>后: 1  在数值上比较两个Integer对象
      
      //自动装箱!
      Integer i5=new Integer(6);//JDK1.5以前
      Integer i6=6;//JDK1.5以后版本,自动装箱
      System.out.println(i5==i6);//false,地址不同,实际是两个NEW
      System.out.println(i5.equals(i6));
      //true,因为Integer复写了equal方法,比较数值大小
      System.out.println(i5.compareTo(i6));
      //数值相等:0   在数值上比较两个Integer对象
      i6=i6+9;
      //15,自动拆箱;重点~i6=new Integer(i6.intValue()+9);
      i6=new Integer(i6.intValue()+9);
      System.out.println(i6);//24
      //Integer i7=null;//注意:自动装箱时会出现NullPointerException
      Integer i7=7;
      System.out.println(i7+6);//13
      Integer i8=-128;
      //千万注意:自动装箱如果是1个字节大小,会共享数据
      //而不会重新开辟空间!!!
      Integer i9=-128;
      System.out.println(i8==i9);//true!!!-128~127
      System.out.println(i8.equals(i9));//true
   }
    @Test
   public void method1() {
      System.out.println(Integer.MAX_VALUE);//2147483647
      System.out.println(Integer.toBinaryString(-6));
      //11111111111111111111111111111010
      System.out.println(Integer.parseInt("123")+1);
      //124,如果格式不对,抛NumberFormatException
      Integer i1=new Integer("123");
      System.out.println(i1.intValue()+1);
      //返回124 value of this Integer as an int.
      System.out.println(Integer.toBinaryString(60));
      //十进制转2进制~111100
      System.out.println(Integer.toHexString(60));
      //3C
      System.out.println(Integer.toOctalString(60));
      //74
      System.out.println(Integer.toString(60));
      //60
      System.out.println(Integer.toString(60, 16));
      //3c,后面是radix进制,将整数转成指定进制的字符串
      Integer i2=Integer.valueOf(123);
      System.out.println(i2==Integer.valueOf(123));
      //true
      //其他进制到十进制,下面是把3C按16进制格式,转成十进制
      System.out.println(Integer.parseInt("3C", 16));
   }
}


GenericDemo1

package uncommitted;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;
import org.junit.Test;

import Collection.ComparatorByName;
import bean.Person;
import bean.Student;
import bean.Worker;
//<>表示数据的类型;简称泛型!
public class GenericDemo {
   @Test
   public void method7() {
      //下面演示泛型方法(非静态方法)
      GenericTools<String> tool=new GenericTools<String>();
      tool.show1("宝黛钗");
      //...show...宝黛钗
      
      tool.print("空对着;山中高士晶莹雪;终不忘;世外仙姝寂寞林;");
      //...print...空对着;山中高士晶莹雪;终不忘;世外仙姝寂寞林;
      
      //tool.show1(new Integer(4));//传1个整型对象就挂掉了!
      //因为show1和print方法都是使用(借用)的是泛型类里面的泛型(即同1个泛型)
      
      tool.showWithGeneric(new Integer(2014));
      //...showWithGeneric...2014    泛型定义在方法上面~
      
//      下面这个是静态的带泛型的方法,用类名直接调用!
      GenericTools.method_staticWithGeneric("叹人间;美中不足今方信");
      //...method_staticWithGeneric...叹人间;美中不足今方信
      
      GenericTools.method_staticWithGeneric(new Integer(2015));
      //...method_staticWithGeneric...2015
   }
   @Test
   public void method6() {
      // 泛型类演示! 这个是现在使用泛型后的代码!
      GenericTools<Student> tool=new GenericTools<Student>();
      tool.setQ(new Student("黛玉",16));
      //tool.setQ(new Worker());//在使用了泛型后,这个编译就不会通过了!
      Student stu=tool.getQ();
      System.out.println(stu);
      //Student:  黛玉...16
   }
   @Test
   public void method5() {
      // 泛型类演示! 现在是以前的做法!看!
      Tools tool=new Tools();
      tool.setObj(new Student());
      tool.setObj(new Worker());//如果是没有使用泛型,这里传个Worker进去,编译也不会报错,
      Student stu=(Student)tool.getObj();//运行时,才会报错ClassCastException
      System.out.println(stu);
   }
   @Test
   public void method4() {
      // TreeMap演示泛型,
      //排序使用的传参,一个实现比较器接口的类(策略模式)
      TreeSet<Person> ts=new TreeSet<Person>(new ComparatorByName());
      //Set保证元素唯一,但无序!
      ts.add(new Person("lisi6",20));
      ts.add(new Person("lisi2",22));
      ts.add(new Person("lisi3",23));
      Iterator<Person> it=ts.iterator();
      while (it.hasNext()) {
         //使用泛型避免强转
         Person p =  it.next();
         System.out.println(p.getName()+"..."+p.getAge());
      }      
      /*
      lisi2...22
      lisi3...23
      lisi6...20*/
   }
   @Test
   public void method3() {
      // TreeMap演示泛型,排序使用的是对象的compareTo()方法
      TreeSet<Person> ts=new TreeSet<Person>();//Set保证元素唯一,但无序!
      ts.add(new Person("lisi6",26));
      ts.add(new Person("lisi2",22));
      ts.add(new Person("lisi3",23));
      Iterator<Person> it=ts.iterator();
      while (it.hasNext()) {
         Person p =  it.next();
         System.out.println(p.getName()+"..."+p.getAge());
      }
      /*
      lisi2...22
      lisi3...23
      lisi6...20*/
   }
   @Test
   public void method2() {
//      这是运行泛型以后的写法,注意比较
//      int[] arr=new int[6];
      ArrayList<String> al=new ArrayList<String>();//集合声明的时候就要明确容器里面数据类型
      al.add("晴雯");
      al.add("香菱");
      al.add("袭人");
//      al.add(4);//自动装箱:new Integer(4),定义了泛型,这样写就会报错;
      Iterator<String> it=al.iterator();
      while (it.hasNext()) {
         String str =it.next();//不需要类型强转,只要编译通过,就不会运行时报错ClassCastException
         System.out.println(str);
      }      
      /*晴雯
      香菱
      袭人*/
   }
   public void method1() {
      //首先回顾一下小例子,这是以前的写法
      //好多黄色的叹号,全报raw type
      ArrayList al=new ArrayList();
      al.add("abc1");
      al.add("abc2");
      al.add("abc3");
      al.add(4);//自动装箱:new Integer(4);
      Iterator it=al.iterator();
      while (it.hasNext()) {
         String str = (String) it.next();//类型强转,编译OK,但运行时会报错ClassCastException
         System.out.println(str);
      }
   }
}


GenericDemo2

package uncommitted;
import org.junit.Test;

//将泛型定义在接口上,位置和类上的泛型一样,在名称的后面<T>
interface InterfaceWithGeneric<T> {
   public void show(T t);
}
//泛型接口的实现1:类在实现接口的时候就已经想好了类型!
class IntImp1 implements InterfaceWithGeneric<String>{
   public void show(String s){
      System.out.println(s);
   }
}
//泛型接口的实现2:类在实现接口的时候仍然没有想好用什么类型!
class IntImp2<W> implements InterfaceWithGeneric<W>{
   public void show(W s){
      System.out.println(s);
   }
}
public class GenericDemo2 {
   @Test
   public void method2() {
      /*类在实现接口的时候仍然没有想好用什么类型!(类仍沿用接口的泛型)
      而在实例化对象的时候才晓得该使用什么类型!*/
      IntImp2<Integer> i2=new IntImp2<Integer>();
      i2.show(new Integer(4));
   }
   @Test
   public void method1() {
      //类在实现泛型接口的时候就已经想好了要使用的类型(此为String)
      IntImp1 i1=new IntImp1();
      i1.show("想眼中能有多少泪珠儿;怎经得秋流到冬尽;春流到夏!");
//      i1.show(new Integer(4));报错,因为类IntImp1在实现接口的时候就已经规定好了类型!
   }
}


GenericDemo3

package uncommitted;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeSet;

import org.junit.Test;

import bean.Person;
import bean.Student;
import bean.Worker;

//Eclipse快捷键:导入包:ctrl +shift+O
public class GenericDemo3 {
   @Test
   public void method5() {
      // 默认是按已实现Comparable接口的Person类的compareTo方法自然排序(按年龄排序);
      TreeSet<Person> ts1 = new TreeSet<Person>();
      ts1.add(new Person("袭人", 19));
      ts1.add(new Person("宝玉", 17));
      ts1.add(new Person("黛玉", 16));
      ts1.add(new Person("宝钗", 18));
      Iterator<Person> it = ts1.iterator();
      while (it.hasNext()) {
         System.out.println(it.next());
      }
      /*
       * 黛玉...16 宝玉...17 宝钗...18 袭人...19
       */
   }

   @Test
   public void method4() {
      /*
       * 一般在往集合里面增加(存入)的时候用的是上限(即父类)!!! 即排除掉那些不符合条件的元素,防止它们进来, 只允许同类及子类进入集合,
       * 取出元素操作的时候(都是按父类的方法操作), 所以不会出现方法不适合等错误!
       */
      ArrayList<Person> a1 = new ArrayList<Person>();
      a1.add(new Person("宝玉", 17));
      a1.add(new Person("黛玉", 16));

      ArrayList<Student> a2 = new ArrayList<Student>();
      a2.add(new Student("香菱", 19));

      ArrayList<Worker> a3 = new ArrayList<Worker>();
      a3.add(new Worker("袭人", 18));
      a3.add(new Worker("鸳鸯", 18));
      /*
       * 下面就把a3集合(Worker)一次全部添加到a1集合(Person)里面去, OK,没有问题!因为a3集合中的Worker继承自a1集合<Person>,
       * 是的a1集合子类!所以以后要取元素的时候, 按上限(即父类)的方法来进行取出等操作的时, 就不会出现任何问题!
       */
      a1.addAll(a3);
      System.out.println(a1.get(1));
      // 黛玉...16
   }

   @Test
   public void method3() {
      // 我只想打印出Student及其父类
      ArrayList<Worker> work_list = new ArrayList<Worker>();
      work_list.add(new Worker("鸳鸯", 18));
      work_list.add(new Worker("袭人", 18));
      ArrayList<Student> stu_list = new ArrayList<Student>();
      stu_list.add(new Student("香菱", 19));
      ArrayList<Person> person_list = new ArrayList<Person>();
      person_list.add(new Person("宝玉", 17));
      person_list.add(new Person("黛玉", 16));
      /*
       * showSuperOfStudent(work_list); 由于showSuperOfStudent方法人的参数:
       * 限定了list集合的成员只能是Student的父类, 所以传Worker会报错!
       */
      showSuperOfStudent(stu_list);
      showSuperOfStudent(person_list);
   }

   // 自定义方法:只打印出Student及其父类
   public void showSuperOfStudent(Collection<? super Student> coll) {
      Iterator<? super Student> it = coll.iterator();
      while (it.hasNext()) {
         /*
          * Person p=it.next();不能再这样转了 因为Object也是Student的超类,
          * 所以万万不能再用Person接收了!
          * System.out.println(p.getName()+"..."+p.getAge());
          * 同样,也不能再用Person的方法了
          */
         System.out.println(it.next());
      }
   }

   @Test
   public void method2() {
      // 只想打印出Person及其子类
      ArrayList<Worker> work_list = new ArrayList<Worker>();
      work_list.add(new Worker("鸳鸯", 18));
      work_list.add(new Worker("袭人", 18));
      ArrayList<Student> stu_list = new ArrayList<Student>();
      stu_list.add(new Student("香菱", 19));
      ArrayList<Integer> int_list = new ArrayList<Integer>();
      int_list.add(2013);
      int_list.add(2014);
      showSubOfPerson(work_list);
      showSubOfPerson(stu_list);
      /* showSubOfPerson(int_list);
      第3个集合会直接报错!
      因为已经限定? extends Person
      而Integer并不是的Person子类*/
   }
   // 自定义方法:只打印出Person及其子类
   //参数是个集合,并且集合的成员只允许是Person的子类
   public void showSubOfPerson(Collection<? extends Person> coll) {
      Iterator<? extends Person> it = coll.iterator();
      while (it.hasNext()) {
         //因为所有成员都规定了是Person的子类
         //所以,可以用超类Person接收~
         //并且,可以调用超类Person的方法
         Person p = it.next();
         System.out.println(p.getName() + "..." + p.getAge());
      }
   }
   @Test
   public void method1() {
      // 等号左右两边的泛型必须匹配!
      ArrayList<String> 咏白海棠 = new ArrayList<String>();
      咏白海棠.add("半卷湘帘半掩门");
      咏白海棠.add("碾冰为土玉为盆");
      咏白海棠.add("偷来梨蕊三分白");
      咏白海棠.add("借得梅花一缕魂");
      咏白海棠.add("月窟仙人缝缟袂");
      咏白海棠.add("秋闺怨女拭啼痕");
      咏白海棠.add("娇羞默默同谁诉");
      咏白海棠.add("倦倚西风夜已昏");
      ArrayList<Integer> a2 = new ArrayList<Integer>();
      a2.add(2013);
      a2.add(2014);
      printCollection(咏白海棠);
      printCollection(a2);
      /*半卷湘帘半掩门
      碾冰为土玉为盆
      偷来梨蕊三分白
      借得梅花一缕魂
      月窟仙人缝缟袂
      秋闺怨女拭啼痕
      娇羞默默同谁诉
      倦倚西风夜已昏
      2013
      2014*/
   }

   // 将打印(迭代)抽取为方法,提高复用!并且为了接收更多的参数进来,将方法printCollection中的参数ArrayList,改成其父类Collection
   // 通配符<?>代表接收任意类型的参数
   public void printCollection(Collection<?> coll) {
      Iterator<?> it = coll.iterator();
      while (it.hasNext()) {
         System.out.println(it.next());
      }
   }
   
    // 一旦把通配符<?>改成了<T>,那么T就可以参与运算,还可以作为参数返回 
   public <T> T printCollection2(Collection<T> coll) {
      Iterator<T> it = coll.iterator();
      while (it.hasNext()) {
         T t = it.next();
         if (t.toString() == "")
            return t;
      }
      return null;
   }
    
   
     public void showCollection(Collection<String> coll) {
      Iterator<String> it = coll.iterator();
      while (it.hasNext()) {
         //不需强转
         String str = it.next();
         System.out.println(str);
      }
   }
    
}


GenericDemo4

package uncommitted;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

import org.junit.Test;

import bean.Person;
import bean.Student;
public class GenericDemo4 {
   @Test
   public void method3() {
      /*下面按比较器<Person的比较方式>,对学生<Student>按姓名排序,这是可以的!
      因为Person是Student的父类,
      要求是:TreeSet<E>,比较器应该是<? super E>,
      即集合中的成员,使用其父类的方法,进行比较~
      即用E的父类<Person>来接收两个比较的对象<Student>,多态!
      比如下面这个:E是Student,比较器是Person,
      即用Person用为参数接收被比较的Student对象,多态!
      父类引用指向子类的实例!调用的还是子类的方法!
      TreeSet(Comparator<? super E> comparator) 
        构造一个新的空 TreeSet,它根据指定比较器进行排序。*/
      TreeSet<Student> ts1=new TreeSet<Student>(new CompByName());
      ts1.add(new Student("Student2",34));
      ts1.add(new Student("Student6",30));
      ts1.add(new Student("Student3",38));
      Iterator<Student> it=ts1.iterator();
      while (it.hasNext()) {
         System.out.println(it.next());
      }
      /*Student:  Student2...34
      Student:  Student3...38
      Student:  Student6...30*/
   }
   @Test
   public void method2() {
      //下面是按比较器<Person>,即姓名排序
      TreeSet<Person> ts1=new TreeSet<Person>(new CompByName());
      ts1.add(new Person("person4",34));
      ts1.add(new Person("person1",30));
      ts1.add(new Person("person2",38));
      Iterator<Person> it=ts1.iterator();
      while (it.hasNext()) {
         System.out.println(it.next());
      }
   }
   @Test
   public void method1() {
      // 默认是按已实现Comparable接口的Person类的compareTo方法自然排序(按年龄排序);
            TreeSet<Person> ts1=new TreeSet<Person>();
            ts1.add(new Person("黛玉",16));
            ts1.add(new Person("宝琴",15));
            ts1.add(new Person("宝玉",17));
            ts1.add(new Person("宝钗",18));
            Iterator<Person> it=ts1.iterator();
            while (it.hasNext()) {
               System.out.println(it.next());
            }
            /*宝琴...15
            黛玉...16
            宝玉...17
            宝钗...18*/
   }
}
/*下面就写个比较器类!来实现按姓名排序
泛型规定的是Person,
所以凡是Person的子类都可以(传进来,多态)
根据此比较器进行比较~*/
class CompByName implements Comparator<Person>{
   public int compare(Person o1, Person o2) {
      //根据Unicode value of each character in the strings排序
      int temp=o1.getName().compareTo(o2.getName());
      return temp==0?o1.getAge()-o2.getAge():temp;
   }
}





































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值