Java基础

命令行运行java

jar包都放在lib文件夹里

java -Djava.ext.dirs=lib Main

参数前加-D,用来在启动一个java程序时设置系统属性值。如果该值是一个字符串且包含空格,那么需要包在一对双引号中。
系统属性值是可以通过System.getProperty()得到的系统属性。

#将所有的调试信息输入到文件 nohup.out
nohup java -jar vPaas.jar > nohup.out 2>&1 &

运行参数和系统参数
Springboot项目java -jar 启动jar包参数详解
https://blog.csdn.net/baidu_35140444/article/details/82980139

ubuntu 安装jdk

JDK是java的开发环境,它包括了运行环境(jre)和开发中需要的编译、调试、程序诊断。
很多软件已不需要通过环境变量JAVA_HOME来找到java的运行环境。
http://www.cnblogs.com/a2211009/p/4265225.html

jre是提供java运行环境而不是开发环境
OpenJDK 和 Sun JDK 的关系

sudo apt-get install openjdk-8-jdk

Centos安装OpenJDK

#yum搜索OpenJDK8软件包 
yum search java-1.8.0|grep openjdk 
#安装java-1.8.0-openjdk.i686
yum install java-1.8.0-openjdk.x86_64 -y 

Map和List的简单构建方式

new HashMap(){{
            put("saleState",saleState);
            put("serveType",serveType);
        }}

new ArrayList<List>(){{
add(masterSocketDeviceIds);
add(dimmingLightDeviceIds);

Array转List
List list= Arrays.asList(strArr);
}};

Java没有范型数组

java中的数据类型分类

  • 基本数据类型(或叫做原生类、内置类型)8种:
    整数:byte,short,int,long(默认是int类型)
    浮点类型: float,double(默认是double类型)
    字符类型:char
    布尔类型:boolean,布尔类型数据只有两个值:true(真)、false(假),不对应任何数字,不能与数字进行转换。
    数据类型之间除了boolean,其他数据类型之间可以任意的相互转换(强制转化或默认转换),这个与c++中有区别。
  • 引用数据类型
    3种:类、接口、数组。数组不是原生类,数组是一种对象。java中定义数组有两种方式,一种是int[] number,另一种是int number[]。推荐第一种,可读性高。

byte

char与byte?
byte是8位的一个字节。
char通常以UTF-16 Big Endian的方式保存一个UNICOEDE字符,是16位的整数。

java中的byte、int等都是有符号的,取byte的无符号数只要进行&0xff操作即可:

public static int[] toUbytes(byte[] bytes){
        int[] ints=new int[bytes.length];
        for(int i=0;i<bytes.length;i++){
            ints[i] = bytes[i] & 0xff;
        }
        return ints;
    }

public static String bytes2HexString(byte[] bytes) {
        String ret="";
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            ret+=hex;
        }

        return ret.toUpperCase();
    }

Java字段反射+POI示例:
http://blog.csdn.net/panpan96/article/details/76566475

不可变(immutable)对象

Integer,String。

Base64

BASE64Encoder/BASE64Decoder类在sun.misc包中,是sun公司的内部方法,以后有删除的潜在可能,
Base64类在java.util包中,推荐使用Base64.getEncoder()。

split

String[] subs=str.split(“,”,-1);//limit -1 不忽略两端的分隔符。

java -jar 命令行传参并获取的方法

方式一:
java -jar xxx.jar aaa bbb cccc,传了3个参数,通过main方法的参数获取。
方式二:
java -jar xxx.jar -Da1=aaa -Db1=bbb -Dc1=ccc,通过System.getProperty(“aaa”,”1″); 方式获取。作为环境变量。
方式三:
java -jar xxx.jar –a1=aaa –b1=bbb,springboot的写法,可以通过@Value(“${a1}”)获取。
注意参数的位置以及中划线符号的数目:
jar、Dspring.profiles.active前面是一个中划线,db.url等自定义参数前面是2个中划线。
-Dspring.profiles.active位于-jar之前,–db.url参数位于.jar之后。

java -Dspring.profiles.active=dev -jar yirui_clock_storage-1.0.jar --db.url=localhost --db.port=14000 --db.username=数据库用户名 --db.password=数据库密码

