Java学习笔记

来源:互联网 发布:什么是5g网络 编辑:程序博客网 时间:2024/06/15 21:15

7月5日


实现多线程的三种方法:

class MyThread implements Runnable{public void run(){}//实现run}public clas test{public static void main(){MyThread myThread =new MyThread ();Thread thread=new Tread(myThread );thread.start();}}
class MyThread extends Thread{    public void run(){}//重写run}public clas test{   public static void main(){   MyThread myThread=new MyThread();   myThread.start();   }}

实现callable,它属于Executor框架。


7月6日


  • 类的构造方法可以省略,编译器会提供一个默认构造器。普通方法可以与类同名。注意:只要定了构造方法,无论是否重写无参构造方法,JVM都不会提供默认方法。
  • final关键字声明一个类不可以被继承,private为作用域关键字。
  • StringBuffer是线程安全的,而StringBuilder不是线程安全的,单线程情况下效率更高。
  • (四个整数型(默认是int 型),两个浮点型(默认是double 型)),一种字符类型,还有一种布尔型。
  • wait方法会使线程暂停直到notify唤醒该线程。sleep方法会使该线程睡眠指定时间。suspend方法会暂停挂起,并且不会自动恢复,需要resume方法唤醒。
  • 依赖注入提供接口编程。
  • HashMap允许key值为NULL,HashTbale不可以。HashTable是进程安全的,HashMap不是。HashTable不需要快速失败。
  • 一趟快速排序的算法是:
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
  • 操作系统:进程与处理剂管理,作业管理,存储管理,设备管理,文件管理
  • IP-网络层。HTTP-应用层。PPP-数据链路层。TCP-传输层。
  • A类IP地址:1.0.0.0-126.0.0.0 网络号是第一字节;B类IP地址:128.0.0.0-191.255.255.255 网络号是第1/2字节;C类IP地址:192.0.0.0-223.255.255.255 网络号是第1/2/3字节;
public clas Test{   private static Test test=null;   private Test(){};   public static Test getInstance()   {       if(test==null)       {           test=new Test();       }       return test;   }}
  • 接口是特殊形式的抽象类,但是抽象类用于同类事物无法描述的场景,尤其是当父类和子类存在逻辑上的层次结构。接口多用于不同类之间,定义不同类的通信规则。

7月8日


