
正文
Java将代码提取成方法 java取余代码
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
如何提取一个java源文件的所有方法?求代码
这应该是正则表达式与栈运算的综合运用,用正则匹配方法名格式,确定那是一个方法,然后用栈来处理大括号的开与闭。
相关问答
Q1: Java代码优化有哪些常用的方法
1、 尽量指定类的final修饰符 带有final修饰符的类是不可派生的。
在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50% 。
2、 尽量重用对象。
特别是String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。
3、 尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。
其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。
4、 不要重复初始化变量
默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
5、 在JAVA + ORACLE 的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担。
6、 Java 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,即使关闭以释放资源。
因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。
7、 由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。
JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。
8、 在使用同步机制时,应尽量使用方法同步代替代码块同步。
9、 尽量减少对变量的重复计算
例如:for(int i = 0;i list.size; i ++) {
…
}
应替换为:
for(int i = 0,int len = list.size();i len; i ++){
…
}
10、尽量采用lazy loading 的策略,即在需要的时候才开始创建。
例如: String str = “aaa”;
if(i == 1) {
list.add(str);
}
应替换为:
if(i == 1) {
String str = “aaa”;
list.add(str);
}
11、慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。 异常只能用于错误处理,不应该用来控制程序流程。
12、不要在循环中使用:
Try {
} catch() {
}
应把其放置在最外层。
13、StringBuffer 的使用:
StringBuffer表示了可变的、可写的字符串。
有三个构造方法 :
StringBuffer (); //默认分配16个字符的空间
StringBuffer (int size); //分配size个字符的空间
StringBuffer (String str); //分配16个字符+str.length()个字符空间
你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。
这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为,然后再找出一条更好的提升性能的途径。
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍――这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。StringBuffer初始化过程的调整的作用由此可见一斑。所以,使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。
14、合理的使用Java类 java.util.Vector。
简单地说,一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小。请考虑下面这个向Vector加入元素的例子:
Object bj = new Object();
Vector v = new Vector(100000);
for(int I=0;
I100000; I++) { v.add(0,obj); }
除非有绝对充足的理由要求每次都把新元素插入到Vector的前面,否则上面的代码对性能不利。在默认构造函数中,Vector的初始存储能力是10个元素,如果新元素加入时存储能力不足,则以后存储能力每次加倍。Vector类就对象StringBuffer类一样,每次扩展存储能力时,所有现有的元素都要复制到新的存储空间之中。下面的代码片段要比前面的例子快几个数量级:
Object bj = new Object();
Vector v = new Vector(100000);
for(int I=0; I100000; I++) { v.add(obj); }
同样的规则也适用于Vector类的remove()方法。由于Vector中各个元素之间不能含有“空隙”,删除除最后一个元素之外的任意其他元素都导致被删除元素之后的元素向前移动。也就是说,从Vector删除最后一个元素要比删除第一个元素“开销”低好几倍。
假设要从前面的Vector删除所有元素,我们可以使用这种代码:
for(int I=0; I100000; I++)
{
v.remove(0);
}
但是,与下面的代码相比,前面的代码要慢几个数量级:
for(int I=0; I100000; I++)
{
v.remove(v.size()-1);
}
从Vector类型的对象v删除所有元素的最好方法是:
v.removeAllElements();
假设Vector类型的对象v包含字符串“Hello”。考虑下面的代码,它要从这个Vector中删除“Hello”字符串:
String s = "Hello";
int i = v.indexOf(s);
if(I != -1) v.remove(s);
这些代码看起来没什么错误,但它同样对性能不利。在这段代码中,indexOf()方法对v进行顺序搜索寻找字符串“Hello”,remove(s)方法也要进行同样的顺序搜索。改进之后的版本是:
String s = "Hello";
int i = v.indexOf(s);
if(I != -1) v.remove(i);
这个版本中我们直接在remove()方法中给出待删除元素的精确索引位置,从而避免了第二次搜索。一个更好的版本是:
String s = "Hello"; v.remove(s);
最后,我们再来看一个有关Vector类的代码片段:
for(int I=0; I++;I v.length)
如果v包含100,000个元素,这个代码片段将调用v.size()方法100,000次。虽然size方法是一个简单的方法,但它仍旧需要一次方法调用的开销,至少JVM需要为它配置以及清除堆栈环境。在这里,for循环内部的代码不会以任何方式修改Vector类型对象v的大小,因此上面的代码最好改写成下面这种形式:
int size = v.size(); for(int I=0; I++;Isize)
虽然这是一个简单的改动,但它仍旧赢得了性能。毕竟,每一个CPU周期都是宝贵的。
15、当复制大量数据时,使用System.arraycopy()命令。
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
System.arraycopy(src, 0, dest, 0, 6);
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置;
length:复制的长度.
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
16、代码重构:增强代码的可读性。
public class ShopCart {
private List carts ;
…
public void add (Object item) {
if(carts == null) {
carts = new ArrayList();
}
crts.add(item);
}
public void remove(Object item) {
if(carts. contains(item)) {
carts.remove(item);
}
}
public List getCarts() {
//返回只读列表
return Collections.unmodifiableList(carts);
}
//不推荐这种方式
//this.getCarts().add(item);
}
17、不用new关键词创建类的实例
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单。例如,下面是Factory模式的一个典型实现:
public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。
18、乘法和除法
考虑下面的代码:
for (val = 0; val 100000; val +=5) {
alterX = val * 8; myResult = val * 2;
}
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:
for (val = 0; val 100000; val += 5) {
alterX = val 3; myResult = val 1;
}
修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相当于乘以2。相应地,右移1位操作相当于除以2。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。
19、在JSP页面中关闭无用的会话。
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
对于那些无需跟踪会话状态的页面,关闭自动创建的会话可以节省一些资源。使用如下page指令:%@ page session="false"%
20、JDBC与I/O
如果应用程序需要访问一个规模很大的数据集,则应当考虑使用块提取方式。默认情况下,JDBC每次提取32行数据。举例来说,假设我们要遍历一个5000行的记录集,JDBC必须调用数据库157次才能提取到全部数据。如果把块大小改成512,则调用数据库的次数将减少到10次。
21、Servlet与内存使用
许多开发者随意地把大量信息保存到用户会话之中。一些时候,保存在会话中的对象没有及时地被垃圾回收机制回收。从性能上看,典型的症状是用户感到系统周期性地变慢,却又不能把原因归于任何一个具体的组件。如果监视JVM的堆空间,它的表现是内存占用不正常地大起大落。
解决这类内存问题主要有二种办法。第一种办法是,在所有作用范围为会话的Bean中实现HttpSessionBindingListener接口。这样,只要实现valueUnbound()方法,就可以显式地释放Bean使用的资源。
另外一种办法就是尽快地把会话作废。大多数应用服务器都有设置会话作废间隔时间的选项。另外,也可以用编程的方式调用会话的setMaxInactiveInterval()方法,该方法用来设定在作废会话之前,Servlet容器允许的客户请求的最大间隔时间,以秒计。
22、使用缓冲标记
一些应用服务器加入了面向JSP的缓冲标记功能。例如,BEA的WebLogic Server从6.0版本开始支持这个功能,Open Symphony工程也同样支持这个功能。JSP缓冲标记既能够缓冲页面片断,也能够缓冲整个页面。当JSP页面执行时,如果目标片断已经在缓冲之中,则生成该片断的代码就不用再执行。页面级缓冲捕获对指定URL的请求,并缓冲整个结果页面。对于购物篮、目录以及门户网站的主页来说,这个功能极其有用。对于这类应用,页面级缓冲能够保存页面执行的结果,供后继请求使用。
23、选择合适的引用机制
在典型的JSP应用系统中,页头、页脚部分往往被抽取出来,然后根据需要引入页头、页脚。当前,在JSP页面中引入外部资源的方法主要有两种:include指令,以及include动作。
include指令:例如%@ include file="copyright.html" %。该指令在编译时引入指定的资源。在编译之前,带有include指令的页面和指定的资源被合并成一个文件。被引用的外部资源在编译时就确定,比运行时才确定资源更高效。
include动作:例如jsp:include page="copyright.jsp" /。该动作引入指定页面执行后生成的结果。由于它在运行时完成,因此对输出结果的控制更加灵活。但时,只有当被引用的内容频繁地改变时,或者在对主页面的请求没有出现之前,被引用的页面无法确定时,使用include动作才合算。
24、及时清除不再需要的会话
为了清除不再活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多会话时,如果内存容量不足,操作系统会把部分内存数据转移到磁盘,应用服务器也可能根据“最近最频繁使用”(Most Recently Used)算法把部分不活跃的会话转储到磁盘,甚至可能抛出“内存不足”异常。在大规模系统中,串行化会话的代价是很昂贵的。当会话不再需要时,应当及时调用HttpSession.invalidate()方法清除会话。HttpSession.invalidate()方法通常可以在应用的退出页面调用。
25、不要将数组声明为:public static final 。
26、HashMap的遍历效率讨论
经常遇到对HashMap中的key和value值对的遍历操作,有如下两种方法:
MapString, String[] paraMap = new HashMapString, String[]();
//第一个循环
SetString appFieldDefIds = paraMap.keySet();
for (String appFieldDefId : appFieldDefIds) {
String[] values = paraMap.get(appFieldDefId);
......
}
//第二个循环
for(EntryString, String[] entry : paraMap.entrySet()){
String appFieldDefId = entry.getKey();
String[] values = entry.getValue();
.......
}
第一种实现明显的效率不如第二种实现。
分析如下 SetString appFieldDefIds = paraMap.keySet(); 是先从HashMap中取得keySet
代码如下:
public SetK keySet() {
SetK ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}
private class KeySet extends AbstractSetK {
public IteratorK iterator() {
return newKeyIterator();
}
public int size() {
return size;
}
public boolean contains(Object o) {
return containsKey(o);
}
public boolean remove(Object o) {
return HashMap.this.removeEntryForKey(o) != null;
}
public void clear() {
HashMap.this.clear();
}
}
其实就是返回一个私有类KeySet, 它是从AbstractSet继承而来,实现了Set接口。
再来看看for/in循环的语法
for(declaration : expression)
statement
在执行阶段被翻译成如下各式
for(IteratorE #i = (expression).iterator(); #i.hashNext();){
declaration = #i.next();
statement
}
因此在第一个for语句for (String appFieldDefId : appFieldDefIds) 中调用了HashMap.keySet().iterator()
而这个方法调用了newKeyIterator()
IteratorK newKeyIterator() {
return new KeyIterator();
}
private class KeyIterator extends HashIteratorK {
public K next() {
return nextEntry().getKey();
}
}
所以在for中还是调用了
在第二个循环for(EntryString, String[] entry : paraMap.entrySet())中使用的Iterator是如下的一个内部
类
private class EntryIterator extends HashIteratorMap.EntryK,V {
public Map.EntryK,V next() {
return nextEntry();
}
}
此时第一个循环得到key,第二个循环得到HashMap的Entry效率就是从循环里面体现出来的第二个循环此致可以直接取key和value值而第一个循环还是得再利用HashMap的get(Object key)来取value值现在看看HashMap的get(Object key)方法
public V get(Object key) {
Object k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length); //Entry[] table
EntryK,V e = table;
while (true) {
if (e == null)
return null;
if (e.hash == hash eq(k, e.key))
return e.value;
e = e.next;
}
}
其实就是再次利用Hash值取出相应的Entry做比较得到结果,所以使用第一中循环相当于两次进入HashMap的Entry
中而第二个循环取得Entry的值之后直接取key和value,效率比第一个循环高。其实按照Map的概念来看也应该是用第二个循环好一点,它本来就是key和value的值对,将key和value分开操作在这里不是个好选择。
27、array(数组) 和 ArryList的使用
array([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList!
ArrayList是Array的复杂版本
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。
ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
注:jdk5中加入了对泛型的支持,已经可以在使用ArrayList时进行类型检查。
从这一点上看来,ArrayList与数组的区别主要就是由于动态增容的效率问题了
28、尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector ,后者由于使用同步机制,而导致了性能的开销。
29、StringBuffer 和StringBuilder的区别:
java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。
StringBuilder。与该类相比,通常应该优先使用 java.lang.StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。为了获得更好的性能,在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它的容量。当然,如果你操作的字符串长度不超过 16 个字符就不用了。 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%-15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非你能确定你的系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否则还是用 StringBuffer 吧。
30、尽量避免使用split
除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的 StringUtils.split(string,char),频繁split的可以缓存结果。
其他补充:
1、及时清除不再使用的对象,设为null
2、尽可能使用final,static等关键字
3、尽可能使用buffered对象
如何优化代码使JAVA源文件及编译后CLASS文件更小
1 尽量使用继承,继承的方法越多,你要写的代码量也就越少
2 打开JAVA编译器的优化选项: javac -O 这个选项将删除掉CLASS文件中的行号,并能把
一些private, static,final的小段方法申明为inline方法调用
3 把公用的代码提取出来
4 不要初始化很大的数组,尽管初始化一个数组在JAVA代码中只是一行的代码量,但
编译后的代码是一行代码插入一个数组的元素,所以如果你有大量的数据需要存在数组
中的话,可以先把这些数据放在String中,然后在运行期把字符串解析到数组中
5 日期类型的对象会占用很大的空间,如果你要存储大量的日期对象,可以考虑把它存储为
long型,然后在使用的时候转换为Date类型
6 类名,方法名和变量名尽量使用简短的名字,可以考虑使用Hashjava, Jobe, Obfuscate and Jshrink等工具自动完成这个工作
7 将static final类型的变量定义到Interface中去
8 算术运算 能用左移/右移的运算就不要用*和/运算,相同的运算不要运算多次
2. 不要两次初始化变量
Java通过调用独特的类构造器默认地初始化变量为一个已知的值。所有的对象被设置成null,integers (byte, short, int, long)被设置成0,float和double设置成0.0,Boolean变量设置成false。这对那些扩展自其它类的类尤其重要,这跟使用一个新的关键词创建一个对象时所有一连串的构造器被自动调用一样。
3. 在任何可能的地方让类为Final
标记为final的类不能被扩展。在《核心Java API》中有大量这个技术的例子,诸如java.lang.String。将String类标记为final阻止了开发者创建他们自己实现的长度方法。
更深入点说,如果类是final的,所有类的方法也是final的。Java编译器可能会内联所有的方法(这依赖于编译器的实现)。在我的测试里,我已经看到性能平均增加了50%。
9. 异常在需要抛出的地方抛出,try catch能整合就整合
try {
some.method1(); // Difficult for javac
} catch( method1Exception e ) { // and the JVM runtime
// Handle exception 1 // to optimize this
} // code
try {
some.method2();
} catch( method2Exception e ) {
// Handle exception 2
}
try {
some.method3();
} catch( method3Exception e ) {
// Handle exception 3
}
已下代码 更容易被编译器优化
try {
some.method1(); // Easier to optimize
some.method2();
some.method3();
} catch( method1Exception e ) {
// Handle exception 1
} catch( method2Exception e ) {
// Handle exception 2
} catch( method3Exception e ) {
// Handle exception 3
}
10. For循环的优化
Replace…
for( int i = 0; i collection.size(); i++ ) {
...
}
with…
for( int i = 0, n = collection.size(); i n; i++ ) {
...
}
5、 在JAVA + ORACLE 的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担。
10、尽量采用lazy loading 的策略,即在需要的时候才开始创建。
例如: String str = “aaa”;
if(i == 1) {
list.add(str);
}
应替换为:
if(i == 1) {
String str = “aaa”;
list.add(str);
}
12、不要在循环中使用:
Try {
} catch() {
}
应把其放置在最外层
Q2: 学弟求助,Java基础编程好过么= =
还好
Java代码的基本格式
Java中的程序代码都必须放在一个类中。类需要使用class关键字定义,在class前面可以有一些修饰符,格式如下:
修饰符 class 类名{
程序代码
}123
Java中的程序代码可以分为结构定义语句和功能执行语句,其中,结构定义语句用于声明一个类或方法,功能执行语句用于实现具体的功能。每条功能执行语句的最后都必须用分号(;)结束。
Java语言是严格区分大小写的。
编写Java代码时,可以在两个单词或符号之间任意的换行。但为了便于阅读,我们通常会使用一种良好的格式进行排版。
Java程序中一句连续的字符串不能分开在两行中书写,例如,下面这条语句在编译时将会出错:
System.out.println("这是第一个
Java程序");12
如果为了便于阅读,想将一个太长的字符串分在两行中书写,可以先将这个字符串分成两个字符串,然后用加好(+)将两个字符串连起来,在加好(+)处断行。
System.out.println("这是第一个"+ "Java程序");12
Java中的注释
在编写程序时,为了使代码易于阅读,通常会在实现功能的同时为代码加一些注释。注释是对程序某个功能或者某行代码的解释说明,它只在Java源文件中有效,在编译程序时编译器会忽略这些注释信息,不会将其编译到class字节码文件中去。
注释还经常用于调试代码,注释掉一段代码,来逐步缩小调试范围,找到出错代码。
单行注释:通常用于对程序中中的某一行代码进行解释,用符号“//”表示,“//”后面为被注释的内容。
多行注释:以符号“/*”开头,以符号“*/”结尾。
文档注释:以“/**”开头,以“*/”结尾。可以使用javadoc命令将文档注释提取出来生成帮助文档。
Java中标识符
在编程过程中,经常需要在程序中定义一些符号来标记一些名词,如包名、类名、方法名、参数名、变量名等,这些符号被称为标识符。
标识符可以由任意顺序的大小写字符、数字、下划线(_)和美元符号($)组成
但标识符不能以数字开头
不能是Java中的关键字
在Java中定义的标识符必须要严格遵守上面列出的规范,否则程序在编译时会报错。
除了上面列出的规范,为了增强代码的可读性,还应遵循以下规则:
包名所有字母一律小写
类名和接口名每个单词的首字母都要大写
变量名和方法名的第一个单词首字母小写,从第二个单词开始每个单词首字母大写
常量名所有字母都大写,单词之间用下划线连接
应该尽量使用有意义的英文单词来定义标识符
Java中的关键字
关键字是编程语言里事先定义好并赋予了特殊含义的单词,也称作保留字。
下面列举的是Java中所有的关键字。
abstract
boolean
break
byte
case
catch char const class continue
default do double else extends
false final finally float for
goto if implements inport instanceof
int interface long native new
null package private protected public
return short static strictfp super
switch this throw throws transient
true try void volatile while
synchronized
所有关键字都是小写的
程序中的标识符不能以关键字命名。
Java中的常量
常量就是在程序中固定不变的值,是不能改变的数据。例如数字1,字符‘a’,浮点数3.2
整型常量
二进制:由数字0和1组成的数字序列。允许使用字面值来表示二进制数,前面要以0b或0B开头,目的是为了和十进制进行区分,如0b10110010。
八进制:以0开头并且其后由0~7范围内(包括0和7)的整数组成的数字序列,如0342
十六进制:以0x或者0X开头并且其后由0\~9、A~F(包括0和9、A和F)组成的数字序列,如0x23AF。
十进制
浮点数常量
浮点数常量就是数学中用到的小数,分为float单精度浮点数和double双精度浮点数两种类型。
单精度浮点数后面以F或f结尾,而双精度浮点数则以D或d结尾。在使用浮点数时也可以在结尾处不加任何的后缀,此时虚拟机会默认为double双精度浮点数。
字符常量
字符常量用于表示一个字符,且必须包含一个字符。一个字符常量要用一对英文半角格式的单引号”引起来,它可以是英文字母、数字、标点符号以及由转义序列来表示的特殊字符。
'a' '\r' '' '\u0000'
‘\u0000’表示一个空白字符,即在单引号之间没有任何字符。之所以能这样表示,是因为Java采用的是Unicode字符集,Unicode字符以\u开头,空白字符在Unicode码表中对应的值为’\u0000’。
1
字符串常量
字符串常量用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号”“引起来。
一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为零。
布尔常量
布尔常量即布尔型的两个值true和false。
null常量
null常量只有一个值null,表示对象的引用为空。
反斜杠(\)
在字符常量中,反斜杠(\)是一个特殊的字符,被称为转义字符,它的作业是用来转义后面一个字符。转义后的字符通常用于表示一个不可见的字符或具有特殊含义的字符。
\r表示回车符,将光标定位到当前行的开头,不会跳到下一行。
\n表示换行符,换到下一行的开头。
\t表示制表符,将光标移到下一个制表符的位置,就像在文档中用Tab键一样。
\b表示退格符号,就像键盘上的Backspace键。
以下的字符都有特殊意义,无法直接表示,所以用斜杠加上另外一个字符表示。
\’表示单引号字符,Java代码中单引号表示字符的开始和结束,如果直接写单引号字符(’),程序会认为前两个是一对,会报错,因此需要使用转移符(\’).
\”表示双引号字符。
\\表示反斜杠字符,由于在Java代码中的斜杠(\)是转义字符,因此需要表示字面上的\,就需要使用双斜杠(\\)。
Java中的变量
变量的定义
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
int x=0,y;
y=x+3;12
第一行代码的作用 是定义了两个变量x和y,也就相当于分配了两块内存单元,在定义变量的同时为变量x分配了一个初始值0,而变量y没有分配初始值,变量x和y在内存中的状态为。
第二行代码的作用是为变量赋值,在执行第二行代码时,程序首先取出变量x的值,与3相加后,将结果赋值给变量y,此时变量x和y在内存中的状态发生了变化。
变量的数据类型
Java是一门强类型的语言,它对变量的数据类型有严格的限定。在定义变量时必须声明变量的类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序会报错。
在Java中变量的数据类型分为两种,即基本数据类型和引用数据类型。
8种基本数据类型是Java语言内嵌的,在任何操作系统中都具有相同大小和属性,而引用数据类型是在Java程序中由编程人员自己定义的变量类型。
整数类型变量
整数类型变量用来存储整数数值,即没有小数部分的值。在Java中,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为4中不同的类型:字节型(byte)、短整型(short)、整型(int)和长整型(long)。
类型名
占用空间
取值范围
byte 8位(1个字节) −27~27−1
short 16位(2个字节) −215~215−1
int 32位(4个字节) −231~231−1
long 64位(8个字节) −263~263−1
在为一个long类型的变量赋值时,所赋值的后面要加上一个字母L(或小写l),说明赋值为long类型。如果赋的值未超过int型的取值范围,则可以省略字母L(或小写l)。
浮点数类型变量
浮点数类型变量用来存储小数数值。在Java中,浮点数类型分为两种:单精度浮点数(float)和双精度浮点数(double)。double型所表示的浮点数比float型更精确。
类型名
占用空间
取值范围
float 32位(4个字节) 1.4E-45~3.4E+38,-1.4E-45~-3.4E+38
double 64位(8个字节) 4.9E-324~1.7E+308,-4.9E-324~-1.7E+308
E表示以10为底的指数,E后面的+号和-号代表正指数和负指数,例如1.4E−45表示1.4∗10−45。
在Java中,一个小数会被默认为double类型的值,因此在为一个float类型的变量赋值时,所赋值的后面一定要加上字母F(或者小写f)。
在程序中,也可以为一个浮点数类型变量赋予一个整数数值。
字符类型变量
字符类型变量用于存储一个单一字符,在Java中用char表示。Java中每个char类型的字符变量都会占用2个字节。在给char类型的变量赋值时,需要用一对英文半角格式的单引号”把字符括起来,如’a’,也可以将char类型的变量赋值为0~65535范围内的整数,计算机会自动将这些整数转化为所对应的字符,如数值97对应的字符为’a’。
char c='a';char ch=97;
1
2
布尔类型变量
布尔类型变量用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即true和false。
变量类型的转换
在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。
自动类型转换
自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。
要实现自动类型转换,必须同时满足两个条件,第一是两种数据类型彼此兼容,第二是目标类型的取值范围大于源类型的取值范围。
byte b=3;int x=b;
整数类型之间可以实现转换:byte–short、int、long;short、char–int、long;int–long
整数类型转换为float:byte、char、short、int、long–float
其他类型转换为double类型:byte、char、short、int、long、float–double
1
2
强制类型转换
强制类型转换也叫显示类型转换,指的是两种数据类型之间的转换需要进行显示地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型,自动类型转换无法进行,这时就需要进行强制类型转换。
int a=4;byte b=(byte)a;
一个字节的变量b无法存储四个字节的变量a,在这种情况下就需要进行强制类型转换。
但强制类型转换极容易造成 数据精度的丢失。
int a=298;byte b=(byte)a;
System.out.println("a="+a);
System.out.println("b="+b);
输出结果为
a=298b=42
变量a的值本来为298,然而在赋值给变量b之后,其值为42,明显丢失了精读。
因为a是int类型,在内存中占用4个字节,byte类型的数据在内存中占用1个字节。当将变量b的类型强转为byte类型之后,前面3个高位字节的数据丢失,数值发生改变。
int 00000000 00000000 00000001 00101010byte 00101010
表达式类型自动提升
表达式是指由变量和运算符组成的一个算式。变量在表达式中进行运算时,也可能发生自动类型转换,这就是表达式数据类型的自动提升,如一个byte型的变量在运算期间类型会自动提升为int型。
byte b1=3;byte b2=4;byte b3=b1+b2;
System.out.println("b3="+b3);
运行时会报错,因为表达式b1+b2运算期间,变量b1和b2都会被自动提升为int型,表达式的运算结果也就变成了int型,这时如果将结果赋给byte型的变量就会报错,需要进行强制类型转换。
byte b3=(byte)b1+b2;
1
1
2
3
4
1
2
1
2
1
2
3
4
1
2
变量的作用域
变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。
在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域。
Java中的运算符
算数运算符
运算符
运算
范例
结果
+ 正号 +3 3
- 负号 b=4;-b; -4
+ 加 5+5 10
- 减 6-4 2
* 乘 3*4 12
/ 除 5/5 1
% 取模(即算数中的求余数) 7%5 2
++ 自增(前) a=2;b=++a; a=3;b=3
++ 自增(后) a=2;b=a++; a=3;b=2
– 自增(前) a=2;b=–a; a=1;b=1
– 自增(后) a=2;b=a–; a=1;b=2
在进行自增++和自增–的运算时,如果运算符++或–放在操作数的前面则是先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或自减运算。
在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数。如果除法运算有小数参与,得到的结果会是一个小数。
在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。
赋值运算符
赋值运算符的作用就是将常量、变量或表达式的值赋给某一个变量。
运算符
运算
范例
结果
= 赋值 a=3;b=2; a=3;b=2;
+= 加等于 a=3;b=2;a+=b; a=5;b=2;
-= 减等于 a=3;b=2;a-=b; a=1;b=2;
*= 乘等于 a=3;b=2;a*=b; a=6;b=2;
/= 除等于 a=3;b=2;a/=b; a=1;b=2;
%= 模等于 a=3;b=2;a%=b; a=1;b=2;
在赋值过程中,运算顺序从右往左,将右边表达式的结果赋值给左边的变量。
x+=3;就相当于x=x+3;
将一个int类型的值赋给一个short类型的变量,需要显示地进行强制类型转换。然而在使用+=,-+,*=,/=,%=运算符进行赋值时,强制类型转换会自动完成,程序不需要做任何显式子地声明。
比较运算符
比较运算符用于对两个数值或变量进行比较,其结果是一个布尔值,即true或false。
运算符
运算
范例
结果
== 相等于 4==3 false
!= 不等于 4!=3 true
小于 43 false
大于 43 true
= 小于等于 4=3 false
= 大于等于 4=3 true
注意不能将比较运算符==误写成赋值运算符=。
逻辑运算符
逻辑运算符用于对布尔型的数据进行操作,其结果仍是一个布尔型。
运算符
运算
与 两边都是true才为true
| 或 有一个true就为true
^ 异或 两边不同为true
! 非
短路与
|| 短路或
在使用进行运算时,无论左边为true或者false,右边的表达式都会进行运算。
如果使用进行运算,当左边为false时,右边的表达式不会进行运算。
位运算符
位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。
运算符
运算
按位与
| 按位或
~ 取反
^ 按位异或
左移 100100112 01001100
右移
无符号右移
1代表true
位运算就是将操作数所有二进制位向左移动。运算时,右边的空位补0。左边移走的部分舍去。
位运算符就是将操作数所有二进制位向右移动。运算时,左边的空位根据原数的符号位补0或者1(原来是负数就补1,是正数就补0)。
位运算符就是将操作数所有二进制位向右移动一位。运算时,左边的空位补0(不考虑原数正负)
运算符的优先级
在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序。
数字越小优先级越高。
优先级
运算符
1 . [ ] ( )
2 ++ - - ~ ! (数据类型)
3 * / %
4 + -
5
6 = =
7 == !=
8
9 ^
10 |
11
12 ||
13 ?:
14 = *= /= %= += -= = = = = ^= |=
编写程序时,尽量使用括号()来实现想要的运算顺序,以免产生歧义。
选择结构语句
if条件语句
if语句:判断条件是一个布尔值,当判断条件为true时,{}中的执行语句才会执行。
if(判断条件){
代码块
}
1
2
3
if···else语句:判断条件为真,执行语句1,为false执行语句2
if(判断条件){
执行语句1}else{
执行语句2}
三元运算符
判断条件?表达式1:表达式2
三元运算符会得到一个结果,通常用于对某个变量进行赋值,当判断条件为真时,结果为1的值,否则结果为表达式2的值。
int max=xy?x:y;
1
2
3
4
5
if···else if···else语句
if···else if···else语句用于对多个条件进行判断,进行多种不同的处理。
if(判断条件1){
执行语句1}else if(判断条件2){
执行语句2}...else if(判断条件n){
执行语句n
}else{
执行语句n+1}
当判断条件1为true时,会执行语句1。为false时,会执行判断条件2,如果为true则执行语句2,依次类推,如果所有的判断条件都为false,则意味着所有条件均为满足,else后面{}中的执行语句n+1会执行。
1
2
3
4
5
6
7
8
9
10
11
switch条件语句
switch(表达式){
case 目标值1:
执行语句1
break;
case 目标值2:
执行语句2
break; ...
case 目标值n:
执行语句n break;
default:
执行语句n+1
break;
}123456789101112131415
switch语句将表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,会执行对应case后的语句,如果没有找到任何匹配的值,就会执行default后的语句。
在switch语句中的表达式只能是byte、short、char、int类型的值,如果传入其他类型的值,程序会报错。但这样说也不严谨,在JDK5.0中引入的新特性enum枚举和在JDK7.0中引入的新特性String类型也可以。
在使用switch语句中,如果多个case条件后面的执行语句是一样的,则该执行语句只需书写一次即可,这是一种简写的方式。
int week=2;switch(week){ case 1: case 2: case 3: case 4: case 5:
System.out.println("今天是工作日"); break; case 6: case 7:
System.out.println("今天是休息日"); break;
}1234567891011121314
循环结构语句
while循环语句
while(循环条件){
执行语句
}
{}中的执行语句被称作循环体。当循环条件为true时,循环体就会执行。循环体执行完毕时会继续判断循环条件,如条件仍为true则会继续执行,直到循环条件为false时,整个循环过程才会结束。
1
2
3
do···while循环语句
do{
执行语句
}while(循环条件);
循环体会无条件执行一次,然后再根据循环条件来决定是否继续执行。
1
2
3
for循环语句
for循环语句是最常用的循环语句,一般用在循环次数已知的情况下。
for(初始化表达式;循环条件;操作表达式){
执行语句
}
先执行初始化表达式,然后判断循环条件,为false就退出循环,为true的话就执行语句,然后执行操作表达式,然后再判断循环条件。。。
1
2
3
嵌套循环
嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。while、do···while、for循环语句都有可以进行嵌套,并且它们之间也可以互相嵌套。
跳转语句(break、continue)
break语句
在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出循环语句,执行后面的代码。
continue语句
continue语句用在循环语句中,它的作用是终止本次循环,执行下一次循环。
方法
什么是方法
将重复的代码提取出来封装成一个方法。
修饰符 返回值类型 方法名([参数类型 参数名1,参数类型 参数名2,···]){
执行语句 return 返回值;
}1234
修饰符:对访问权限进行限定。
返回值类型: 用于限定返回值的数据类型
参数类型:用于限定调用方法时传入参数的数据类型
参数名:是一个变量,用于接收调用方法时传入的数据。
return关键字:用于结束方法及返回方法指定类型的值。
返回值:被return语句返回的值,该值会返回给调用者。
方法中的“参数类型 参数名1,参数类型 参数名2”被称作参数列表,它用于描述方法在被调用时需要接收的参数,如果方法不需要接收任何参数,则参数列表为空,即()内不写任何内容。方法的返回值必须为方法声明的返回值类型,如果方法中没有返回值,返回值类型要声明为void,此时,方法中return语句可以省略。
方法的重载
在一个程序中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。
方法的重载与返回值类型无关,它只需要满足两个条件,一是方法名相同,二是参数
Q3: 怎样用java代码提取嵌在中间的文本
用javaJava将代码提取成方法的意思是把这段html代码传到了后台处理?那么Java将代码提取成方法你可以分析中间文本存在Java将代码提取成方法的规律啊Java将代码提取成方法,
如果是固定格式那么可以substring固定的位数
可以给fontsize定义一个id然后java里找到这个id在字符串中的index+1,然后substring截取到它后面的/font
Q4: 我想把这段java代码封装,重复代码太多了
你把重复的代码提取出来封装成一个方法不就是了,无非就是
private void SendData(int screenid,int controlid,String info)
{
UpdateTextData data=new UpdateTextData();
data.setScreen_id(screenid);
data.setControl_id(controlid);
data.SetStrings(info);
ListByte.......
RS232.write.......
}
之后在你的popupAlertWindow里就可以写
SendData(7,5,String.valueOf(code));
SendData(7,5,type);
SendData(7,5,info);
Q5: 如何将java代码,做成e?x
总得来说有两步,先打成jar包再打成exe。
第一步打成jar:
方法一:用Eclipse自带的打包工具Ant打包,因为要自己编写xml脚本语言,还要增加一些外部的jar,所以不推荐。
方法二:用Eclpise的Export功能,这种打包方法不能把项目中的外部的jar包打进来,所以不推荐。
方法三:用Eclipse的一个第三方插件fatjar生成jar文件,也是本人觉得最简单最方便的一种生成方式。
下面详解方法三:
先从网上下载些插件,解压后是一个plugins的文件夹,里面只有一个文件夹,我的是“net.sf.fjep.fatjar_0.0.27”将它copy到dropins文件夹下,
此插件就安装成功了,重启Eclipse在项目上右击就会看到多出一个“Build Fat Jar”在前面有个绿色的“+”号,这时你就可以用此插件打包你的项目了。
进去后第一个界面Jar-Name里增入要生成的jar文件名。在Main-Class后点Browse像Export一样它也会列出你项目中的主类,
选择后其它默认即可,Next后会列出你要打包的所有内容,这个插件的优势就是可以将你项目中的外部jar也打进来,有三个选项,
其中Export ANT是生成build.xml脚本文件,方便用户以后修改脚本,其它两个按钮没用。在这里什么都不点,直接点Finish就可以生成jar文件。
第二步:将jar打成.exe文件
方法一:用打包工具j2ewiz,这个软件是绿色的,不用安装,解压后可以直接运行,但这个软件生成的 .exe文件不是跨平台的,不推荐。
方法二:用打包工具exe4j,网上下载破解版安装。安装后运行左窗窗口标有十步,其实打包过程也非常简单。
下面详解方法二:
第一步完全略过,直接点Next。
第二步我们选择“JAR in EXE mode” 就是选择我们已经有制作好的jar文件。
第3步上面是项目名称,可随便填写,下面一个写出你想要将打包后的exe文件输出的目录。
第4步控制台输出选择第二个,Executable name写你将要生成的.exe文件的名字,Icon File可以选择生成文件的图标。
第5步,先别管上面的,先在下面单击绿色的“+”号,在弹出的窗口中点Archive,然后找到起初已经做好的jar,"OK"后返回,
在下面的Class Path里就出现jar文件路径后,再在上面Main Class栏内点击找到main所在的类。
第6步,你系统的JRE版本,一般是填个1.3,下面填1.6在这里单击advanced options,选择search sequence。
选这个就是因为我们要把JDK环境也打包进来,好让程序能跨平台使用。回到exe4j中在弹出窗口删除列表中的所有项。
一个注册表的,一个JAVA环境变量的,一个JDK环境变量的,都不要。然后单击绿“+”,选择directory并选择JRE的根目录,
选完后exe4j弹出窗口中的Directory里会显示“.\JRE”。点OK关闭该窗口,返回exe4j的主窗口,你就可以看到刚加的路径。
再从主窗口左侧窗口中单击advanced options,并选择preferred VM,在弹出的窗口中选择client hostspot VM,单击next按钮继续。
7、8步是一些个性设置默认即可。
第9步编译完。
第10步你点那个“Click Here to Start the Application”按钮就可以看到程序运行效果了,
然后再点"Seave as“保存一个exe4j生成的一个文件,和.exe程序无关用来修改或重新编译生成exe文件。
Java将代码提取成方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java取余代码、Java将代码提取成方法的信息别忘了在本站进行查找喔。







