java随手笔记

一个文件中的数据要在控制台显示I,首先需要获取文件中的内容,使用FileInputStream fis 


=new FielInputStream(this.filename);


方法重写应遵循‘三同一小一大’原则;
三同:即方法名相同、形参列表相同、返回值类型相同
一小:子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等
一大:子类方法的访问修饰符应比父类方法更大或相等。


vector&ArrayList的主要区别;
1):同步性:vector是线程安全的,也就是说同步的。而ArrayList是线程不安全的,不是同步


的。
2):数据增长,当需要增长时,vector默认增长为原来一倍,而ArrayList却是原来的50%,这


样就有利于节约内存空间,如果涉及到堆栈,队列等操作。应该考虑用vector,如果需要快速


随机访问元素,应该使用ArrayList。




1、Java中用补码形式表示
2、第一位正负位,1表示负,0表示正。
3、原码:一个数的二进制表示。
                 3的原码00000011   -3的 原码 10000011
4、反码:负数原码按位取反(符号位不变)。正数原码本身。
                3的反码00000011   -3的反码11111100
5、补码:正数是原码本身。负数反码加1。
                 3的补码是00000011  -3的补码是11111101
-------------------------------------------------------------------------------
int占4个字节,32位
byte占1个字节,8位
所以强转时会截断。前24位
---------------------------------------------------------------------------
在内存中表示形式( 注意java中是以补码表示一个数,所以表示形式是补码,不是原码! )



int a = 3         00000000  00000000  00000000 00000011 (强转byte时前面24个0被截断



byte b = 3      00000011
int a = -3       11111111  11111111   11111111   11111101 (强转byte时前面24个1被截


断)
byte b = -3     11111101
----------------------------------------------------------------------------
已知负数的补码,求负数:
补码-1=反码,反码按位取反=该负数绝对值
已知负数,求负数的补码:
1、负数原码除了符号位,按位取反(不含符号位),加1。
2、负数绝对值的补码(也就是原码),按位取反(含符号位),加1
-------------------------------------------------------------------------------
例子:
java int 128转为byte,值:
128为正数,补码为10000000(前面24个0省略),变成byte,只剩下10000000(byte为1个字节


),因为开头是1,所以为负数。即1个负数的补码是10000000。反码是01111111,原码是


1000000。是128.因为是负数,所以是-128。




java中可以处理Unicode字符的类为:InputStreamReader、bufferReader、Writer
字节流:
InputStream   
|-- FileInputStream (基本文件流)   
|-- BufferedInputStream   
|-- DataInputStream   
|-- ObjectInputStream
字符流
Reader 
|-- InputStreamReader (byte->char 桥梁) 
|-- BufferedReader (常用) 
Writer 
|-- OutputStreamWriter (char->byte 桥梁) 
|-- BufferedWriter 
|-- PrintWriter (常用)


java 提供的事件处理模型是一种人机交互模型。它有三个基本要素:
1):事件源:即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生


的一个事件;
2):事件:事件封装了组件上发生的事情,比如按钮点击、按钮松开等等
3):事件监听器:负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相


应的事件;






1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要


返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值)


,所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返


回值。


举例:


情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。


情况2:try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。


情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally


语句中全部代码,
最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.


情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。


情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。


情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。


最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果


finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被


return的,
编译器把finally中的return实现为一个warning。
 




java中的线程安全是什么:
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他


的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如


果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就


是线程安全的。 
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导


致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线


程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安


全。
看过vector源码的同学就会知道他的许多操作都是加了synchronized修饰的比如他的添加元素


。(不知道synchronized是什么意思的自行百度!)
1
2
3
public synchronized void addElement(E obj) {  modCount++;
       ensureCapacityHelper(elementCount + 1);  elementData[elementCount++] = obj;
}
而HashMap的所有操作都没有加synchronized修饰 ,不如他的put源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public V put(K key, V value) {
     if (key == null)
         return
      putForNullKey(value);
      int hash = hash(key.hashCode());
      int i = indexFor(hash, table.length);
      for(Entry<K,V> e = table[i]; e != null; e = e.next) {
         Object k;
         if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
             V oldValue = e.value;
             e.value = value;
             e.recordAccess(this);
             return
             oldValue;    }
     }
     modCount++;
     addEntry(hash, key, value, i);
     return null;
 }
