-
枚举类型:实际仍为类,继承Enum。继承了许多有用的方法,toString() 静态的values()返回包含全部枚举值的数组。ordinal()返回枚举常量的位置,从0开始。valueOf()返回枚举类实例。与toString 相反。枚举类的构造函数是私有的。
-
反射:可以在运行时根据指定的类名获得类的信息。Class.forName() object.class object.getClass().getName() 反射:可以在运行时根据指定的类名获得类的信息。Class.forName() object.class object.getClass().getName()
getDeclaredFieds() 获取类中所有域的集合Fied[]. f.get(obj)获取域值。
getDeclaredMethods() 获取类中所有方法的集合Method[]. m.invoke() -
接口:只是描述这个类有什么功能,而不作具体的描述。instanceof 可以检测某个对象是否属于某个类,同时可以用instanceof来检测是否属于某个接口。注意接口中不能包含实例域.但是可以有常量。java单继承多实现,所以抽象类解决不了的问题接口可以解决。我们现在考虑这样一种情况,如果一个类实现的俩个接口中有相同的方法,会怎么办?如果不实现自然是抽象类,其实编译器会提示你进行选择覆盖相同 的方法。
-
Comparable 和Comparator 区别
Arrays.sort()可以对实现了Comparable接口的对象数组排序,例如可以对String类按字母顺序排序,但是想根据字符串长度排序便需要重写String 类,显然不可能。这时便可以使用Comparator.对象必须创建一个实现Comparator的比较器。然后Arrays.sort(objArray,comparator) -
protected是包内其他类可见,其他包子类可见。但是你在子类中实例化一个父类的其他子类得到的对象,并不能访问父类的protected方法。也不能通过通过实例化父类对象来访问父类方法;在同包的其他类中,也不能实例化子类来访问父类的protected。会出现clone()’ has protected access in 'java.lang.Object’类似飘红提示;
-
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();
-
代理:在编译时无法确定创建实现哪些接口的类,只有在运行时才确定创建实现一组给定接口的类,可以利用代理。静态代理是代理类与 被代理
类实现相同的接口。动态代理是创建调用处理器、创建代理对象等等。 -
异常处理: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)}} -
泛型:泛型类型通配符可以使得类型参数变化,比如Pair<? extends Employee> 可以明显的看到好处是访问器方法安全而更改器方法不能
随意更改。因为在设置的时候编译器只知道是Employ类型但是并不知道具体是那个类型。所以设置会显示错误。
泛型的超类型限定,相反可以向泛型对象写入,但是不能读。 -
集合:集合接口与实现是分离的,甚至你可以发现一些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()返回的 元素。 -
java8 新增的forEachRemaining方法可以为其提供一个lambda表达式。将对迭代器每个元素调用这个lambda表达式。
-
集合框架中有RandomAccess 接口,该接口不包含任何方法,只是用来测试是否支持高效随机访问。 集合框架中有RandomAccess 接口,该接口不包含任何方法,只是用来测试是否支持高效随机访问。
-
你会发现Set接口与Collection方法一样但是为什么会有这样的情况呢?其实集合Collection并不是真的是集合的概念,而Set是真的集合不允许 你会发现Set接口与Collection方法一样但是为什么会有这样的情况呢?其实集合Collection并不是真的是集合的概念,而Set是真的集合不允许有重复元素。
-
对于List set 接口的实现使用add set 对于Queue 最好使用poll offer peek 对于List set 接口的实现使用add set 对于Queue 最好使用poll offer peek
-
Map: map.keySet()返回Set Collection values(); entrySet(); Map: map.keySet()返回Set Collection values(); entrySet();
-
将应用程序打包: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
-
应用首选项的储存(利用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();
-
服务加载器:
//创建一个服务加载器来加载给定服务接口的类, static <s> ServiceLoader<S> load(Class<S> service); Iterator<S> iterator();//生成一个以懒加载方式加载服务类的迭代器。迭代器推进类时才加载。
-
线程: Object 类中关于线程的方法
sleep()使得调用该方法的线程暂停执行,让其他线程有机会执行,但是并未释放对象锁,也就是该 线程的数据并不能被其他线程访问。
join() 在threadA中调用threadB.join()是指threadA改变运行状态,回到等待状态。而threadB继续执行。
yield()与sleep()方法类似,只是不能控制让暂停多少秒。
wait()会放弃对象锁,使得其他线程可以进入synchronized数据块,而当前线程被放入等待池中。
notify()被调用后并不会立即释放锁,而是将临界区代码执行完之后,才释放锁。处于等待的线程才会获得锁。
java核心技术笔记
最新推荐文章于 2022-03-27 19:37:30 发布