黑马程序员_java基础增强

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

哈希算法来提高从集合中查找元素的销量,这种方式将集合分成若干个存储区域,每个
对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个
对象的哈希码就可以确定该对象应该存储在哪个区域
只有对象在hash集合里面hashcode才有作用
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的某些参与计算哈希值的字段了
否则,对象修改后的哈希值与原来的就不一样了
java中有内存泄露吗?为什么?
对象不用了,但是对象没法释放

	public static void main(String[] args) {
		Collection collections = new HashSet();
		ReflectPoint pt1 = new ReflectPoint(3, 3);
		ReflectPoint pt2 = new ReflectPoint(5, 5);
		ReflectPoint pt3 = new ReflectPoint(3, 3);
		collections.add(pt1);
		collections.add(pt2);
		collections.add(pt3);
		pt1.y =7;
		collections.remove(pt1);
		collections.add(pt1);
		
		System.out.println(collections.size());
	}


这样  collections.remove(pt1);这句话就没起作用,因为其中的pt1的hashcode值改变了,这样就造成了内存泄露

反射的作用:实现框架功能
因为在写程序时无法知道要被调用的类名,所以,在程序中无法直接new 某个类的实例对象了,而要用反射方式来做。
综合案例:
如何采用配置文件加反射的方式创建ArrayList和HashSet的实例对象
首先写个配置文件
config.properties文件,这个文件直接在项目中建,配置文件中有下列代码:
className = java.util.ArrayList
如何运用配置文件的方式:

	InputStream ips = new FileInputStream("config.properties");
		Properties props = new Properties();
		props.load(ips);  //加载配置文件
		ips.close();      //windows 的窗口,把win内存释放
		String className = props.getProperty("className");
		Collection collections = (Collection)Class.forName(className).newInstance();




InputStream ips = new FileInputStream("d:\\config.properties");注意在实际的开发中不会出现这样的相对路径
通过getRealPaht();//获得项目的实际路径然后加上配置文件的路径
一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的
当然也可以通过以下方式加载:
ReflectTest2.class.getClassLoader().getResourceAsStream("config.properties");这种方式只需要用配置文件的名字就可以不用设置绝对路径了
不管是相对路径还是绝对路径但是其中用的都是类加载器

内省:IntroSpector     主要用于对JavaBean进行操作
JavaBean是一个特殊的Java类,方法的名字符合某种规则
如果第二个字母是小的,则把第一个字母变成小的
getCPU------>CPU
gettime------>time
getTime----->time
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省,如果自己通过getX()
方法来访问私有的X,用内省这套api就比较简单
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问
私有的字段,且方法名符合命名规则


String propertyName = "x";
		PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
		Method methodGetX = pd.getReadMethod();
		Object retVal = methodGetX.invoke(pt1);
		System.out.println(retVal);
		
		Method methodSetX = pd.getWriteMethod();
		methodSetX.invoke(pt1, 7);
		
		System.out.println(pt1.getX());


一下代码是将一个java类当做java bean来看待
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
一些专门针对java bean 操作的工作类:apache的Beanutils jar包
ReflectPoint pt1 = new ReflectPoint(3, 5);
BeanUtils.setProperty(pt1,"birthday.time","111");
这样就可以对进行设置
java7 的新特性  map的
Map map = { name:"zxx",age:18};可以这样对map里面的值赋值
BeanUtils.setProperty (map ,"name", "zxx");
java的注解:未来的两年以后注解用的越来越多了
JDK1.5的新特性:注解是用于告诉编译器的一个注解相当于一个类
@Deprecated定义一些东西过时了,当有这个注解时会出现线被划掉

加个注解@override 如果报错的话说明没有覆盖父类的方法
注解就是一个标记,加了注解就相当于对程序进行了标记,加了什么标记,就去干相应的动作
注解可以加载方法上面,也可以加载包、类、成员变量、方法的参数、局部变量上面都可以
注解就相当于一个特殊的类
@interfaceA {
}这个就是注解类
下面是一个注解的例子:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;






@Retention(RetentionPolicy.RUNTIME)
//在注解上加注解,叫元注解
//定义注解在运行时
@Target({ElementType.METHOD,ElementType.TYPE})
//说明注解可以用在哪个成分上面
public @interface ItcastAnnotation {


}
一个注解的生命周期:
java源文件----->class文件---->内存中的字节码
@Override 保留在java源文件
@SuppressWarning  保留在java文件
测试注解的文件
@ItcastAnnotation
public class AnnotationTest {
	
	public static void main(String[] args) {
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
			ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			System.out.println(annotation);
		};
	}
}


class只是java中的一种类型而已,class的爸爸是type
怎么为注解增加属性?
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;






@Retention(RetentionPolicy.RUNTIME)
//在注解上加注解,叫元注解
//定义注解在运行时
@Target({ElementType.METHOD,ElementType.TYPE})
//说明注解可以用在哪个成分上面
public @interface ItcastAnnotation {
	String color();  //注解的属性color
}
@ItcastAnnotation(color = "red") //用注解的时候需要传入值
public class AnnotationTest {
	
	public static void main(String[] args) {
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
			ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			System.out.println(annotation.color());
		};
	}
}


String color() default "blue";  


//可以指定默认值为blue

如果一个注解只有一个属性时,可以直接在注解后面的括号中传入一个相对于的值不用穿name
如果注解的属性为数组的话则:arrayAttr = {1,2,3}
如果数组只有一个元素的话,可以省略大括号也可以 arrayAttr = 1;这样
EnumTest.TrafficLamp lamp()  //枚举类型的注解
NetAnnotation annotationAttr() default @NetAnnotation("1hm")  //注解类型的属性
如果在使用注解的时候传入的有值的话,则默认的值不管用了


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值