------- android培训、java培训、期待与您交流! ----------
一、与hashCode有关的集合
当对象存储在hashCode集合中,就不要再更改参与hashCode计算的值了,不然会修改原本的hashCode,就无法再曾经的区域找到原来的对象了。就无法remove移除该值的,这就解释了内存无端变小的一种情况,内存泄漏。
集合是hashCode算法的集合,hashCode算法才有意义。
import java.util.HashSet;
import java.util.Set;
public class HashCodeTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Person> set = new HashSet<Person>();
Person p1=new Person(10);
Person[] p = new Person[2];
set.add(p1);//set中一个元素
p1.setAge(11);//p1的age改成11
System.out.println(set.remove(p1));//移走P1,输出false,说明p1没有被移走
System.out.println(set.contains(p1));//输出false,集合中不包含p1,说明p1不在集合中
System.out.println(set.size());//结果为1.说明拍p1没有被移走
p= set.toArray(p);//将set中的所有元素变成p数组
System.out.println(p[0]);//输出为11,说明set集合中还有年龄为11的这个对象
}
}
class Person {
int age;
Person(int age){
this.age=age;
}
public void setAge(int age){
this.age=age;
}
@Override
public boolean equals(Object obj) {
Person p = (Person)obj;
if(this.age==p.age){
return true;
}
return false;
}
@Override
public int hashCode(){
return age+age*34;}
@Override
public String toString(){
return String.valueOf("person"+age);
}
}
二、JavaBean类。
IntroSpector 内省
用于对JavaBean,这是一个特殊的Java类
class Person{
private int x;
public int getAge(){return x;}
public void setAge(int age){this.x = age;}
}
在外部来看,只有一个Age属性,不知道局部变量是什么,也不用管
以get和Age打头方法的类叫做java类
用于给外部使用,所以都应该是public类型
如果第二个字母是大写的,则把第一个字母变成大写的,例如
gettime-->time属性
getTime-->time属性
getcPU-->CPU属性
使用内省方式,对javabean进行set和get
通过反射得到javabean的方法:
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class JavaBeanDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Point point = new Point(3, 5);
Object value = methodGetX(point,"x");
System.out.println(value);
SetMethod(point, "x",7);
System.out.println(point.getX());
}
private static Object methodGetX(Object obj,String PropertyName) throws Exception {
PropertyDescriptor pDescriptor =new PropertyDescriptor(PropertyName, obj.getClass());
Method methodGetX = pDescriptor.getReadMethod();
Object retval = methodGetX.invoke(obj);
return retval;
}
private static void SetMethod(Object point, String propertyName,
Object value)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pDescriptor2 =new PropertyDescriptor(propertyName, point.getClass());
Method methodSetX = pDescriptor2.getWriteMethod();
methodSetX.invoke(point,value);
}
}
class Point{
private int x ;
private int y;
public Point(int x,int y) {
// TODO Auto-generated constructor stub
this.x= x;
this.y= y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
注解
@Deprecated过时
@Override
@SuppressWarnings("deprecation")错误提示
@Retention(RetentionPolicy.RUNTIME)//保持到运行时,用于注解注解要保持到运行时。
注解的生命周期,源文件àclass文件à内存中的字节码,默认是class阶段
packagecom.itheima.day2;
public class AccotationTest {
/**
* @param args
*/
@SuppressWarnings("deprecation")//告诉开放工具,或者是javac编译器,不用再提示过时,一个注解是一个类。该处创建该类实例对象
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
}
@Deprecated//过时
public static void sayHello(){
System.out.println("sss");
}
@Override//覆盖
public String toString(){
return"000";
}
}
注释可以注释的地方
ANNOTATION_TYPE
注释类型声明
CONSTRUCTOR
构造方法声明
FIELD
字段声明(包括枚举常量)
LOCAL_VARIABLE
局部变量声明
METHOD
方法声明
PACKAGE
包声明
PARAMETER
参数声明
TYPE
类、接口(包括注释类型)或枚举声明
java1.5 新特性,枚举,注解
元信息//信息的信息
元数据//数据的数据
元注解//注解的注解
枚举举例
public class EnmuTest{
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Trafficlamp trafficlamp1 =Trafficlamp.Red;
Trafficlamp trafficlamp2= Trafficlamp.Red.nextLamp();
System.out.println(trafficlamp1.getTime());
System.out.println(trafficlamp2.getTime());
}
public enum Trafficlamp{
Red(30){
public Trafficlamp nextLamp() {
return Green;
}//new一个新对象,使用父类带构造参数的构造方法创建一个带time值为30的子类实例,对其覆写父类的抽象方法。
},
Yellow(5){
public Trafficlamp nextLamp(){
return Red;
}
},
Green(40){
public Trafficlamp nextLamp(){
return Red;
}
};
public abstract Trafficlamp nextLamp();
private Trafficlamp(){};
private int time;
private Trafficlamp(int time){
this.time=time;
}//指定父类构造方法中带参数
public int getTime(){
return time;
}//定义一个公用的获取子类构造时的参数time
}
}