java学习笔记21-java高级练习

求三个数中的最大值和最小值练习
1.编写输入工具类,实现基本的输入功能,保证输入错误可以再次输入
2.编写接口,制定规范
3.编写接口的实现类,具体实现接口,编写实现逻辑
4.编写工厂类获取接口实现类,实现解耦
5.编写测试类

在实际开发中,接口的主要作用是为不同的层,提供一个操作标准.使用new一定会有耦合问题,所以我们用工厂设计模式来解决此问题

普通工厂设计模式是静态工厂设计模式,在开发中是不会用的.因为需要不断的修改工厂类.解决方法就是在工厂中不再使用new关键字,因为使用new关键字后必须给出一个明确的类.使用反射来创建实例化对象,这样工厂类和子类之间就没有了联系,实现了解耦合 用反射类实现工厂类和实现类的解耦合 用泛型实现工厂类和接口的解耦合

在java中哪里用到了单例设计模式,Runtime类,Spring框架

如果让我写一段代码最能体现自己的能力,我写工厂类.单例,或者死锁

在反射使用过程中没有与任何具体的类产生耦合,在框架设计中非常的常用

Constructor Method Field 三个类,前两者的父类是Executable,再往上是AccessibleObject 后者直接是AccessibleObject的子类

在反射中static属性获取不需要传递对象,直接传递一个null即可

Unsafe工具类最大的特征是绕过实例化对象的管理,但它不受JVM管理,一般不建议使用 在不创建对象的情况下也可以获取一个对象

找到了类加载器就意味着找到了类的来源
类加载器的加载过程首先是Bootstrap(系统类加载器)->PlatformClassloader(平台类加载器)(jdk1.8及以前是ExtClassLoader,jdk1.9及之后改为平台类加载器)->AppClassLoader(应用程序类加载器)

自定义类加载器一定是在以上三个加载器都加载完毕后才开始加载,自定义类加载器可以加载磁盘及网络中的类,加载到的内容放到一个字节数组中.而系统提供的类加载器都是根据ClASSPATH属性来加载的

classpath加载的类必须有包,不打包的.class文件是不能被classpath加载到的
动态代理,为所有功能一致的业务操作接口提供有统一的代理处理操作.
不管动态代理还是静态代理都一定要接收真实业务类的对象,Object类就可以接收.动态代理需要为所有满足条件的真实业务类提供代理服务.
动态代理不再与某一个接口进行捆绑所以需要动态的来获取类的接口信息

CGLIB可以实现基于类的动态代理,jdk默认的代理模式都是基于接口的,分为静态代理和动态代理

通过反射可以获得注解(但只能获得在运行时生效的注解) 注解生效的三个阶段,对应java代码的三个阶段 source(.java 源文件在硬盘上) class(.class 加载到内存中) runtime(运行时)

jdk1.2出现的类集,jdk1.5出现的泛型,jdk1.8出现对类集算法进行了优化

Collection 有一个iterator()方法是将单列集合实现类对象变为iterator接口 Collection接口继承了Iterable接口 Iterable接口中定义了iterator方法返回一个Iterator接口

List接口继承了Collection接口,对其方法进行了扩充,主要是List是有序可重复的,出现了索引 新增了get(int index)等索引相关方法 另外有listIterator方法返回一个ListIterator接口 jdk1.9出现List.of静态方法用来生成一个不可变的实例(长度,内容)

ArrayList类实现了List接口,是AbstractList抽象类的子类,是AbstractCollection的孙类,再往上是Object

ArrayList底层是数组结构,特点是查询快,增删慢

自定义的类放入List中需要覆写equals方法,否则无法操作contains remove等方法,因为它们底层使用的就是equals方法进行比较(不重写的话比较的是地址值,重写的话比较的内容)
ArrayList空参构造初始化长度为0,调用add方法保存数据默认长度是10,超出后会扩容一半,大数据量保存时会产生较多的垃圾内存,应该明确保存数量或者直接使用linkedList

linkedList底层是链表结构,它实现了List接口,是AbstractSequentialList的子类,祖父类是AbstractList,再往上是AbstractCollection,再是Object
LinkedList同时还实现了Deque接口(双端队列)(Deque继承自单端队列接口Queue,Queue继承自Collection)

Vector类与ArrayList继承关系完全一样,区别在于Vector所有方法加了syncronized关键字,是线程安全的 另外Vector空参构造方法会直接创建一个长度为10 的数组,list空参是长度为0的数组,add方法调用才开辟长度为10 的数组