再看看ArrayList的add方法的源码
1
2
3
4
5
public boolean add(E e) {
     ensureCapacity(size + 1);  // Increments modCount!!
     elementData[size++] = e;
     return true;
 }
再看StringBuffer的append源码,他是有synchronized修饰的
1
2
3
4
5
public synchronized
  StringBuffer append(String str) {
     super.append(str);
     return this;
 }
最后是Properties的setProperty方法,他是有synchronized修饰的
1
2
3
4
5
public synchronized
  Object setProperty(String key, String value) {
      return
      put(key, value);
 }
由此就可以判断出谁是线程安全的了










Stack是栈, queue是对列;
栈是后进先出,对列是先进先出;
栈是出入从同一个位置;
对列是入从结构的一端进入,从另一端出队;
栈就像一个盒子,你把物体依次放入后,能先拿出来的只能是上面最后放进去的,下层的想要


拿出需要将上层的先拿出,也就是先出栈;
对列是一个胡同,人们都进入胡同了,只有最前面的人从胡同出口出去,后面的人只有等前面


的人走完后才能依次通过。




语言跨平台是编译后的文件跨平台,而不是源程序跨平台。java源代码首先经过编译器生成字


节码,即class文件,该class文件与平台无关,而class文件经过解释执行之后翻译成最终的机


器码,这是平台相关的。




java中的整数默认为int类型。小数默认为double类型的。


注意:区分编码和编码格式
编码: 编码就是一个编号(数字)到字符的一种映射关系,就仅仅是一种一对一的映射而已,可


以理解成一个很大的对应表格
java默认的字符集是Unicode(占两个字节byte,一个字节=8比特位bit,所以每个Unicode占用


16比特位)
编码格式:编码格式 是用来序列化或存储编码中提到的那个“编号(数字)”的一种“格式”,


包括gbk和utf-8
    gbk: 是指中国的中文字符,其它它包含了简体中文与繁体中文字符
    UTF-8: 它是一种全国家通过的一种编码


1.web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接


和容器中的环境变量接接口互,不必关注其它系统问题。主要有WEB服务器来实现。例如:


TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标


准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
2.Web container:实现J2EE体系结构中Web组件协议的容器。这个协议规定了一个Web组件运行


时的环境,包括安全,一致性,生命周期管理,事务,配置和其它的服务。一个提供和JSP和


J2EE平台APIs界面相同服务的容器。一个Web container 由Web服务器或者J2EE服务器提供。
3.EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件


EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。


并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。一个实现了J2EE


体系结构中EJB组件规范的容器。 这个规范指定了一个Enterprise bean的运行时环境,包括安


全,一致性,生命周期,事务, 配置,和其他的服务。
4.JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提


供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位


分布式应用程序的功能。
5.JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点


对点和广播。
6.JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调


用其提供的接口即可。
7.JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开


发者通过各种部署和自定义实现自己的个性安全控制策略。
8.RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远


程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本


地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。


RMI是JAVA特有的。RMI-IIOP出现以前,只有RMI和CORBA两种选择来进行分布式程序设计。


RMI-IIOP综合了RMI和CORBA的优点,克服了他们的缺点,使得程序员能更方便的编写分布式程


序设计,实现分布式计算。首先,RMI-IIOP综合了RMI的简单性和CORBA的多语言性(兼容性)


,其次RMI-IIOP克服了RMI只能用于Java的缺点和CORBA的复杂性(可以不用掌握IDL)












两个最基本的java回收算法:复制算法和标记清理算法
复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算



标记清理:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出
标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
两个概念:新生代和年老代
新生代:初始对象,生命周期短的
永久代:长时间存在的对象
整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制


综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值