当前位置: 代码迷 >> J2SE >> J2SE 杂感
  详细解决方案

J2SE 杂感

热度:4201   发布时间:2013-02-25 00:00:00.0
J2SE 杂文
1、获取集合泛型元素的class,可以使用list.get(i).getClass()
2.简单数据类型的转换:
(byte、short、char)-->int-->long-->float-->double
3.java基本数据类型:
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
1)、整数:包括int,short,byte,long
2)、浮点型:float,double
3)、字符:char
4)、布尔:boolean 
基本型别    大小       最小值             最大值
boolean   -----    ------          -----
char     16-bit    Unicode 0      Unicode 2^16-1 //都是正数
byte     8-bit      -128          +127            //-128到+127
short    16-bit     -2^15         +2^15-1
int      32-bit     -2^31         +2^31-1
long     64-bit     -2^63         +2^63-1
float    32-bit     IEEE754       IEEE754
double   64-bit     IEEE754       IEEE754
void
4.long可以自动向float进行转换,虽然long是8个字节,float是4个字节。
如long a = 1L,float b = a;就是双精度的级别高于单精度的。
还可以使用Long a = 1L; a.floatValue()的方法
5.break只能跳出一层for循环,continue表示跳过本次循环
6.首先split方法使用的参数是一个正则表达式,split(String regex) 。而|字符对于正则表达式本身就是一个特殊字符,表示选择关系,如a|b表示a或者b,所以需要使用\|进行转义,而在java语言中又是使用\\表示\,所以最后就需要使用\\|了,如果只是使用split("|"),则该|不会匹配上面AA|23.2任意一个字符,因此会输出

A
A
|
2
3
.
2
的形式,第一个是空格。
7.之所以把接口定义成泛型,第一可以起到对子类进行约束的能力,第二使用之类的时候,接口实际上也被创建了,因为先会创建父类才会创建子类,对于接口就会实例化接口中的信息。
8.Properties类通常用于加载对应的properties文件的。
使用方式如下:
private static Properties props = new Properties();
props.load(new FileInputStream(filePath));//filePath为properties文件的位置,如src/config.properties
通过props.getProperty(key)读取value或是props.setProperty(key,value);
9.产生指定范围的随机数
(int)(Math.random()*(end-start+1))+start;
10.父类中泛型的使用
java中,方法的参数要求必须是“固定类型的”,加引号的原因就是对于泛型来说有点特殊,但是本质没有变化,即实例话对象之后,对象的方法所对应的参数必须是固定类型的。举一个例子:
boolean add(E e)  ,这个是ArrayList类的添加方法,这个参数表面看是可变的,但实际上也是有约定的。即Class ArrayList<E>,在实例话对象时需要指定泛型类型,否则E会默认是Object对象。所以要想方法类型动态指定就可以使用该形式。
10.Charset.defaultCharset().name();获得系统默认编码
   对字符串进行转码的时候,只能是单字节的转码即,new String(str.getBytes("ISO-8859-1"),"GBK")
