1:判断map中是否包含某一个键方法:
boolean flag=map.containsKey("opt")
2:查看类的加载信息 java虚拟机参数。run >edit configuration
VMOption: -verbosee:class -XX:+TraceClassLoading -XX:+TraceClassUnloading
3:jvm参数
-XX:+PrintGCDetails 打印GC日志
-Xms20M -Xmx20M -Xmn10M 设置堆大小20M,不可扩展, 其中10MB分配给新生代
-XX:SurvivorRatio=8 新生代总Edin与Survivor 区比例为8:1
4:大对象直接进入老年代,java提供-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。
5:查看类的class文件可以用, javap -verbose Test.class
6: 启动jar程序时,指定端口号 ,例如 --server.port=9090
java -jar SpringBootForum-0.0.1-SNAPSHOT.jar --server.port=9090
7:executor = thread, runnable=callable , callable 有返回值future
8: map中的键值对是以Entry形式存在的
9:使用hashcode找到bucket,存储键值对的位置,hashcode相同时,使用链表存储具有相同hashcode的键值对,
10: 取出键值对时,要用到hashcode找到位置,然后用equals判断对象的属性,取出具体的对象。
11: google书签导出, 书签>右键书签管理器> 导出书签
12: java 8 将int数组转化为列表 , arrn 是int数组
List<Integer> list = Arrays.stream( arrn ).boxed().collect(Collectors.toList());
13:检测电脑最大可支持的内存:
1)点“开始”——在“运行”框中输入CMD,按回车键;
2)在命令窗口中输入wmic memphysical get maxcapacity,按回车键;
3)此时系统会给出一串以千字节为单位的数字,把该数字换算成GB单位;
换算方法:得到的数字/1024/1024
如上,33554432/1024/1024=32GB;
即最大可支持的内存容量为32GB。
13: 解释执行与编译执行。
A.解释执行
我们的Python就是解释执行,它的特点就是,对源语言写成的源语句进行一句一句的翻译,翻译一句就提交给计算机执行一句,并不会形成目标程序。它的有点是翻译本身并不费事。它的缺点是运行速度慢,比如当程序中存在循环条件时,循环体内的语句就会被多次的翻译,从而影响运行速度。
B.编译执行
简单来说 就是,现需要对源程序进行一个编译,生成一个目标文件,计算机再对这个目标程序进行执行。虽然这的编译的过程比上面提到的翻译的过程要复杂(通常要对代码进行语法分析,还要对代码进行优化,并分配内存,最后形成目标文件),但是一旦形成目标文件,就一劳永逸,不必再进行编译,所以执行速度较快。
总结:
对于大型的项目考虑用编译执行的语言,对于小型的项目考虑用解释执行的语言。
14:java是静态语言,在编译器确定类型,进行类型检查。 但是具有动态特性,通过反射机制可以得到其它class的信息。
https://www.cnblogs.com/greatfish/p/5981841.html
15: 多态,运行时确定对象类型。
多态缺点
覆盖私有方法:因为private是final的,不能覆盖,所以子类中的私有方法和父类中的不一样(即使名字参数 都一样)。
域与静态方法:因为域与静态方法是编译期确定的,所以也不能覆盖父类的。 子类和父类中的域和静态方法是不同的,(覆盖不了)。 如果子类中没有相同的域和静态方法,可以直接调用父类的。
16:构造器是static的。
17: NIO 新IO,主要是通道Channel和缓冲区 ByteBuffer, 就是给OutputStream建立一个通道FileChannel,将OutputStream中的数据放入到FileChannel中 (或者说为OutputStream打开了一个通道Channel) , 然后通过通道向缓冲区中写数据。 通过缓冲区进行交换数据。
FileChannel in = new FileInputStream(args[0]).getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); in.read(buffer);
18:NIO, 内存映射文件: 内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件。 有了内存映射文件,我们就可以假定整个文件都放在内存中,而且可以把它当做非常大的数组来访问。
package chapter18.class10; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; /** * 内存映射文件 */ public class LargemappedFiles { static int length=0x8FFFFFFF; public static void main(String[] args) throws IOException { MappedByteBuffer out=new RandomAccessFile("test.dat","rw").getChannel().map(FileChannel.MapMode.READ_WRITE,0,length); for (int i = 0; i < length; i++) { out.put((byte) 'x'); } System.out.println("finished writing"); for (int i = length / 2; i < length / 2 + 6; i++) { System.out.println((char)out.get(i)); } } }
RandomAccessFile调用map产生MappedByteBuffer, 这是一种特殊类型的直接缓冲区。注意,我们必须指定映射文件的初始位置和映射区域长度,意味着我们可以映射某个大文件的较小的部分。
当用MappedByteBuffer 写时,一定要用RandomAccessFile。
18:序列化:Java的对象序列化将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。 可以利用它实现轻量级持久性。
19: 分布式能够提高高可用,坏了一个,可以用另一个。
单机处理极限
20:不定长参数是数组,例如反射方法调用,需要传递不定长的参数,可以以数组形式传入。
Object[] objects = list.toArray();
method.invoke(aClass.newInstance(),objects);
20:每次在Map最后一个位置添加元素,如果存在相同键值的,也在最后添加。方法,将存在的键值删除再添加
ConcurrentHashMap<Long, Integer> htmlidMap; htmlidMap.putIfAbsent(htmlid, news.getCount()); //添加,防止下面删除时出现空 newCount = htmlidMap.computeIfPresent(htmlid, (key, value) -> { htmlidMap.remove(htmlid);//删除, return value + 1; }); htmlidMap.putIfAbsent(htmlid, newCount); //添加,在最后添加
21: java中的运算符
https://www.cnblogs.com/lialong1st/p/7824777.html