-------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---
12.hashCode的作用:高效地从集合中查找元素。
(1)每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别别对应某个存储区域。
将新元素放入时就只与部分元素比较就可以。所以,一个类的hashCode()方法只有在hashset中
才有意义。(2)当一个对象被存入HashSet中后,就不能修改这个对象中
的那些参与计算哈希值的字段,否则,对象修改后的哈希值与
原来不同。即使用contains也检索不到对象。
(3)所谓内存泄露,就是对象不需要时,无法删除释放内存
(1)类加载器ClassLoader可以加载普通文件
InputStream is=ReflectTest2.class.getResourceAsStream ("config.properties");
但只能读不能写
(2)读取键值:props.getProperty("className");
JavaBean的方法的命名符合一定规则
如getAge(),对应的属性是Age,如果第二个字母是小写的,则变为age
如果要在两个模块之间传递多个信息,可以将这些信息封装在
一个javabean中,叫做值对象——VO
(1)采用JavaBean读取设置对象属性:
PropertyDescriptor pd=new PropertyDescriptor("propertyName",obj.getClass());
Method getX=pd.getReadMethod();
Object retVal=getX.invoke(obj);
(2)采用BeanInfo读写属性。
BeanInfo beanInfo=IntroSpector.getBeanInfo (object.getClass())
(3)使用BeanUtil工具包。BeanUtil中有大量静态方法用于读
写对象的属性。输入输出除了对象外都是字符串形式.
BeanUtils.getProperty(pt1,"x");
BeanUtils.setProperty(pt1,"x","9");
BeanUtils.setProperty(pt1,"birthday.time","111");
把对象属性导入Map:
Map map=BeanUtils.describe(pt1);
map:x:"+map.get("x")
把Map导入对象:popular(obj,map)
读写Map:BeanUtils.setProperty(map2,"name","jyz")
BeanUtils.getProperty(map2,"name")
(如果BeanUtils类型转换不准确时,可以用 java.PropertyUtil)
15.注解
@Override 覆盖父类方法@Deprecated 方法过时
注解类:
(1)a。注解类:@interface A{}
b。应用了“注解类”的类:@A ClassB{}
c。对 “应用了注解类的类”进行反射的类:
Class C{B.class.isAnnotatiionPresent(A.class);
A a=B.class.getAnnotion(A.class);}
负责检查b是否符合注解
(2)元注解:有3种:@Retention(RetentionPolicy.RUNTIME)
@RetentionPolicy.SOURCE
@RetentionPolicy.CLASA
分别表示注解保留 运行时,源文件,class文件阶段
(class文件只有加载进类加载器后才会转变为字节码)
(Class,enum,interface,@interface 都属于Type)
(3)注解的属性:
a。一般属性:class xx()default 默认值;
注解时,@xxx(xx1=...,xx2=...)
b。特殊属性:class value();
当只有这一个属性或其他属性都有默认值的时候。进行注解时,
可以省略Value=,直接@xxx("...")
c。数组属性:class[]xxx()default 默认值;16.泛型
(1)没泛型之前容器容纳Object类型,取出之后要强制类型转
换。容易出错。
(2)声明:List<String> list=new ArrayList();
而List list=new ArrayList<String>写法无效。
(3)类型声明只作用于编译阶段,用于给编译器检查。
List<String>.Class==List<Integer>.Class
(4)在容器用了泛型后,也可以利用反射往其中加入不同类型
的元素,绕过编译器检查。
(5)参数类型只能是引用类型参数化类型不能组成数组。参数
化类型不考虑类型参数的继承关系。
Vector<String> v=new Vector<Object> 不合法!反之也不合法
Vector v1=new Vector<String>();
Vector<Object> v2=v1; 合法!注意区分编译时和运行时。
//总结:引用的类型决定改引用可用的方法!
(6)a。泛型中的?通配符。用于函数参数中,如:
void function(Collection<?> collection){}
在函数体中,用了通配符之后,不能用引用去调用与参数类型
有关的方法。 Collection<Object>coll=collection 合法!
b。<?extends Number>向下限定符,
Vector<?extends Number>x=new Vector<Integer>();合法!
<?super Integer>向上限定符,
c。还可以限定多个边界(可以是父类,也可以是接口)。
限定符的范围总是包含自身。
(7)泛型的应用。
Map集合的Entry元素符合javaBean规则,在jsp页面中可以对它 进行迭代。
(8)类型推断:定义函数<T>function(T x, T y){}
当输入的x和y类型不同时也可以通过,这时返回值T是x和y
的共同最低父类
(9)类型变量的作用范围:class Xxx<T>{}全类
public <E> retClass FunName(E e,T t){}全函数
类的类型变量需要创建对象时才能确定,而静态方法不创建
对象就能调用。所以方法中如果使用了类的类型变量,就不能
声明为静态!
(10)还可以用类型变量表示异常,称为参数化类型。可以用 于
方法的throws列表中,但不能用于catch子句。
(11)Object与泛型比较:当函数有多个不确定类型的参数,
且参数之间类型相同,应该用泛型,因为Object是所有类的基
类,任何类型都能传进来,不能保证正确的操作。
public class GenericTest {
public static void main(String[] args){
Method method=GenericTest.class.getMethod("applyVector",Vector.class);
Type[] types=method.getGenericParameterTypes();
ParameterizedType pType=(ParameterizedType) types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);}
public static void applyVector(Vector<Date> v){}
}
17.ClassLoder类加载器。jvm中类加载器有3种:
BootStrap->ExtClassLoader->AppClassLoader
除了BootStrap是c语言写的,其他类加载器本身都是都是类。
(1)类加载器的管辖范围:
Bootstrap:JRE/lib/rt.jar
ExtClassLoader: JRE/lib/ext/*.jar
AppClassLoader: CLASSPATH指定的所有jar或目录
(2)类加载器的委托机制:
这3个类是父子关系,当某个类加载器要载入类时,把加载任务
级传给父加载器,直到BootStrap。然后BootStrap寻找类,
找不到则逐级往下,直到到到类,若最终没找到这报异常。
(3)自定义类加载器:
a。继承ClassLoader
b。覆盖findClass()
c。调用父类的defineClass()把class文件转变为字节码。
-------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---