-------
android培训、
java培训、期待与您交流! ----------
泛型格式: 通过<>来定义要操作的引用数据类型
?通配符, 也可以理解为占位符 表示任意
泛型的限定:
? extends E :可以接收 E类型或者E的子类型。 上限
? super E :可以接收E类型或者E的父类型。 下限
例子5:
简单测试例子:
泛型:JDK1.5版本之后出现的新特性 用于解决安全问题,是一个类型安全机制
好处:
1.将运行时期出现问题ClassCastException,转移到了编译时期
方便于程序员解决问题,让运行好事情问题减少,安全
2.避免了强制转换麻烦
1.将运行时期出现问题ClassCastException,转移到了编译时期
方便于程序员解决问题,让运行好事情问题减少,安全
2.避免了强制转换麻烦
泛型格式: 通过<>来定义要操作的引用数据类型
在使用java 提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见
只要见到<>就要定义泛型
其实<>就是用来接收类型的
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早起定义Object来完成扩展
现在定义泛型来完成扩展
例子1:
<strong>public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("alg");
list.add("ngdt");
list.add("qwwfe");
// list.add(4); 这会在编译时报错,因为数据类型不一致
// 其实,List存储的是对象类型,而基本类型先经过自动装箱拆箱放入List集合中
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s+":"+s.length());
}
}
}</strong>
例子2:
<strong>public class GenericDemo01 {
public static void main(String[] args) {
TreeSet<String> tree = new TreeSet<String>(new MyComparator());
tree.add("a");
tree.add("alg");
tree.add("akk");
tree.add("qwwfe");
tree.add("ngdt");
Iterator<String> it = tree.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
class MyComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));
if(num == 0 ){
return o1.compareTo(o2);
}
return num;
}
}</strong>
泛型类定义的泛型,在整个类中有效,如果被方法使用
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
为了让不同方法可以操作不同类型,而且类型还不确定
那么可以将泛型定义在方法上
特殊之处:
静态方法不可以访问类上的定义的泛型
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上
例子3:
<strong>//在类名中定义泛型
class Demo<T>{
public void show(T t){
System.out.println("show :" + t);
}
public void print(T t){
System.out.println("print :" + t);
}
public static <W> void method(W w){
System.out.println("method:" + w);
}
}
//在方法中定义泛型 (根据自己的需要进行选择定义)
class Demo01{
public <T> void show(T t){
System.out.println("show :" + t);
}
public <T> void print(T t){
System.out.println("print :" + t);
}
}
public class GenericDemo03 {
public static void main(String[] args) {
//将泛型定义在类中,整体都是泛型
Demo<String> d = new Demo<String>();
d.show("hello");
d.print("work");
d.method("静态方法");
//方法中能定义多种类型
Demo01 e = new Demo01();
e.show("i am String");
e.print(new Integer(3));
}
}</strong>
例子4:
<strong>/*
泛型定义在接口上
*/
interface Inter<T>{
void show(T t);
}
class InterImp01 implements Inter<String>{
@Override
public void show(String t) {
System.out.println(t);
}
}
class InterImp<T> implements Inter<T>{
@Override
public void show(T t) {
System.out.println(t);
}
}
public class GenericDemo04 {
public static void main(String[] args) {
InterImp01 i = new InterImp01();
i.show("interImp");
InterImp<Integer> n = new InterImp<Integer>();
n.show(4);
}
}</strong>
?通配符, 也可以理解为占位符 表示任意
泛型的限定:
? extends E :可以接收 E类型或者E的子类型。 上限
? super E :可以接收E类型或者E的父类型。 下限
例子5:
<strong>public class GenericDemo05 {
public static void main(String[] args) {
/* ArrayList<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
ArrayList<Integer> list01 = new ArrayList<Integer>();
list01.add(1);
list01.add(2);
list01.add(3);
list01.add(4);
printColl(list);
printColl(list01);
*/
ArrayList<Person> list02 = new ArrayList<Person>();
list02.add(new Person("lisi__01"));
list02.add(new Person("lisi__02"));
list02.add(new Person("lisi__03"));
list02.add(new Person("lisi__04"));
showColl(list02);
ArrayList<Student> list03 = new ArrayList<Student>();
list03.add(new Student("student__01"));
list03.add(new Student("student__02"));
list03.add(new Student("student__03"));
list03.add(new Student("student__04"));
showDownColl(list03);
}
//上限方式
public static void showColl(ArrayList<? extends Person> list){
Iterator<? extends Person> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next().getName());
}
}
//下限方式
public static void showDownColl(ArrayList<? super Student> list){
Iterator<? super Student> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next().toString());
}
}
//迭代器的遍历
public static void printColl(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class Person{
private String name;
Person(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Person{
Student(String name){
super(name);
}
}</strong>
例子6:
<strong>/*
* TreeSet泛型父类继承比较
*
*/
public class GenericDemo06 {
public static void main(String[] args) {
TreeSet<Student> tree = new TreeSet<Student>(new Compa());
tree.add(new Student("student__02"));
tree.add(new Student("student__02"));
tree.add(new Student("student__01"));
tree.add(new Student("student__04"));
tree.add(new Student("student__03"));
Iterator<Student> it = tree.iterator();
while(it.hasNext()){
System.out.println(it.next().getName());
}
TreeSet<Work> work = new TreeSet<Work>(new Compa());
work.add(new Work("work__03"));
work.add(new Work("work__01"));
work.add(new Work("work__04"));
work.add(new Work("work__02"));
Iterator<Work> i = work.iterator();
while(i.hasNext()){
System.out.println(i.next().getName());
}
}
}
class Compa implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
class Work extends Person{
Work(String name) {
super(name);
}
}</strong>
例子7:
class Worker {
}
class Utils<E> {
private E e;
public E getObject() {
return e;
}
public void setObject(E e) {
this.e = e;
}
}
public class GenericDemo02 {
public static void main(String[] args) {
Utils<Worker> u = new Utils<Worker>();
u.setObject(new Worker());
Worker w = u.getObject();
}
}
1.基本数据类型对象包类
byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char Charcter
2.基本数据类型转换成字符串
基本数据类型呢+""
基本数据类型呢.toString(基本数据类型值)。
如:Interger.toString(34);//将34转换成为"34"
3.字符串转换成基本数据类型
int a = Integer.parseInt("123");
double b = Double.parseDouble("12.34");
boolean b = Boolean.parseBoolean("true");
Interger i = new Integer("123");
int num = i.intValue();
4.十进制转成其他进制
toBinaryString();二进制
toHexString();十六进制
toOctalString();八进制
5.其他进制转换成十进制
parseInt(String str,int radix);//radix表示进制数
测试例子1:
public class IntegerDemo {
/**
* @param args
*/
public static void main(String[] args) {
//整数类型的最大值
print("int max:"+ Integer.MAX_VALUE);
//整数类型的最小值
print("int min:" + Integer.MIN_VALUE);
//将一个字符串转成整数
int num = Integer.parseInt("123"); //必须输入数字格式,否则或抛出异常
print("num+4:" +( num +4));
long num_ = Long.parseLong("123456789"); //必须输入数字格式,否则或抛出异常
print("num_+4:" +( num_ +4));
//十进制转化二进制
print(Integer.toBinaryString(5));
//十进制转换十六进制
print(Integer.toHexString(60));
//十进制转换八进制
print(Integer.toOctalString(8));
//二进制转十进制
print(Integer.parseInt("110", 2));
//八进制转十进制
print(Integer.parseInt("10", 8));
//十六进制转十进制
print(Integer.parseInt("3c", 16));
}
public static void print(Object obj){
System.out.println(obj.toString());
}
}
简单测试例子:
/*
JDK1.5版本以后出现的新特性
*/
public class IntegerDemo01 {
public static void main(String[] args) {
// Integer x = new Integer("4");
Integer x = 4; //自动装箱 相当于new Integer("4");
x = x + 2; //x+2 x进行自动拆箱,变成int类型数据与2进行运算,得到结果再进行装箱
Integer m = 128;
Integer n = 128;
System.out.println(m==n); //结果:false
Integer a = 127;
Integer b = 127;
System.out.println(a==b); //结果是:true
//因为a和b指向同一个Integer对象
//因为当数值在byte(-128~127)范围内容,对于新特性,如果该数值已经存在,则不会再开辟新的内存空间
Integer y = new Integer("123");
Integer z = new Integer(123);
System.out.println("y==z"+(y==z)); //false 因为y z分别是两个对象
System.out.println("y.equals(y)"+x.equals(y)); //true 两个数值是一样大小的
}
}