java核心技术笔记

  1. 枚举类型:实际仍为类,继承Enum。继承了许多有用的方法,toString() 静态的values()返回包含全部枚举值的数组。ordinal()返回枚举常量的位置,从0开始。valueOf()返回枚举类实例。与toString 相反。枚举类的构造函数是私有的。

  2. 反射:可以在运行时根据指定的类名获得类的信息。Class.forName() object.class object.getClass().getName() 反射:可以在运行时根据指定的类名获得类的信息。Class.forName() object.class object.getClass().getName()
    getDeclaredFieds() 获取类中所有域的集合Fied[]. f.get(obj)获取域值。
    getDeclaredMethods() 获取类中所有方法的集合Method[]. m.invoke()

  3. 接口:只是描述这个类有什么功能,而不作具体的描述。instanceof 可以检测某个对象是否属于某个类,同时可以用instanceof来检测是否属于某个接口。注意接口中不能包含实例域.但是可以有常量。java单继承多实现,所以抽象类解决不了的问题接口可以解决。我们现在考虑这样一种情况,如果一个类实现的俩个接口中有相同的方法,会怎么办?如果不实现自然是抽象类,其实编译器会提示你进行选择覆盖相同 的方法。

  4. Comparable 和Comparator 区别
    Arrays.sort()可以对实现了Comparable接口的对象数组排序,例如可以对String类按字母顺序排序,但是想根据字符串长度排序便需要重写String 类,显然不可能。这时便可以使用Comparator.对象必须创建一个实现Comparator的比较器。然后Arrays.sort(objArray,comparator)

  5. protected是包内其他类可见,其他包子类可见。但是你在子类中实例化一个父类的其他子类得到的对象,并不能访问父类的protected方法。也不能通过通过实例化父类对象来访问父类方法;在同包的其他类中,也不能实例化子类来访问父类的protected。会出现clone()’ has protected access in 'java.lang.Object’类似飘红提示;

  6. lambda表达式:形式就是参数,箭头(->)以及一个表达式。疑惑:(String a,String b)->(a.length- b.length)是个什么东西?
    我们知道java有很多封装代码块的接口,当接口只有一个抽象方法时,就可以提供一个lambda表达式来替代实现这个接口的对象,这种接口称为
    函数式接口。比如ArrayList 有一个removeIf(Predicate p);这个predicate就是只有一个抽象方法。那么我们便可以

    		public interface Predicate<T>{
                boolean test(T t);
                //additional function
            }
            list.removeIf(e->e==null);
    	
    

    如果没有lambda表达式,则需要定义一个类实现Predicate接口,然后实例化。(实例化一个内部类) 比较麻烦,lambda代码一行搞定。
    内部类 内部类可以访问该类定义所在的作用域中的私有数据。并且对同一包中的其他类不可见。想要定义一个回调函数,而又不想定义类编写 大量代码,可以考虑匿名内部类。

     new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.print("算我求你了");
                }
            }).start();
    

    对于事件监听和其他回调,利用lambda表达式改写也更为简单:

    new Thread(()->{System.out.print("please! beg you");}).start();
    
  7. 代理:在编译时无法确定创建实现哪些接口的类,只有在运行时才确定创建实现一组给定接口的类,可以利用代理。静态代理是代理类与 被代理
    类实现相同的接口。动态代理是创建调用处理器、创建代理对象等等。

  8. 异常处理:java中的异常类均派生于Throwable 类,分为RunTimeException(数组越界,null,类型转化) 和IOException(找不到文件、Class.forName()类名错误) 异常相关工作就是抛出异常处理异常。try{}catch(){}finally{} try中的代码块出现catch中捕获的异常那么将会停止执行剩余代码,转而执行catch中的处理代码,若为抛出异常则跳过catch代码块
    我们都知道 在捕获一定的异常时需要在finally中关闭资源如数据库连接,但是关闭的时候也可能出现异常就需要再次try catch。其实
    我们可以使用带资源的try语句。try(Resource res = …){work with resource}
    try(Scanner in = new Scanner(new FileInputSystem(“path”)),“utf-8”){while(in.hasNext()){System.out.println(in.next)}}

  9. 泛型:泛型类型通配符可以使得类型参数变化,比如Pair<? extends Employee> 可以明显的看到好处是访问器方法安全而更改器方法不能
    随意更改。因为在设置的时候编译器只知道是Employ类型但是并不知道具体是那个类型。所以设置会显示错误。
    泛型的超类型限定,相反可以向泛型对象写入,但是不能读。

  10. 集合:集合接口与实现是分离的,甚至你可以发现一些abstract类,这是为了方便设计类库的人。集合类的基本接口是Collection

    public interface Collection<E> extends Iterable{
                boolean add(E e);
                boolean addAll(Collection<? extends E> c);
    
                void clear()//删除集合中所有元素
                boolean removeAll(Collection<? extends E);//删除指定集合中 此操作后集合中与给定集合无共同元素。
                boolean remove(Object o);//删除指定对象
    
                boolean contains(Object o);
                boolean containsAll(Collection<?extends E> c);
                boolean isEmpty();
    
                Iterator<E> iterator();
    
                boolean retainAll(Collection<? extends E> c);
    
                Object[] toArray();
    
                int size();
    
             }
             public interface iterator<E>{
                E next();
                boolean hasNext();
                boolean remove();
                default void forEachRemaining(Consumer<? extends E> action){...};
    
    
    
             }
    

    注意:
    Iterator 接口,如果需要删除集合的第一个元素,应该这样操作,it.next();it.remove();//remove方法将会删除上次调用next()返回的 元素。

  11. java8 新增的forEachRemaining方法可以为其提供一个lambda表达式。将对迭代器每个元素调用这个lambda表达式。

  12. 集合框架中有RandomAccess 接口,该接口不包含任何方法,只是用来测试是否支持高效随机访问。 集合框架中有RandomAccess 接口,该接口不包含任何方法,只是用来测试是否支持高效随机访问。

  13. 你会发现Set接口与Collection方法一样但是为什么会有这样的情况呢?其实集合Collection并不是真的是集合的概念,而Set是真的集合不允许 你会发现Set接口与Collection方法一样但是为什么会有这样的情况呢?其实集合Collection并不是真的是集合的概念,而Set是真的集合不允许有重复元素。

  14. 对于List set 接口的实现使用add set 对于Queue 最好使用poll offer peek 对于List set 接口的实现使用add set 对于Queue 最好使用poll offer peek

  15. Map: map.keySet()返回Set Collection values(); entrySet(); Map: map.keySet()返回Set Collection values(); entrySet();

  16. 将应用程序打包:java cvf JARFileName File1 File2将应用程序打包:java cvf JARFileName File1 File2
    当你看到cvf不禁会想这特么都什么鬼?虽然会有汉语意思 但是是不是搞清楚其英文缩略比较容易记住?

    c create new archive
            v generate verbose output on standard output
            f specify archive file name
            u update existing archive
            m include manifest information from specify manifest file
    
  17. 应用首选项的储存(利用properties 类保存和加载配置信息):

    Properties p = new Properties();
            p.setProperties("","");
            OutputStream out = new FileOutputStream("filename");//创建输出流
            p.store(out,"description");//将映射属性保存在文件中。
    
            如果需要从文件加载属性:
            InputStream in = new FileInputStream("filename");
            p.load(in);
            而获取值时使用getProperties();
    
    
  18. 服务加载器:

    //创建一个服务加载器来加载给定服务接口的类,
    static <s> ServiceLoader<S> load(Class<S> service);
    Iterator<S> iterator();//生成一个以懒加载方式加载服务类的迭代器。迭代器推进类时才加载。
    
  19. 线程: Object 类中关于线程的方法
    sleep()使得调用该方法的线程暂停执行,让其他线程有机会执行,但是并未释放对象锁,也就是该 线程的数据并不能被其他线程访问。
    join() 在threadA中调用threadB.join()是指threadA改变运行状态,回到等待状态。而threadB继续执行。
    yield()与sleep()方法类似,只是不能控制让暂停多少秒。
    wait()会放弃对象锁,使得其他线程可以进入synchronized数据块,而当前线程被放入等待池中。
    notify()被调用后并不会立即释放锁,而是将临界区代码执行完之后,才释放锁。处于等待的线程才会获得锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值