spring.profiles.active运行时指定方式

mvn命令运行:mvn spring-boot:run -Drun.profiles=test
命令行运行jar文件: java -jar -Dspring.profiles.active=test xxx.jar

Java对象的地址

对象的hashcode是否是它的地址,这取决于具体的实现,一般来说,它常常是对象的初始地址的整数表示,但是这种实现技术并不是Java编程语言所规定的。在GC后,对象的地址可能会变动,不同的JVM实现也有差异。

java知识网站

http://www.java1234.com

Java的参数传递都是值传递

传值分为内容值和地址值,传地址值可以认为是传引用。

  • 值传递:方法调用时,实际参数把它的值的副本传递给对应的形式参数。特点:此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
  • 引用传递:方法调用时,实际参数的地址的副本被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址。在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到原始对象。但对引用的赋值不会影响原始对象。
  • 基本类型:传递的是值的拷贝,也就是说传递后就互不相关了,也就是说,不过副函数的副本如何变化,主本永远不会被影响。
  • 引用类型:传递的是引用地址值,有可能会被影响。
  • String:传引用,但由于String不可变性,传递后不相关。

String

String是final修饰的java类,不是基本的数据类型。
String、StringBuffer、StringBuilder三者中,StringBuffer运行速度比String快,StringBuilder运行速度最快。StringBuffer是线程安全的,String的值是不可变的。
andyweike博客之String

String s = new String(“xyz”);创建了几个String Object?答案:两个。一个是字符串字面量”xyz”所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与”xyz”相同的实例。

String是immutable的,其内容一旦创建好之后,就不可以发生改变。StringBuffer 改变的原理是其内部采用了字符数组存放数据。

substring(start,end)取头去尾

IO 的最佳实践

a)使用有缓冲区的 IO 类,而不要单独读取字节或字符。
b)使用 NIO 和 NIO2
c)在 finally 块中关闭流,或者使用 try-with-resource(Java7) 语句。
d)使用内存映射文件获取更快的 IO。

管道(Pipe)通信中性质?
A、进程对管道进行读操作和写操作都可能被阻塞,管道为空,读操作会被阻塞;管道满了,写操作会被阻塞。
B、一个管道可以有多个进程对其读;也可以有多个进程写,只不过不能同时写。
C、匿名管道只能单向;命名管道可以双向。
D、管道的容量仅内存大小限制

Object类

  • wait, notify 和 notifyAll 方法定义在Object类中。
  • filalize定义在Object类中,它只有在对象被GC时才会被调用,可以在这个方法里释放掉非Java代码开辟的内存空间。

内部类

A、 内部类的名称与定义它的类的名称不可以相同
B、 内部类可用abstract修饰
C、 内部类可作为其他类的成员
D、 内部类可访问它所在类的成员

运算符

运算符优先级口诀:单算位关逻三赋。
单目:++、–
算术:+、-、*、/、%
位:位移运算符:>、>>>
关系:、=、==
逻辑:&&、||、!、&、|、^
三目:三目运算符(又称为三元运算符)A>B? x:y
赋值:=

java中的i++和++i在java语言层面上来看,使用中间量机制:i=i++,i不变; i=++i相当于++i;但结合在一个语句里使用则会报错,因为++后应该跟变量。同理,i=(++i)++也是不对的。

执行顺序

try中有return语句,finally块会执行完后再去执行return。

final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
finalize是Object类的一个方法,在垃圾收集器执行的时候,会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等。一个对象只能执行一次finallize,只能在第一次进入被回收的队列,而且对象所属于的类重写了finalize方法时,才会被执行。第二次进入回收队列的时候,不会再执行其finalize方法,而是直接被二次标记,在下一次GC的时候被GC。一个对象可能多次进入回收队列?

finally也有不执行的时候,但是这个题不要扣字眼。
**1. 在try中调用System.exit(0),强制退出了程序,finally块不执行。**
**2. 在进入try块前,出现了异常,finally块不执行。**

编译时异常和运行时异常

编译时异常在编码中必须要捕获,而运行时异常可以通过优化完善代码而解决。
RuntimeException和Error都是运行时异常,也称为非检查型异常,运行时异常编码捕获为可选。

发表评论