Java基础学习_1


记得当时还在学校的时候,在大二上?(不太确定……),自学过一段时间的Java(自己买的《Head First Java》进行学习的),当时只是刚刚学了C语言,还没有面向对象的概念,院里本来说是提供C++和Java供我们选择一门进行教学的,后来据说是因为院里面觉得搞安全的就应该学C++而不是Java,所以强制性的让每个人选了Java,当时觉得也没什么(C++比Java效率高;C#比Java开发效率快;为什么学Java呢?就因为它是面向对象的语言么?还是什么别的?),不过后来C++也没怎么学会,也就在学校的时候需要上机做作业、考试的时候需要用到,后来的实际工作中用不到(也因为没有找相关偏底层的工作),用的全是PHP、Python、shell这些,有时候会改一改C程序,反正和C++、Java什么的都不沾边,不过最近因为工作中碰到的一些工具大部分都是用Java写的,公司的主要编程语言也都是Java,不会点Java看来是跟不上趟了,不行,还是得学习学习Java,找了个之前就发现的Java教程一步一步过了一遍,有那么点感觉了,记录一下:

通过:Java快速教程 – Vamei 进行学习(因为之前已经看过一遍《Head First Java》了,而且也有过C++等语言的编程经验,学习起来不至于像计算机初学者那样完全从头开始,可以适当的快一点)。

主要在于:Java基础01Java基础07 这两篇文章,一篇是Java文件的命名和相关基础的介绍,另一篇是Java的package的概念,自己稍微记录了些内容如下。


之前已经写了一些Java程序。之前的每个Java程序都被保存为一个文件,比如Test.java。(在一个.java文件中,最多只能有一个类带有public关键字;并且该带有public关键字的类的名字与.java文件的名字要相同)随后,该程序被编译(使用命令javac进行的编译)为Test.class。我们最终使用$java Test来运行程序。

然而,在一个正常的Java项目中,我们往往需要编写不止一个.java程序,最终的Java产品包括了所有的Java程序。因此,Java需要解决组织Java程序的问题。包(package)的目的就是为了更好的组织Java程序

包的建立非常简单。我们只用在Java程序的开始加入package就可以了。

package com.vamei.society;

包为Java程序提供了一个命名空间(name space)。一个Java类的完整路径由它的包和类名共同构成,比如com.vamei.society.Human。相应的Human.java程序要放在com/vamei/society/下。类是由完整的路径识别的,所以不同的包中可以有同名的类,Java不会混淆。比如com.vamei.society.Human和com.vamei.creature.Human是两个不同的类。

包的调用:我们只需要将Human.java编译的Human.class放入相应的文件夹就可以了。比如,我将Human.class放入com/vamei/society/中。实际上,你也可以把.java文件放入相应路径,Java会在使用时自动编译。

如果整个包(也就是com文件夹)位于当前的工作路径中,那么不需要特别的设置,就可以使用包了:

  1. 在Java文件开头使用import语句
  2. 在代码中提供类的完整的路径
  3. 如果包没有放在当前工作路径下,我们在使用包时,需要通知Java
    • 一个方法是在使用javac和java时,用-classpath说明包所在的文件夹路径;
    • 另外也可以设置系统的CLASSPATH环境变量,将上述路径加入到该变量中,而不用每次都键入-classpath选项。
C:\> java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

C:\> java -h
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32          使用 32 位数据模型 (如果可用)
    -d64          使用 64 位数据模型 (如果可用)
    -server       选择 "server" VM
    -hotspot      是 "server" VM 的同义词 [已过时]
                  默认 VM 是 server.

    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 ; 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<libname>[=<选项>]
                  加载本机代理库 <libname>, 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:<pathname>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jarpath>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:<imagepath>
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

如何创建jar包?

Creating a JAR File

http://stackoverflow.com/questions/18146361/how-to-create-jar-file-with-package-structure

http://stackoverflow.com/questions/4597866/java-creating-jar-file

jar cf jar-file input-file(s)      #和Linux下的tar命令非常像
C:\> jar
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项包括:
    -c  创建新的归档文件
    -t  列出归档目录
    -x  从档案中提取指定的 (或所有) 文件
    -u  更新现有的归档文件
    -v  在标准输出中生成详细输出
    -f  指定归档文件名
    -m  包含指定清单文件中的清单信息
    -e  为捆绑到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储; 不使用情况任何 ZIP 压缩
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含其中的文件
如果有任何目录文件, 则对其进行递归处理。
清单文件名, 归档文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。

示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中:
       jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并
           将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
       jar cvfm classes.jar mymanifest -C foo/。
Example:
jar cvf program.jar -C path/to/classes .

That assumes that path/to/classes contains the com directory.
FYI, these days it is relatively uncommon for most people to use the jar command directly, as they will use a build tool such as Ant or Maven to take care of that (and other aspects of the build). It is well worth the effort of allowing one of those tools to take care of all aspects of your build, and it's even easier with a good IDE to help write the build.xml (Ant) or pom.xml (Maven).

如何使用jar包?
java -jar myJar.jar

在CentOS上安装/设置Maven
下载地址:

http://maven.apache.org/download.cgi

http://mirror.bjtu.edu.cn/apache/maven/binaries/

以版本apache-maven-3.0.4-bin.tar.gz为例:

tar -xvf apache-maven-3.0.4-bin.tar.gz
mv apache-maven-3.0.4 /usr/local/apache-maven

文件存放好之后,设置环境变量:打开/etc/profile,进行编辑:

$ sudo vim /etc/profile
or
$ sudo vim ~/.bashrc
export JAVA_HOME=/usr/local/jdk1.6
export MAVEN_HOME=/usr/local/apache-maven
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin:$PATH

再执行以立即生效:

$ source /etc/profile
$ source ~/.bashrc

Maven的POM文件:http://maven.apache.org/pom.html

mvn常用命令:



Maven的常用命令为:

mvn archetype:create :创建 Maven 项目

mvn compile :编译源代码

mvn test-compile :编译测试代码

mvn test : 运行应用程序中的单元测试

mvn site : 生成项目相关信息的网站

mvn clean :清除目标目录中的生成结果

mvn package : 依据项目生成 jar 文件

mvn install :在本地 Repository 中安装 jar

mvn eclipse:eclipse :生成 Eclipse 项目文件

 

, ,

《 “Java基础学习_1” 》 有 16 条评论

  1. Jvm加载jar包的顺序
    https://mp.weixin.qq.com/s/h4E59kcTxgUh8tQSj3VX4Q
    `
    使用 -XX:+TraceClassPaths 或者在服务器上执行 jinfo 时,都能得到classpath包含的jar包信息。
    这些jar的顺序不同的机器总是不一样的,平时没有问题,所以也没有细想过,这些jar包的顺序为什么会不一样的。

    如果有多个同名的类只会加载其中第一个。

    问题就是jar的加载顺序问题,而这个顺序实际上是由文件系统决定的,Linux内部是用inode来指示文件的。jvm在Linux通过jar文件在文件系统中生成顺序来进行加载,在Linux底层是inode数据机构。
    `

  2. 记一次微服务jvm加载jar顺序机制导致的bug
    https://mp.weixin.qq.com/s/Y0QFofzF_T9OYmb4kAS-zg
    `
    问题从发生到定位花了较长时间,这个bug确实很神奇。现在复盘来看,主要是我们对于jvm、类加载机制,缺少深入了解,导致bug定位时间较长,后续要加强对于底层jvm各种机制原理理解,以方便快速定位线上问题。

    再有就是要加强代码review,设计实现review,通过审查避免一些问题,也是我们需要加强的方面。

    这样一个问题本身也说明了对于技术进行深挖的价值,对整个链条越理解,越是能找到薄弱点优化点,而不是为了轮子而轮子,为了架构而架构,进行合理并且不浪费的设计,才是合理的设计,过少或者过于复杂过多设计都不是好设计。
    `

  3. Java面试通关要点汇总集
    http://blog.720ui.com/2018/java_interview/
    `
    1. 基础篇
      1.1. 基本功
      1.2. 集合
      1.3. 线程
      1.4. 锁机制
    2. 核心篇
      2.1. 数据存储
      2.2. 缓存使用
      2.3. 消息队列
    3. 框架篇
      3.1. Spring
      3.2. Netty
    4. 微服务篇
      4.1. 微服务
      4.2. 分布式
      4.3. 安全问题
      4.4. 性能优化
    5. 工程篇
      5.1. 需求分析
      5.2. 设计能力
      5.3. 设计模式
      5.4. 业务工程
      5.5. 软实力
    `

  4. 面试官:今日头条启动很快,你觉得可能是做了哪些优化?
    https://www.jianshu.com/p/d0fe74f4e9c4
    `
    网上关于启动优化的文章多不胜数,内容千篇一律,大都是列举一些耗时操作,采用异步加载、懒加载等。

    而在面试过程中,关于启动优化的问题,如果只是很表面地回答耗时操作应该放在子线程,显然太过于普通,无法跟竞争者拉开差距。如何让面试官知道你的“内功深厚”,那肯定是要往原理层面去回答。

    本文重点还是关注原理,冷启动优化这个问题能延伸到很多原理层面的知识点,本文比较有意思的地方是通过反编译今日头条App,研究大厂的启动优化方案。

    讲启动优化之前,先看下应用的启动流程

    一、应用启动流程
    二、启动优化
    直奔主题,常见的启动优化方式大概有这些:
    · 闪屏页优化
    · MultipDex优化(本文重点)
    · 第三方库懒加载
    · WebView优化
    · 线程优化
    · 系统调用优化

    2.1 闪屏页优化
    2.2 MultiDex 优化(本文重点)
      2.2.1 apk编译流程
      2.2.2 MultiDex 原来这么耗时
      2.2.3 MultiDex 原理
      2.2.4 ClassLoader 加载类原理
      2.2.5 原理小结
      2.2.6 MultiDex 优化(两种方案)
    2.3 预创建Activity
    2.4 第三方库懒加载
    2.5 WebView启动优化
    2.6 数据预加载
    2.7 线程优化

    三、启动耗时分析方法
    3.1 Systrace + 函数插桩
    3.2 BlockCanary 也可以检测
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注