Set集合是去重的,无法按照索引进行操作,这是和List集合最大的差别

Set直接静态方法of保存重复数据会抛出异常,和传统Set集合方法是相一致的,只是抛出了异常而已

HashSet最大的特点是存取顺序不一致,去重 实现Set接口,祖父接口是Collection 父类是AbstractSet,祖父类是AbstractCollection

TreeSet特点是可排序(按照字母序排列的,不是按照存放先后),去重 实现了NavigableSet(导航Set)接口,祖父接口是SortedSet,在往上是Set接口 父类是AbstractSet,祖父类是AbstractCollection
TreeSet实际上是利用TreeMap子类实现的集合数据的存储,而TreeMap需要使用Comparable接口进行比较,所以TreeSet存储的类需要实现Comparable接口,并重写compare to 方法,同时需依次比较所有的属性,因为属性相同的也会被去重,所以一般不会使用TreeSet

Scanner类就是Iterator接口的一个子类 集合标准输出有4种形式 iterator(迭代输出) ListIterator(双向迭代输出) Enumeration(枚举输出) forEach

ListIterator双向迭代输出,反向输出必须在正向输出后才得以进行,否则指针在头处,遍历无内容

Enumeration枚举输出,只有Vector类才可以使用 .elements()可以获得 .hasMoreElements() 是否有下一个元素 .nextEmelent() 获得下一个元素

在开发中Collection集合保存数据的目的是为了输出 Map集合保存数据的目的是为了根据key查找值

HashMap是存储无序的 空参的HashMap中会首先执行一段代码 this.loadFactor =DEFAULT_LOAD_FACTOR; 这是个0.75f

HashMap的put方法的源码如下: public V put(K key,V value){return putVal(hash(key),key,value,false,true); }

HashMap里面有一个常量 DEFAULT_INITAL_CAPACITY=1<<4 即16 初始化容量16 负载因数0.75 阈值就是16*0.75 即12 超过12时就会进行扩容 成倍的扩容

HashMap是无序的,想要有序可以使用LinkedHashMap,但数据量过大的话不要使用,因为时间复杂度太高 它是HashMap的子类

Hashtable实现了Map接口 父类是一个抽象类Dictionary(字典类) 它与HashMap的区别是 它是线程安全的,不可以存储null值和null键 HashMap是线程不安全的,可以存储NULL值和null键

Map.Entry是一个内部接口 主要方法有getKey( ) 和getValue( )

Stack栈类继承自Vector但是它并没有用Vector的方法,它有自己的方法 push() 和pop()

Queue队列接口的实现类有LinkedList 还有PriorityQueue(优先级队列) 它继承自AbstractQueue 可以实现排序 前提是存放的类实现了Comparable接口 进按照存放顺序进,出按照排序的顺序出来

Properties类是Hashtable的子类 存储Key Value型数据且只能是String类型的 可以进行资源文件的输入和输出

Collections工具类可以操作 List Set Queue等集合类 和部分的Map方法 进行binarySearch() 时需要先进行排序,这是二分查找的前提

B/S使用的公共的http协议,并且使用的是公共的80 端口,所以安全性较低 C/S的协议由开发者自定义,和端口号也是比较私密的,安全性相对较高,但是开发和维护的成本较高

使用Scanner的时候要设置分割符,useDelimiter(),否则读的内容都认为是一个整体,无法使用next方法 这样使用printStream在传输的时候也要注意使用println()方法,否则没有分割符,这样就会一直等待

JDBC就是java database Connectivity java数据库连接 JDBC本质上来说就是一种服务,服务都是有流程和套路的 java专门为JDBC提供了一个包,java.sql
java.sql 包中主要就是一个DriverManager类和若干接口(Connection Statement PreparedStatement ResultSet)

JDBC连接有4种方式
1.程序-JDBC-ODBC-数据库 (桥连接,不会有人用的,效率太低.ODBC是微软的一种数据库连接协议) 此连接方式是java默认支持的技术,不需要额外的配置,以下三种均需要配置
2.程序-JDBC-数据库(JDBC本地连接)
3.(JDBC网络连接)程序-JDBC-网络数据库(ip地址+端口号)(通过特定的网络协议连接指定的网络数据库)
4.(JDBC协议连接)自己通过编写指定的协议操作,实现数据库的访问

猜你喜欢

转载自blog.csdn.net/wwzzh1989/article/details/89209238
今日推荐