jdk包含jre ,jre包含jvm
跨平台原理:不同操作系统都提供了jvm
单字节范围-128 ~127
& 和&& 的区别:
& 除了按位与,也可以实现逻辑与,但是没有短路特性
Java中String字符串的最大长度?
Java中的字符串String最大长度,编译期如果是javac编译就是65534。如果绕过javac编译的限制,其最大长度可以达到u2类型变达的最大值65535。
常量池第0项保留.
运行期是4G.
Java用Scanner类获得单个字符
char c= sc.next().charAt(0);
通常使用String类作为Map的key:
String类是不可改变类,
HashMap 是根据key的hashcode 确定value的存储位置
在String类的源码,创建完String类的对象,会立马计算该对象的hashcode并保存在Hash字段.
JAVA 7和JAVA8 HashMap 的不同:
java7:链表数组,插入在链表前面
java8:链表长度达到一定值,转为红黑树,插入到链表尾部.
@Test public void test3() { HashSet set = new HashSet(); Person p1 = new Person("AA", 1, 2.0); Person p2 = new Person("BB", 2, 3.0); set.add(p1); set.add(p2); p1.setName("CC"); set.remove(p1); // 能否删除 ?? //不能,此时重新计算hashcode,重新散列到数组,找不到第一次散列的位置 System.out.println(set); set.add(new Person("CC", 1, 2.0)); // 能否添加 //可以添加,在新散列的位置找不到该内容 System.out.println(set); set.add(new Person("AA", 1, 2.0)); // 能否添加 //可以添加,在原来散列的位置 进行hashcode 和equals时不相等 System.out.println(set); }
反转链表:
class MyLinkList{ class Node{ int value; Node next; public Node(int value, Node next) { this.value = value; this.next = next; } } Node frist; public void add(int value){ Node node = new Node(value, null); if(frist==null){ frist =node; }else { Node tmp =frist; while (tmp.next!=null){ tmp=tmp.next; } tmp.next=node; } } public Node reverse(){ Node next=new Node(frist.value,null); Node tmp =frist; while ((tmp=tmp.next)!=null){ next=new Node(tmp.value,next); } System.out.println("123"); return next; } }
volatile 与synchronized 的区别:
volatile 易变的,是线程同步的轻量级实现,变量在多个线程的同步性
线程1访问变量,会拷贝一份到缓存,然后修改
线程2访问同一个变量,访问的值是内存的数据,出现数据不一致
使用volatile 修饰后,CPU 会不断扫描该变量在缓存的值有没有改变,如果改变,就会刷会内存
保证变量的一致性
即当某一个线程修改了变量,其它线程立即可见.
synchronized 多个线程间资源的同步.