Java day9

一:保存键值对(key—value)

如保存是否打开音效,是否打开振动,当前分数,历史最高分,关数。。。
Map:定义保存键值对的规范(key不能重复,value可重复)
————HashMap:是线程不安全,效率高,HashMap允许null key和null value,
————HashTable:是线程安全,Hashtable不允许null key和null value,
——SortedMap:定义在Map的基础上进行排序的规范(根据key排序)
————TreeMap:对map进行排序。

二:Map类中的方法:HashMap,Hashtable

put(Object key,Object value):添加数据到map集合中
Set keySet():将map中所有的key取出来放在set集合中
Object get(Object key):从map集合中根据key获取数据。
Set entrySet():将map中的key和对应的value重新创建成新的对象(Map.Entry)放在set集合中。
Map.Entry:getKey()
Map.Entry:getValue()
Set values():将map中所有的value取出来放在collection集合中
interface Map{
static interface Entry{

}

}

三.Collections类和Collection的区别

Collections是工具类,提供了操作集合的静态方法。
Collection是接口
Arrays是数组的工具类
List l=Arrays.asList(56,7,86,89,56);

四:String,StringBuffer,StringBuilder

String:不可变长的字符串
StringBuffer:可变长字符串,线程安全
StringBuilder:可变长字符串,线程不安全

String s=“hello”+“world”+“briup”;

五:泛型 Generics,很重要的新特性—参数化类型

1:why?jdk1.5前后没有泛型和有泛型分别解决下面的问题
1.集合中使用:
jdk1.5之前:1)添加对象都为Object,
不会进行数据类型的检查。
2)操作时需要对其进行强制类型转换。
很容易引发ClassCastException异常
jdk1.5之后:使用泛型
a)检查数据类型,将错误尽量控制到编译器
使用泛型的主要是用于集合在add添加数据时,编译器对数据类型的检测。
如果不满足泛型中定义的数据类型就添加不成功。
b)另外在操作集合中的数据时不需要进行强制类型转换。
取数据的类型是放进去的类型,减少发生 ClassCastException异常。

2:泛型实现的机制:类型擦除
ArrayList ArrayList —>ArrayList
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带来类型说明的集合时会去除掉"类型"信息,使程序运行效果不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样,由于编译生成的字节码会去掉泛型的类型信息,只要跳过编译器,就可以往某个泛型集合中加入其他类型的数据,例如:用反射得到集合,再调用add方法即可。

3:what? List
弱类型:List list,放任意类型
强类型:List list,放指定类型
在Java SE 1.5之后,推出泛型。也称之为参数化类型.也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下
通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实
际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类
型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率
泛型把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。一些强类型编程语言支援泛型,
其主要目的是加强类型安全及减少类转换的次数。

当集合没有使用泛型的时候,集合中可以添加任何类型的数据。
当集合使用泛型的时候,集合中只能添加该泛型及泛型的子类。
List list = new ArrayList();
list.add(“hello”);
list.add(1); //error

4:术语:ArrayList类定义和ArrayList类引用中的术语:
1)整个称ArrayList为泛型类
2)E称为类型变量或类型参数,满足标识符命名规则,一般写大写字母。E,K,V,T

3)整个ArrayList称参数化类型
4)Integer称为类型参数的实例或实际类型参数
5)<>念typeof
6)ArrayList称原始类型

5:参数化类型与原始类型的兼容性
a)参数化类型可以引用一个原始类型:编译器警告
List list = new ArrayList(); 这个时候只能添加String类型
b)原始类型可以引用一个参数化类型:编译器警告(新的程序可不可以兼容旧的程序)
List list = new ArrayList(); 这个时候可以添加任何对象
c)jdk1.7的菱形语法(钻石语法),代码更加简单。
List list = new ArrayList<>();
d)参数化类型不考虑类型参数的继承问题(泛型是不存在子父类的)
泛型中子父类不能指向的
List list = new ArrayList(); //error
泛型中不同类型也是不能指向的
List list = new ArrayList(); //error
泛型中不能使用基本数据类型,只能使用引用类型
List list = new ArrayList(); //error
e)在创建数组实例时,数组的元素不能使用参数化的类型
List[] listList = new List[10]; ///error
但是可以使用这样的格式T[].
任意Collection转化成对应数组。
Collection
Collection

思考题:下面这段代码是否正确

a)泛型只是在编译阶段中有用,编译阶段检测语法错误(看静态数据类型)
Vector v1 = new Vector();
Vector v = v1;
Vector v2 = v;
b)操作Map的泛型测试,并完成三种泛型遍历的方式。

6:通配符?(匹配任意一个数据类型)
? :匹配任意一个数据类型
List<?> list = new ArrayList();
list = new ArrayList();

<? extends superclass>:上界限定,匹配superclass及superclass的子类。 List<? extends Number> list = new ArrayList(); list= new ArrayList(); list = new ArrayList(); //error <? super subClass>:下界匹配 匹配subClass及subClass的超类。 List<? super Collection> list = new ArrayList(); list = new ArrayList(); list = new ArrayList (); //error 使用通配符不能进行add的添加, 在编译的时候没有指定数据类型, 所以只能添加null. ****:?一般在申明方法的时候使用 问题:定义一个方法打印任何一种类型的Collection集合 public static void printCollection(Collection<?> c){}

问题:定义一个方法打印Number类型的Collection集
public static void printCollection(Collection<? extends Number> c){}

7:自定义泛型类,泛型方法,泛型接口
1)自定义泛型类,泛型参数必须满足命名规则,但是一般建议大写字母E,T,K,V
a)带有一个泛型参数的泛型:GenericsList.java
eg: public class 类名<泛型参数列表>{
//类体
}

    b)带有多个泛型参数的泛型:GenericsMap.java
    eg:  public class 类名<泛型参数列表>{
          //类体
    }
  c)属性为数组或者集合的泛型类
  d)泛型类继承泛型类

2)自定义泛型接口
    public interface 接口名<泛型参数列表>{
          //类体
}
3)自定义泛型方法:
   a)泛型方法在泛型类中,它的定义和普通方法是一样的。
     public void print(T t){
	System.out.println(t);
     }
   b)泛型方法在普通类中,该方法需要在返回值类型前加上泛型<泛型参数>
     eg:
     public <T>void print(T t){
	System.out.println("hello");}

泛型类的练习:

1.自定义一个泛型类
2.自定义point类(x,y的数据类型是Number类型的)
class Point<E1 extends Number,E2 extends Number>{}
3.定义一个类解决两个数的四则运算。
泛型方法的练习:
问题1:交换任何List集合中的两个值的位置
public void change(List list,int x,int y){}

问题2:将任意类型的Collection集合的数据转换成相应的数组对象。
public void toArray(Collection coll,
E[] array){
//…
}

public E[] toArray(Collection coll,
E[] array){
//…
}

注意:对于泛型的掌握
1)在集合中使用泛型
2)能够定义简单的泛型类

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值