笔记

    xiaoxiao2021-04-15  31

    ALTER TABLE issuelinktype CONVERT TO CHARACTER SET utf8; 创建jira module的命令: atlas-create-jira-plugin-module 关闭tomcat netstat -ano | findstr 8080 taskkill /F /PID 1234 eclipse的debug作用: F5:跳入方法 F6:向下逐行调试 F7:跳出方法 F8:直接跳转到下一个断点 hashMap允许一个Key == null private V getForNullKey() {           // 遍历table[0]里的所有桶           for (Entry<K,V> e = table[0]; e != null; e = e.next) {               // 看看桶的key是不是null,是则返回相应值               if (e.key == null)                   return e.value;           }           // 没找到返回null           return null;       }   public static void main(String[] args) { HashMap hashMap = new HashMap<>(); hashMap.put(null,"i am null1!"); hashMap.put(null,"i am null2!"); System.out.println(hashMap.get(null)); } result : i am null2!; java中类型之间向上转型可以不用强制转换,而向下转型则要强制转换,如: public static void main(String[] args) { short s = 1; int i  = s+1; }//不需要强制转换 public static void main(String[] args) { short s = 1; short i  = (short)s+1; }//需要强制转换 - 原始类型: boolean,char,byte,short,int,long,float,double  - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double class AutoUnboxingTest {     public static void main(String[] args) {         Integer a = new Integer(3);         Integer b = 3;                  // 将3自动装箱成Integer类型         int c = 3;         System.out.println(a == b);     // false 两个引用没有引用同一对象         System.out.println(a == c);     // true a自动拆箱成int类型再和c比较     } } public class Test03 {     public static void main(String[] args) {         Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;         System.out.println(f1 == f2);//true         System.out.println(f3 == f4);//false     } } public static void main(String[] args) { int i = 1; int j = 1; if((i<0)&&((i++)>0)){ } System.out.println(i); } 结果是:1 public static void main(String[] args) { int i = 1; int j = 1; if((i<0)&((i++)>0)){ } System.out.println(i); } 结果是;2 String str = new String("hello");//str 是在栈中,new出来的对象是在堆中,而常量hello实在常量池中,而常量池又在方法区中 Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?  答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。 switch不能作用于Long 用最有效率的方法计算2乘以8?  答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。 public static void main(String[] args) { outer:while(true){ while(true){ break outer; } } }//跳出多重循环 为什么在java中设置线程的优先级无效或者说效果不大,因为线程的java虽然有线程的优先级,但是是依赖于操作系统的优先级,主要还是由操作系统来调度,虽然在java中设置了10(最高的优先级),但是假设在一些unix上面没有优先级一说,那么,所有的线程都将按照unix说的规则去调度,即使是window这种有优先级的系统,也不能确保一定是按java的优先级调度。     public static String reverse(String originStr) {         if(originStr == null || originStr.length() <= 1)              return originStr;         return reverse(originStr.substring(1)) + originStr.charAt(0);     }//反转字符串 String s = new String("hello"); String s2 = new String(s.getBytes("GB2312"),"ISO-8859-1");//转换字符串不同格式 LinkedList和ArrayList都用了transient  去处理,是为了不让容器里面的元素序列化: transient Node<E> first;//源码 而Vector里面却没有一个transient,所以vector里面的元素在序列化时会被保存。有些人说用Vector的好处是因为线程安全,(以为Vector里面都是synchronized的方法) 但是,Collections.synchronizedList(list)这个可以让list也变成线程安全,实现方式是利用Collections(是用来操作collection的工具类)的静态内部类SynchronizedCollection(里面全是synchronized方法)来实现的。 sleep和yield的区别 ① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;  ② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;  ③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;  ④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。  newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。  - newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。  - newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。  - newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。  类加载分为三步: 1.加载类 2.连接(解析,准备(包括static修饰的变量),验证) 3.初始化 加载完毕后:使用->卸载 死锁四个必要条件: 1.互斥,资源是互斥的 2.请求和保持,一个进程请求其他资源的时候,对已有的资源依然保持 3.不可剥夺,另一个进程不可剥夺现在的进程 4.循环等待,各个资源头尾相连,形成环路 如何确保N个线程可以访问N个资源同时又不导致死锁? 使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了 平时所说的方法区,其实是指的理论上的JVM的划分,而实际上,不同的虚拟机实现过程都不一样,例如hotspot,其采用永久代去实现,用来存放类信息,静态变量,常量池等不易发生变化的信息,而在jdk1.8中,永生代被元数据代替。 String s = "abc";//在方法区中的常量池中创建abc常量 String s' = new String("abc"); //在堆中创建abc对象 所以s==s'返回false 浮点数用二进制表示: 可以这样:首先将一个小数如:235.725的小数部分取出,即:0.725,将其乘以进制数二进制就乘以2后得到1。45,取其整数部分1为二进制小数的第一项(十分位),在将小数部分0。45乘2得0。9,取其整数部分为二进制小数的第二位(百分位)0,在将其小数部分0。9乘2,得1。8,取其整数部分为二进制小数的第三位(千分位)1,取其小数部分0。8再乘2……以此类推,直到值为0或形成循环小数则停止。 为什么浮点数的运算很多时候会出现丢失精度,因为小数转化为二进制很多时候会出现即使超出了存储的位数,小数部分任然无法乘尽的时候,这个时候用二进制存储的就是个近似值, 而多个近似值进行运算,就会发生进度丢失的情况,所以,最好的方法是转换为BigDecimal去运算(查看源码得知内部用字符串的形式存储,然后转换为分数进行运算的) Integer a = new Integer(10); Integer b = Integer.valueOf(10);//返回true,开始我以为会和string一样,结果出乎我的意料,因为在Jdk1.5以后,当基本数据类型和非基本数据类型做“==”的时候 非基本类型会自动拆箱,即Integer会自动变成integer.intValues()返回一个int的数据来比较地址,所以是true。 Integer a = new Integer(10); Integer b = Integer.valueOf(10); 然而,上面a==b却返回false,因为b是调用了IntegerCache中之前创建的-127~127的缓存,是之前就已经创建了的对象,而a是现在才创建的对象,所以不相等 Lock和synchronized的区别: 1.Lock是跟随实例的,而synchronized是跟随类的 2.Lock可以更细微,可以拆分读写等操作 3.Lock的现实锁可以通过在构造方法中加入true来声明公平锁(等待锁的线程采用FIFO的顺序),但是默认情况下也是非公平的锁。 总之,要灵活选择Lock,要安全使用synchronized。 如何避免死锁,主要是破坏上面四个条件之一。 可以采用: 1.减少资源的共享,让每个资源都只有一个线程可以使用,这样就不会出现争夺线程的情况 2.使用tryLock(),让线程去尝试获得资源,如果没有获得资源,自动结束线程,释放资源,让资源给其他线程使用。 CyclicBarrier 举个栗子:比如说线程1执行一个方法,线程2执行一个方法,线程1到达这个方法的某一条语句时,要等待线程2也到达某条语句,才能执行,可以采用这种方式。 几个不要: 1.不要在循环语句中计算: while(i<count*2){ } 每次循环都会执行一遍计算,降低了效率,要改成 int j = count*2; while(i<j){ } 十种基本算法: 数据结构:堆,栈,二叉树,链表,队列, 同一个对象的hashcode()一定相等,不同的对象hashcode()可能相等,这是因为hashcode()是根据地址来计算的,如果地址相等,函数(也就是这里的hash)相等,结果当然相等啦,而不同的地址 通过同一个hash算法,可能会相等,这就相当于是  x = 2时,x^2 = 4,相同的地址相当于两者都取2,结果相等,当然如果x=-2,算出来的值也可能相当一个道理 
    转载请注明原文地址: https://ju.6miu.com/read-671567.html

    最新回复(0)