x=x+1,x+=1,x++ x++效率最高;x=x+1需4步,x+=1需3步,x++需2步。
Java中涉及byte、char和short类型的运算操作首先会把这些值转换为int类型,然后对int进行运算,最后得到int类型结果。
short s=1;s=s+1; 错误 short s=1;s+=1; 正确
public class Test {
public static void main(String args[]){
char a;
a = '*';
System.out.println(a);
int ia = (int)a;
System.out.println(ia);
a += a;
System.out.println(a);
}
}
*
42
T
assert Expression1:Expression2
assert断言默认不开启,需加参数-enableasserttions或-ea。
Expression1不通过则抛java.lang.AssertionError异常打印Expression2
error和exception的区别:
error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
反射可以在运行时加载、探知、使用编译期间完全位置的classes。换句话说,java程序可以加载一个运行时才得知名称的class、获悉其完整构造(但不包括methods定义),并生成其对象实例、或对其fields设值,或唤起其methods。
final、finally、finalize区别
final修饰的变量初始化有2个地方,一是其定义处,二是在构造函数中,两者只能选其一;
final修饰的方法有两个原因:一是不允许从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用;二是允许编译器将所有对次方法的调用转化为inline(行内)调用的机制,但要注意程序代码迅速膨胀。
String的形参传递:
public class test {
public static void main(String[] args) {
String str = "hello";
changeStr(str);
System.out.println(str);
}
public static void changeStr(String str){
str += "1";
}
}
//Output:hello
字符串是值传递。Sring的本质是一个值,如果把值当作一个仓库的话,函数就是在某块空地(栈的临时存储区)上重建了一个一模一样的仓库。原来的仓库假设为A,后面的仓库假设为B。当changeStr函数中str改变时只是改变仓库B里面的屋子。这有点像基本类型。
类内访问私有成员
public class Test {
private int court;
Test(int i){ court = i; }
public static void main(String[] args) {
Test t = new Test(99);
System.out.println(t.court);
}
}
//Output:99
定义在类内的变量会被赋予一个默认的值
public class Test {
static boolean b;
public static void main(String[] args) {
System.out.println(b);
}
}
//Output:false
从键盘接收输入数据:
public class Test {
static String getInput(){
String str = "";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try{
str = br.readLine();
} catch(IOException e){ return "IOException"; }
return str;
}
public static void main(String[] args) {
System.out.println(getInput());
}
}
判断一个整数是不是2的阶次方:
public class Test {
static void check(int d){
if( ((d-1)&(d))==0 && (d!=0) ) System.out.println("ok");
else System.out.println("false");
}
public static void main(String[] args) {
check(64);
}
}
switch的参数是byte、char、short、int、enum。
Heap和Stack区别
堆是运行时数据区,类的对象从中分配空间。
栈数据可以共享(int a=3;会先在站中查找有没有3),栈中数据大小与生存期必须是确定的,栈主要存放一些基本类型的变量和引用。
String是一个特殊的包装类数据,String str = new String("abc");新创建一个对象 String str = "abc";会先从常量池查找有没有存放“abc”,有则指向。
String str1 = "abc"; String str2 = "abc"; str1==str2 -----> true
String str1 = new String("abc"); String str2 = new String("abc"); str1==str2 -----> false
HashMap和Hashtable
Hashtable是线程安全的。
HashMap没有分类或排序,允许一个null键和多个null值,Hashtable不允许null键和null值。
HashMap将Hashtable的contains()去掉,改成containsvalue(),containskey()
内部类或嵌套类在类层级上没有限制,内部类可以是私有类。
重载overload:
每个重载方法的参数的类型和(或)数量必须是不同,返回类型并不足以区分所使用的是哪个方法。
Java的自动类型转换也适用于重载方法的自变量,例如只有test(double),test(int i = 88)则会调用到test(double)。只有找不到精确匹配时,Java的自动转换才会起作用。
继承的方法修饰词static,final
父类的final、static方法会继承到子类,子类可以调用但不能覆盖;
子类可以重新定义与父类static方法一样的方法(含static关键字),当子类不能重新定义与父类final方法一样的方法(含final关键字)。
Only constructors can invoke constructors.子类的构造函数如果要引用super的话,必须把super放在构造函数的首位。this()同理,只能出现在被构造函数调用,且只能出现在第一行。
子类构造函数调用父类构造函数时,注意父类构造函数会调用子类的多态函数,同时注意变量不会有多态、父子类重名变量的可见性:
class Base{
int i;
Base(){
add(1);
System.out.println(i);
}
void add(int v){
i += v;
System.out.println(i);
}
}
class MyBase extends Base{
// int i = 1;
MyBase(){
add(2);
}
void add(int v){
i += v*2;
System.out.println(i);
}
}
public class Test {
public static void main(String args[]){
go(new MyBase());
}
static void go(Base b){
b.add(8);
}
}
//output:2 2 6 22
//去掉注释的结果值得注意 output:2 0 5 21
首先执行new MyBase(),调用父类构造函数Base();在Base()中执行add()方法,这里需要注意,这个add方法由于实在新建MyBase对象时调用的,所以会首先查找MyBase类中是否有次方法,所以Base()函数中的add(1)实际上执行的是
void add(int v){
i += v*2;
System.out.println(i);
}
同时注意变量i在父类变化会带到子类。
注意到程序中的注释部分,若去掉注释,则在执行上面流程时,在Base()函数调用add(1),i是MyBase中定义的i,此时i还没有被初始化,所以是0。若在MyBase定义了i,则在MyBase类中见到的i是在MyBase类定义的i,同时注意初始化问题。
数组没有length()这个方法,有length属性,String有length()方法。
String与char的比较:
import java.util.Arrays;
public class Test {
public static void main(String args[]){
String s = "hello";
String str = "hello";
char c[] = {'h', 'e', 'l', 'l', 'o'};
char ch[] = str.toCharArray(); //String转换成char[]
if(s.equals(ch)) System.out.println("true");
else System.out.println("false"); //1
if(ch == c) System.out.println("true");
else System.out.println("false"); //2
if(ch.equals(c)) System.out.println("true");
else System.out.println("false"); //3
if(Arrays.equals(ch, c)) System.out.println("true");
else System.out.println("false"); //4
String s2 = new String(c); //char[]转换成String
if(s2 == (s)) System.out.println("true");
else System.out.println("false"); //5
if(s2.equals(s)) System.out.println("true");
else System.out.println("false"); //6
}
}
false
false
false
true
false
true
1,char和String是两种不同的类型,所以比较结果不同;
3,在数组上调用equals,就是Object里面的方法,比较的是两个对象的地址,而c和ch地址不同;
4,用Arrays.equals(a,b)就能比较两个数组内容;
String.intern()
public class Test {
public static void main(String args[]){
String s1 = "hello";
String s2 = new String("hello");
s2 = s2.intern();
System.out.println(s1 == s2);
}
}
true
在常量池查找内容相同(equals())的字符串,查找不到则在常量池加入字符串。
String文字池(pool of literal strings)
由于字符串对象的大量使用(它是一个对象,一般而言对象总在heap分配内存),Java中为了节省内存空间和运行时间,在编译阶段就把所有的字符串文字放到一个文字池中,而运行时文字池成为常量池的一部分。文字池的好处就是该池中所有相同的字符串常量被合并,只占用一个空间。
以下创建了几个对象?
String A, B, C;
A = "a";
B = "b";
A = A + B;
StringBuffer D = new StringBuffer("abc");
D = D.append("567");
数组声明不能直接指定行数或列数,应该是在创建数组对象时定义数组的行数和列数,二维数组可以列数不同:
int iArray[][] = new int[3][4]
synchronized和java.util.concurrent.locks.Lock异同
同:Lock能完成synchronized所实现的所有功能;
异:Lock比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
JAVA接口中对于字段会加上隐式的public,static,final,方法会加上public,abstract
分享到:
相关推荐
除了Java基础之外,还有一小部分web方面的知识,如:JSP、EL表达式、JSTL、过滤器与监听器之类的知识,但是只有一小部分
5. **学习杂记**:学习加密算法不仅需要理解算法原理,还要熟悉Java提供的加密API。实践是提升技能的关键,通过编写示例代码,理解如何创建密钥、初始化Cipher对象、处理加密和解密过程。同时,了解加密过程中的常见...
- **jre**:Java 运行时环境,包含了运行 Java 程序所需的库和虚拟机。 - **src.zip**:源代码归档文件,通常包含了一个项目的全部源代码。 以上是对给定文件中提到的基础知识点的详细解释,涵盖了计算机编程领域的...
然而,Eclipse需要Java运行环境支持,因此你需要先安装JRE(Java Runtime Environment)和JDK(Java Development Kit)。JRE提供运行Java程序所需的环境,JDK则包含开发工具。下载并安装jre-6u23-windows-i586.exe和...
本篇将深入探讨Java多线程的相关知识,结合《java随笔杂记.doc》文档中的内容,我们将覆盖以下几个方面: 1. **线程的创建方式** - 实现`Runnable`接口:创建一个实现了`Runnable`接口的类,然后将其实例传递给`...
在Java并发编程中,AbstractQueuedSynchronizer(AQS)是一个重要的抽象类,它是实现锁和其他同步组件的基础。AQS通过一个int类型的state变量来管理锁的状态,这个状态可以是独占模式(exclusive mode)或共享模式...
在本篇《SpringMVC杂记(五) JSR303数据验证》中,我们将深入探讨SpringMVC框架如何集成并使用JSR303(JavaBeans Validation)来进行数据验证,这是一种强大的验证机制,可以确保应用程序接收到的数据是合法且符合...
首先,Listener(监听器)是Java Servlet规范中的一部分,主要用于监听特定事件并执行相应操作。常见的Listener包括HttpSessionListener、ServletContextListener和ServletRequestListener等。例如,...
3. **Java编译**:Java Compiler将R文件、Java源代码、aidl转换的Java接口统一编译为.class文件。 4. **DEX生成**:通过dx工具将.class文件转换为Dalvik可执行的.dex文件。 5. **资源打包**:将处理后的资源文件、...
### STS、Maven与Nexus操作指南及配置详解 ...综上所述,通过详尽配置STS、Maven以及Nexus,可以建立一个高效的Java项目开发与构建环境,不仅提升了代码管理效率,还优化了依赖组件的下载和更新流程。
【Linux基础命令杂记】 在Linux环境中,掌握基础命令对于日常运维和开发工作至关重要。这里列举了一些常用的Linux命令,以及如何在Linux系统中与MySQL数据库交互。 1. **登录远程MySQL**: 使用命令 `mysql -h ...
```java @SessionAttributes("stepData") public class WizardController { // ... } ``` 这样,名为"stepData"的模型属性将在用户在向导的不同步骤之间导航时保持其值。 2. 多步骤流程管理: 在每个步骤中...
"Miscellany: Raizunne 杂记的 Minecraft mod 存储库"是一个专注于1.7.10版本的Minecraft模组集合,为游戏带来了一系列丰富多样的新元素和功能,让玩家在游戏中享受到更多元化的乐趣。 首先,我们要明确,...
程序员考试刷题讲座问题/杂记 使用hackerrank、codecademy、codesignal解决练习题 修改数组,比较 公共和静态是默认的? (是在讲座中) 所以局部变量没有默认值,但实例(类)变量有 使用随机 第 9 课的幻灯片 44 ...
zxing.java源码解析 个人技术博客 前言 开卷有益。 写在最前,长期以来,技术学习并没有养成分享的习惯。没有好好成体系的整理自己所学的知识,时间长了也容易遗忘。 仓库名起名PlayPen,这个名字源于我上一家公司一...
Java 数据库 Linux 杂记 :bullseye: :hot_beverage: :floppy_disk: :cloud: :memo: :black_nib:本仓库有来源自己总结,网上收集,视频笔记,如果有区别之处,可以联系我进行删除。 :scroll:笔记仓库: ...
#### 六、杂记 - **Namenode和Secondarynamenode的关系**: Namenode是HDFS的核心组成部分,负责管理文件系统的命名空间及客户端对文件的访问。而Secondarynamenode的主要职责是辅助Namenode,它定期合并fsimage文件...
jbpm,全称为Java Business Process Management,是一款开源的工作流管理系统,用于实现业务流程自动化。它在企业级应用中广泛使用,特别是在需要管理复杂工作流程的系统中。通过对jbpm的学习,我们可以深入理解业务...
通过阅读这个系列,你可以深入了解面向底层的C语言,以及面向业务的面向对象编程语言,比如JAVA和C++,同时还能接触到游戏开发的实例。 C语言是计算机科学中的基石,它让你能够直接与硬件交互,理解内存管理、指针...