黑马程序员_java基础增强

来源:互联网 发布:如何关闭淘宝店铺 编辑:程序博客网 时间:2024/04/29 20:48

------- 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文件测试注解的文件@ItcastAnnotationpublic 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")  //注解类型的属性
如果在使用注解的时候传入的有值的话,则默认的值不管用了