黑马程序员_JAVA基础加强

  ------- 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
	}
	
}


    ------- android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值