o.get理解
Set<Map.Entry<String, Integer>> entries = m1.entrySet(); for (Map.Entry<String, Integer> entry : entries) { entry.getValue()+entry.getKey() }
hashmap的遍历
Map.Entry<String, Integer>这是set集合的泛型,entries是set类型,键值对集合,entry是Entry类型这个类型的内容就是个键值对
Optional<Map.Entry<String, Integer>> o = m1.entrySet().stream().max((o1, o2) -> o1.getValue()-o2.getValue()); Map.Entry<String, Integer> entry = o.get(); //o.get()如何理解//o.get()是optional的方法,获取内容,键值对(Entry类型)
o.get()是optional的方法,获取optional类中的内容,
针对tcp连接。客户端和服务器端均会有端口
客户端定义时指定的端口是与服务器端连接的端口,但是在程序运行时还会默认动态生成一个端口
在服务器端和客户端,调用输入输出的getInputStream();.getOutputStream()两个基本的字节数输入流,都需要客户端对象,而不是服务器端对象
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream()); DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
IUser proxy = ProxyFactory.getProxy(u1); //直接使用泛型;**接口类型**接收代理对象。
理解:ProxyFactory.getProxy(u1)返回的对象必须使用接口来接;IUser是接口
原因:由于 Java 类只能继承一个父类,而动态生成的代理类已经继承了java.lang.reflect.Proxy,因此无法再继承目标类。只能通过实现接口来定义代理行为。
两种方法,一个带参数,一个不带参数
动态代理时,要传输形参的内容时把agrs写上,然后去判断,根据参数的不同表示不同赋值给另一个零食参数,最后进行打印输出;invoke()只写一次
method.invoke(u1, args); String paramsString; if (args == null) { paramsString = "[]"; } else { paramsString = Arrays.toString(args); }
添加运行时期的是元注解(注解的注解)
/** @Target(ElementType.TYPE) 用于描述注解可以使用在哪里 TYPE,类,接口 FIELD,成员变量 METHOD,成员方法 PARAMETER,方法参数 CONSTRUCTOR,构造器 LOCAL_VARIABLE,局部变量 */ @Target({ElementType.TYPE,ElementType.METHOD}) //可以用在类或接口上和方法上 //上述一旦著名,下面要写RUNTIME,**不然在测试是就默认消失了**/因为默认是class //@Retention //作用:声明注解的保留周期。 //@Retention(RetentionPolicy.RUNTIME) //SOURCE:只作用在源码阶段,字节码文件中不存在。 // CLASS(默认值):保留到字节码文件阶段,运行阶段不存在, // ** RUNTIME(开发常用):一直保留到运行阶段。推荐使用** // * */ @Retention(RetentionPolicy.RUNTIME) public @interface MyBook3 { String value(); }
在Java中:相对路径是以工程目录为基准,所以找某个文件,要以模块名为起始往下找
线程理解
start方法只能调用一次(一个线程),多次调用会报错
直接调用线程重写的run方法,没用通过start方法去调用(调用start方法,默认创建线程,调用run方法),则不会创建线程,调用的run方法仍是main在执行
sleep不释放锁
&:只有当两个位都为 1 时,结果才为 1,否则为 0。
^: 对于每一对二进制位,只有当两个位都为 1 时,结果才为 1,否则为 0。
pojo dto vo
- POJO:最基础的 “数据箱子”,跟数据库表对应,在哪都能用。
- DTO:“传输专用箱子”,在系统间传数据时用,按需裁剪字段。
- VO:“前端展示专用箱子”,字段完全按页面需要来,拿来就能显示。
pojo最基础的,dto用于c-s-m三层之间使用,vo主要用于展示给前端的
controller层(方法参数pojo )->传给service层(方法参数dto)->传到mapper层(方法参数dto)
->mapper返回(返回值 vo)->service层返回(返回值 vo)->controller层返回(返回值 vo)
如果是多表则controller层(方法参数dto )->传给service层(方法参数转化为单表操作)->传到mapper层(方法参数单表)
->mapper返回(返回值 vo)->service层返回(返回值 vo)->controller层返回(返回值 vo)
多表到s-c层要裁剪, dto属性少于(不包括多表)pojo则,传递用dto
总结:字段设计原则
类型 |
字段来源 / 设计原则 |
例子(假设数据库有 表) |
POJO |
与数据库表字段严格一一对应。 |
, , , |
DTO |
根据业务需求裁剪或组合(可跨表)。多表常用 |
注册时: , (无 ) |
VO |
根据前端 UI定制,可能包含计算值。 |
展示时: , (无 ) |
关键区别
- POJO:数据库的忠实映射,不做任何加工。
- DTO:服务间传输的 “最小必要数据”,比如注册时不需要
id,查询列表时可能需要关联其他表的数据。 - VO:前端的 “最终展示形态”,可能包含拼接、格式化、过滤后的数据。