11.window下调用的是dll文件
12.java正则表达式的使用
先创建一个Pattern,通过Pattern.compile的方式进行创建。通过Matcher寻找匹配项。创建Matcher的方式通过p.matcher(s);p为Pattern。通过m.find()寻找匹配的项。
一个正则表达式:((https|http)://\\S{1,})\\s* java里要用\\表示正则表达式的\。
13.InetAddress类代表这ip地址,如个人本机的ip地址为192.168.1.123.使用方法如下:InetAddress address = InetAddress.getLocalHost();
   address.getHostAddress()
14.UUID的使用 UUID uuid = UUID.randomUUID(); 
15.|会检查每个条件的真伪再做或运算。||遇到一个true后,后面的就不执行了,&和&&是同理的.
16.泛型边界的定义class Stats<T extends Number>
17.泛型的边界类型为接口 ,使用extends关键字
class Stats<T extends Comparable>
18.定义多个泛型边界类使用&,如
class Stats<T extends Comparable & Serializable>
19.泛型参数中的问题
void doSomething(Stats <U> ob)//这种做法是错误的,因为不存在一个泛型为U的Stats类。可以使用通配符?,如
void doSomething(Stats <?> ob)//表示obj是任意类型的
但是如下的方式定义是正确的
getAnnotation(Class<T> annotationClass);//因为存在Class<T>的泛型类,此处只能为T,不能修改其他的。
因此即使不在该类中定义T类型也是可以的,因为这个T是靠Class<T>传递的。因此也可以写成
public <T extends Annotation> T getAnnotation(Class<T> annotationClass);//<T extends Annotation>是对返回T的进一步约束
20.匿名内部类只能使用final类型的方法形式参数
21.静态变量可以被该类的多个实例所共享,且只占用一份内存空间。
22.常用的集合类:
HashSet类内部使用的是hash算法,因此存取速度比较快。存储的数据元素是不重复的。也是无序的。
LinkedSet内部使用的是链表的结构保存数据。因此保存数据有顺序。内部的数据是不能重复的。
TreeSet类会排序保存内部数据。因此被保存的数据需要实现Comparable接口。实现接口的compareTo方法。数据也是不能重复的。
ArrayList类是使用数组的形式保存数据的。因此随机读取数度比较快,但是插入和删除数度比较慢,因为涉及到移位的操作。数据可以重复,是有序的。
LinkedList类:内部使用的是链表的存储结构。因此插入和删除数度比较快,但是读取需要移动指针,因此效率比较低。
HashMap类:不允许存放的key重复。key和value都是Object对象。可以用null作为key和value。不是线程安全的。是无序的
LinkeMap类内部使用链表的存储结构,数据是有序的。
TreeMap内部使用红黑树的算法。它实现了Map和SortedMap接口。可以自定义排序。包含的方法有firstKey,lastKey。headKey,tailKey等等。
23.浏览器默认的语言编码是操作系统的编码,而Tomcat默认的是ISO-8859-1。
24.request是服务器端接收浏览器说的话。out.write是服务器向客户端说话。
25.乱码的解决思路就是让说话的人不用默认的说话方式,让听话的人不用默认的方式听。
ISO8859-1是tomcat和mysql默认使用的编码方式。
GBK是中国人的标准,UTF-8 内部使用的unicode,默认是16位。
服务器端解决乱码的方式,即response.setContentType("text/html; charset=utf-8"),让服务器使用utf-8说话。
<%@ page contentType="text/html; charset=utf-8">,这句话的本质就是response.setContentType("text/html; charset=utf-8"),所以上面的方式基本用不到了。jsp的头就是告诉服务器说话的方式。

request.setCharacterEncoding("gbk");设置服务器端使用什么编码听,只对post方式有效。

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK" />
只对get方式有效

new String(name.getBytes("ISO8859-1"),gbk);对post和get方式都有效。
26.
方法内定义的局部变量是存放在栈中的。
命令模式:将动作的请求者从动作的执行者中解脱出来。请求者是遥控器,发送对应的命令,命令就会去执行对应的具体产品的操作。都是通过组合的方式注入的。
27.Introspector类是用于java反射的工具类。通过该类可以获取该类的属性,方法等信息。调用方法为static BeanInfo getBeanInfo(Class<?> beanClass)
28.SAXReader是把xml最为流来处理,即Stream API for XML,这样不会想dom4j那样,一次性的把文档都载入到内存中,而是读取一点,处理一点
29.preparedstatement提供了缓存的机制,因此在下次处理同样的sql语句的时候会,直接从cache中获取
30.Sax解析xml常用的方法
  //解析格式类似于
  <HD>  
  <disk name="C">  
    <capacity>8G</capacity>  
    <directories>200</directories>  
    <files>1580</files>  
  </disk>  
 
  <disk name="D">  
    <capacity>10G</capacity>  
    <directories>500</directories>  
    <files>3000</files>  
  </disk>  
</HD>  

  Document doc = saxReader.read(inputStream)|SaxBuilder.builder(xmlPath);
  Element root =  doc.getRootElement();
  下面分为2种方式进行遍历:
  方式1
  然后对下面的子元素进行遍历
  可以使用List list = root.getChildren("子节点的名称");
  然后对list进行遍历
  for(int i = 0; i < list.size(); i++){
      Element ele = (Element)list.get(i);
      //获取属性值
       String name = ele.getAttributeValue("attrName");
      //获取该节点下的子节点的文本
       String childText = ele.getChildText("childName1");
       //上面的解析格式类似于
      
}
  方式2
  Iterator it = root.elementIterator("子节点的名称");
  for(;it.hasNext();){
         对子节点进行遍历
}
31.修改tomcat服务器内存
进入tomcat的bin目录下,然后编辑catalina.bat文件
编辑
set JAVA_OPTS=-Xms128m -Xmx256m
前面为最小内存,后面为最大内存
监控虚拟机内存可以使用
Runtime类

Runtime lRuntime = Runtime.getRuntime();
out.println("Free Memory: "+lRuntime.freeMemory()+"<br>");
out.println("Max   Memory: "+lRuntime.maxMemory()+"<br>");
out.println("Total Memory: "+lRuntime.totalMemory()+"<br>");
32.replaceAll("<br\\s*/?>|<p\\s*/?>|[\\s\\n]", "");
    \\*s表示若干个空白符,/?表示0个/或是1个/.
33.http请求行的格式
请求方法 请求URI 协议版本号 CRLF
34.print %d表示结果以10进制的方式输出。
35.print("%d",strle("abc123\01de\n"))的输出结果是10
   解释:
strlen()是字符串的长度
"abc123\01de\n"
其中abc123占6个字节,这没什么好说的
然后是\01de\n
\+八进制数 可以转换成相应的ASCII码 占1字节
de占2字节
\n是换行符 占1字节
6+1+2+1=10
36.Vector的add方法和addElement方法的区别。
    add方法是继承了list接口的实现。返回的是boolean值。
    addElement方法是1.2之前的方法,在数组的末尾添加一个元素。之所以保留是为了向前兼容
37.transient关键字是为了让被注释的属性不被序列化 
38.IllegalArgumentException表示不合法的参数,是一个运行时异常。在项目开发中如果传入的参数不合法可以抛出该异常
39.在参数中使用泛型,若是要限定泛型的范围使用
a(Collection<? extends E> c)的形式
40.Collection的toArray方法是将集合转换成Object数组
41.在new 一个对象的时候,若是同时实现其方法,实际上就相当于new 了该对象的一个子类,这种方式也可以被叫做匿名内部类。

new Thread(){
    public void run(){
     sysout("run");
}
}
42.有这样的一种设计方法,父类的某个方法会执行固定的操作。之类实现父类会重新父类的方法。那么执行的时候会先去只类中寻找该方法如果没有就会去寻找父类的。
因此实际中可以给某个方法默认的执行操作。当传递自定义的操作时再执行目标操作。
43.利用多线程实现下载会使得下载的速度更快。因为服务器给一个客户端连接会提供一个固定带宽,因此多个线程跑的时候会给多一些带宽
44.在一个对象中调用super.clone();的作用是克隆一个该对象的实例,即两个对象执指向的地址是相同的。克隆模式中常常这样操作
45.JDBC的conn 的setAutoCommit(false)只对innerDB类型的表是有效的