  • 查看SQL的执行计划:explain 语句。id是一组数字,表示查询中执行select子句或操作表的顺序。selecttype:普通查询,带有子查询的,union的查询。type叫访问类型,表示在表中找到所需行的方式:最好的是System,其次index最差的是all。 extra表示不在其他列并且也很重要的额外信息。using index表示在相应的select中使用了覆盖索引。usingwhere表示存储引擎搜到记录后进行了后过滤(POST-FILTER),如果查询未能使用索引,usingwhere的作用只是提醒我们mysql要用where条件过滤z结果集。using temporay表示用临时表来存储结果集,常见于排序和分组查询。usingfilesort,mysql中无法用索引完成的排序成为文件排序。
  • RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。 CBO方式:它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有多少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因此应及时更新这些信息。
  • MySQL“慢SQL”定位:查询是否开启了慢查询。设置慢查询的时间限制。查看慢查询。
show variables like '%slow%';set log_slow_queries onshow variables like 'long_query_time'; set long_query_time=1; show status like 'slow_queries'; 
  • 复制是MYSQL数据库提供的解决方案,复制如何工作从高层来看,复制分成三步:
    (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
    (2) slave将master的binary log events拷贝到它的中继日志(relay log);
    (3) slave重做中继日志中的事件,将改变反映它自己的数据。
  • 热备份、温备份、冷备份
  • InnoDB支持事务,行级索,外键,不支持全文索引。MyISAM相反。
  • innoDB的日志包括:错误日志,查询日志,慢查询日志,二进制日志,中继日志,事务日志。
  • 事务如何通过日志实现?隔离性通过锁实现,原子性、一致性、持久性通过redo日志和undo日志实现。
  • MySQL数据库CPU忽然飙升,该如何处理?show processlist查看所有进程,杀死无用进程(多秒无变化),查看超时日志和错误日志。
  • 500台DB,最快重启的方式?shell脚本或者ansible工具。
  • MySQL中的innoDB引擎的行级索是如何实现的?innoDB的行级索是基于索引完成行锁,如果where条件不是索引,则会采用表锁。
  • select* 和select 全部字段的优缺点?1前者解析数据字典,后者不需要。2 前者无法建立索引优化,后者可以。

7月10日


  • 方法覆盖中:覆盖的方法和被覆盖的方法不一定有相同的访问权限。覆盖的方法不能比被覆盖的方法抛出更多异常。
  • 关于访问控制符protected的描述:可以被三种类引用,该类自身、同包其他类、其他包该类子类。
  • 父类的构造方法不可以被子类继承。
  • 数组是同类型的无序数据的集合
  • 创建线程对象有两种方法:继承Thread类,实现runnable接口
  • Java提供的两种用于多态的机制,重载和覆盖
  • Java中,使用抽象类来实现接口,并不是毫无作用。相反,有时间有很大的作用。 当你只想实现接口中的个别方法(不是所有方法)时,你可以先写一个抽象类来实现该接口,并实现除了你想要的方法之外的所有方法(方法体为空)。接着再用你的类继承这个抽象类,这个类中就只用实现你需要的方法了,这样就可以达到你的需要了。但是,如果你直接实现接口的话,你就需要实现接口的所有方法。
  • finalize是object类的一个方法,在垃圾回收收集器执行的时候会调用被回收对象的finalize方法,当下一回回收动作发生时才会真正的回收占用的内存。
  • &&是逻辑与运算,&是位与运算。
  • Collection是一个集合接口,提供了对集合对象进行基本操作的通用接口方法;Collections是针对集合类的一个包装类,它提供了静态方法实现对各种集合的搜索排序以及线程安全化的操作。
  • Spring MVC是在Spring框架发展起来的框架,提供了构建web应用程序全功能MVC模块,使用了Spring可插入的MVC架构,可以自由的选择各个模块所使用的架构。
  • IOC控制反转,又被叫做依赖注入。一般而言,分层体系结构都是上层调用下层的接口,上层依赖于下层的执行。利用IOC方式,通过采用一定的机制选择不同的下层实现,完成控制反转,由调用者决定被调用者。IoC通过注入实例达到解耦的目的。
  • AOP:面向切面编程,允许开发人员在不改变原来模型的基础上动态的修改模型从而满足新的需求。
  • 声明抽象方法不可写出大括号。

7月11日


  • oracle访问数据库实例:
public class testOracle{   public Connection getConnection(){       Connnection conn=null;       String driver="oracle.jdbc.dirver.OracleDriver";       String url="";       String name="";       String password="";       try{          Class.forName(driver);          conn=DriverManager.getConnection(url,name,password);       }catch{}       return conn;   }   public void selectFromOracle(){      Connection conn=null;      PreparedStatement pstat=null;      ResultSet rs=null;      try{         conn=getConnection();         String sql="";         pstat=conn.prepareStatement(sql);         rs=pstat.executeQuery();         while(rs.next()){         }      }catch(Exception e){}   }}
  • static关键字的作用:为特定数据类型或对象分配单一的存储空间。希望某个方法或者属性与类而不是与对象关联一起。
  • JSP和Servlet的关联:JSP可以被看作特殊的Servlet,是对Servlet的扩展。JSP最终也要转换成Servlet运行。
  • Switch能作用在Byte上面,不能用在long,JAVA7之后开始作用在String。
  • 当使用多线程访问同一个资源时,非常容易出现线程安全问题。JAVA主要提供了三种实现同步机制的方法:synchronized关键字,wait,notify,lock.
  • 数据库连接池负责分配管理和释放数据库连接,允许程序重复使用现有数据库连接,同时负责释放空闲连接。

HashMap和TreeMap区别详解以及底层实现

1、HashMap 代码分析
HashMap 是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
2、TreeMap代码分析
TreeMap基于红黑树的NavigableMap实现。TreeMap没有调优选项,因为该树总处于平衡状态。

HashMap和TreeMap比较

(1)HashMap:适用于在Map中插入、删除和定位元素。
(2)Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
(3)HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.
(4)HashMap 非线程安全 TreeMap 非线程安全
(5)HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。

解决哈希(HASH)冲突的主要方法

(1)开放定址法

  • 线性探查法(Linear Probing):探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。
  • 将线性探测的步长从 1 改为 Q ,即将上述算法中的 j = (j + 1) % m 改为: j = (j + Q) % m ,而且要求 Q 与 m 是互质的,以便能探测到哈希表中的所有单元。
  • -

(2)拉链法

volatile变量

Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
 当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步

Java中ArrayList和LinkedList区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

HashMap、Hashtable与ConcurrentHashMap的区别

  • HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都经过synchronized修饰。
  • HashMap允许有null值的存在,而在HashTable中put进的键值只要有一个null,直接抛出NullPointerException。
  • HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。
  • ConcurrentHashMap引入了分割(Segment),上面代码中的最后一行其实就可以理解为把一个大的Map拆分成N个小的HashTable。部使用的同步机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个Map(HashTable就是这么做的)
原创粉丝点击