数组的定义及初始化方式

  • 数组对象创建没有()
  • 一维数组
    • 静态初始化:

      • String[] books = {"Thinking in Java","Effective Java"};
      • String[] books = new String[] { "Thinking in Java","Effective Java" };
    • 动态初始化:
      • String[] books = new String[2]; //必须指定长度,然后单独赋值
  • 二维数组
    • String[][] str = {{"a","b","c",},{"d","e","f",},{"g","h","i"}};
    • String[][] str1 = new String[][]{{"a","b","c",},{"d","e","f",},{"g","h","i"}};
    • String[][] arr = new String[3][4];

Java内存分配图

  • 构造方法不能被继承
  • this和super指的是同一个对象(当前对象自动含有的对本类和父类对象的引用)
  • 方法的重载也是多态的一种形式
  • final类可以被实例化
  • abstract类不能被实例化,但是可以有构造方法

静态初始化只会在必要时刻才会进行

  • 并非启动项目时就会加载所有的class类(static域初始化),而是仅加载启动程序所需要的基础的class,在程序上进行操作时会用到新的类,才会去加载类的class文件(类在初次使用时才会加载),若此对象有静态域,则会在此时进行加载(加载类时才会初始化静态域),然后初始化这个类对象。(构造器默认也是static方法,因此可以说,类是在其任何static成员被访问时加载的)

java对象创建过程

  1. 首先JVM查找CLASSPATH下类名称所在的路径,定位class文件。
  2. 加载class文件,执行静态数据对象初始化工作(只在class对象首次加载时初始化一次)。
  3. 使用 new 创建对象,首先在堆内存上为此对象分配足够的内存空间。
  4. 清空内存空间,执行对象的自动初始化。
  5. 执行所有出现在字段定义处的初始化。
  6. 执行构造器。

继承中的对象初始化过程

  1. 基类的静态属性、代码块(按代码的先后顺序)
  2. 导出类的类静态属性、代码块
  3. 基类的普通属性、代码块
  4. 基类的构造方法
  5. 导出类的普通属性、代码块
  6. 导出类的构造方法
  • 类加载完成后(静态域初始化完成后)才会去调用方法如main(),才会创建对象,初始化普通域。

OOP

  • 封装:

    • 为数据、属性和方法设置适当的访问权限以隐藏具体实现细节,然后包装到一个类中。
    • 封装的结果是产生一个带有特征和行为的数据类型。
  • 继承(或实现):

  • 多态:

  • 抽象:

容器

一张图

三个知识点:

  1. 迭代器

    • 使用Iterator遍历,最安全:所有实现了 Collection 接口的容器类都有一个 iterator() 方法用以返回一个实现了 Iterator 接口的对象

    • foreach 使用foreach遍历的集合必须实现 java.lang.Iterable 接口,必须重写 iterator 方法,返回一个实现了 Iterator 接口的对象

  2. 比较器:

    • 实现实体对象的排序:需要实现Comparable接口
    • 排序比较器(解耦,多种排序规则):实现 Comparator 接口
    • List + Collections.sort();
    • Tree
    • Arrays
  3. 泛型:

    • 泛型类:不能用在静态方法及属性上,不能用在catch语句块中
    • 泛型方法:方法声明中加上“”表示这是一个泛型方法
    • 泛型与继承的关系:若类 A 是类 B 的子类,则 List<A> 就不是 List<B> 的子类
    • 通配符:
      • ?,可以是任意类型
      • ? extends A : 可以存放 A 及其子类
      • ? super A : 可以存放 A 及其父类
      • 可以读取声明为通配符的集合类的对象,不允许写入(null除外)

六个接口:

  1. Collection:是高度抽象出来的集合,它包含了集合的基本操作和属性.

  2. List:元素有序可重复,相当于动态数组,添加进List集合中的元素(或对象)所在的类一定要重写equals()方法,这里所说的顺序是指:元素插入的顺序与输出的顺序不一致.

  3. Set:元素无序不可重复,底层是Map(Set 的不可重复就是利用了 Map 中键对象的不可重复性!),相当于数学中的集合,添加进Set集合中的元素所在的类要求重写equals() 和 hashCode()方法.

  • 无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
  • 不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
  1. Map:数组中的链表,存储“键-值”对的数据,key使用Set存放,不允许重复 。value可以重复的,使用Collection来存放的。一个key-value对构成一个entry(Map.Entry),entry使用Set来存放。

  2. Iterator:仅用来遍历集合Collection元素。

  3. Comparable && Comparator

九个具体实现类:

  1. ArrayList:查询数据较快,效率高,底层是数组实现,数组元素相当于对象的成员变量,默认值与成员变量一样
  2. LinkedList:更适用于频繁的插入、删除操作
  3. HashSet:当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
  4. LinkedHashSet:使用链表维护了一个添加进集合中的顺序,能够按照添加顺序遍历,但并不代表有序(适用于频繁遍历的情况)
  5. TreeSet:有序,只能添加同一类型的元素,可以按照添加进集合中的元素的指定属性进行排序,排序是在添加数据时进行的,更改数据不会影响原来的顺序,不要修改数据,否则可能重复,解决办法是将属性修改为final类型,禁止修改。
  6. Collections:操作Collection及Map的工具类,大部分为static的方法。使用Collections.addAll(list, T...)要比list.addAll()效率高。
  7. HashMap:可以添加null键,null值。HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
  8. LinkedHashMap:原理同LinkedHashSet
  9. TreeMap:原理同TreeSet

  • Hashtable与HashMap的区别(面试):

    • 主要:Hashtable是线程安全的,同步,效率相对较低
    • 父类不同:Hashtable 是 Dictionary的子类,HashMap 是 AbstractMap 的子类
    • null:Hashtable键值都不能为null,HashMap键最多一个null, 值可以有多个null
  • Properties:Hashtable的子类,(读写资源配置文件,键与值只能为字符串)

    • 配置文件:

      • properties:存储store(), 读取load()
      • xml : 存储storeToXML(), 读取loadFromXML()

    类路径加载资源文件:

  1. // "/"表示bin目录
  2. pro.loadFromXML(类.class.getResourceAsStream("/"));
  3. // ""代表bin目录
  4. pro.loadFromXML(Thread.currentThread().getContextClassLoader().getResourceAsStream(""));

容器的两种排序方式

  1. 自然排序:

    • 要求添加进TreeSet中的元素所在的类实现Comparable接口
    • 重写compareTo(Object obj),在此方法内指明按照元素的哪个属性进行排序
    • 向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
    • 内置类:
      • 整数、小数:直接比较基本数据类型的大小 (Integer,Double)
      • 字符:比较 unicode 编码之差
      • 字符串:
        • 如果其中一个字符串 是另外一个字符串的起始子串,返回长度之差
        • 否则返回第一个不相等的 unicode 码之差
      • java.util.Date : 根据日期的 long 形数比较
  2. 定制排序:
    1. 创建一个实现Comparator接口的实现类的对象并重写compare(Object o1,Object o2)方法
    2. 在此compare()方法中指明按照元素所在类的哪个属性进行排序
    3. 将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
    4. 向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
  3. java.util.Arrays,asList() 方法返回的是一个自己的内部类 java.util.Arrays.ArrayList 产生的固定大小的特殊的数组。
  4. 排序时属性相同(return 0)对象也就相同了,因要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致。

IO流


多线程与并发

程序、进程与线程

程序:Program,静态概念

进程:Process 动态概念,作为资源分配的单位。

  • 正在运行的程序,其实就是一个应用程序运行时的内存分配空间,占用特定的地址空间,每个进程都是独立的,由3部分组成:CPU,DATA,CODE
  • 缺点:内存的浪费,CPU的负担

线程:Thread,调度和执行的单位,是进程中一个“单一的连续控制流程”(a single sequential flow of control)的执行路径,又被称为轻量级进程(lightweighht process),负责的是应用程序的执行顺序。

  • Threads run at the same time, independently of one another;
  • 一个进程可以拥有多个并行的(concurrent)线程(至少一个);
  • 一个进程中的线程共享相同的内存单元/内存地址空间--->可以访问相同的变量和对象,而且他们从同一堆中分配对象--->通信、数据交换、同步操作
  • 由于线程间的通信实在同意地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简单而且信息传递的速度也更快。

实现

  • 继承 Thread 类:重写run(),直接new当前对象调用start(),无法再继承其他类
  • 实现 Runnable 接口:实现run(),使用 new Thread(Runnable obj).start() 可以同时实现继承,方便共享资源

  • 静态代理模式
    1. 创建真实角色
    2. 创建代理角色并持有真实角色的引用 + Thread(引用) + 代理角色 .start()
    3. 两个角色实现同一接口

线程状态(声明周期)

  • 新生状态
  • 就绪状态
  • 运行状态
  • 阻塞状态
  • 死亡状态

线程终止

  1. 自然终止:线程体正常执行完毕
  2. 外部干涉:
    • 线程类中定义线程体使用的标识
    • 线程体使用该标识
    • 提供对外的方法改变该标识
    • 外部根据条件调用该方法即可

阻塞

  • join:合并线程
  • yield:暂停自己的线程 static 并不绝对
  • sleep
  • 优先级:代表概率

同步(并发 )

多个线程访问同一份资源,确保资源安全,又称线程安全

  • 同步块:synchronized(引用类型||this||类.class){},锁的是对象
  • 同步方法:方法声明中加入synchronized

死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁,死锁是我们在使用同步时才可能产生的。

并发常见问题

  1. 生产者-消费者模型

  2. 信号灯法

  3. 读者-作者模型

  4. 宴席的哲学家

Java基础知识介绍的更多相关文章

  1. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  4. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  5. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  6. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  7. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  8. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  9. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

随机推荐

  1. IE8的 JS 引擎如此不堪(二) - 解决方案

    上一篇,IE8的JS引擎内存不停增长,是因为动态生成了一个image对象导致的.有了病因,就开始寻找治疗方法. 1.使用一个固定的img对象,但是无法获取地址改变后的图片大小,最总还是放弃: 2.寻找 ...

  2. 计蒜客 30990.An Olympian Math Problem-数学公式题 (ACM-ICPC 2018 南京赛区网络预赛 A)

    A. An Olympian Math Problem 54.28% 1000ms 65536K   Alice, a student of grade 66, is thinking about a ...

  3. Elasticsearch使用java读取数据报错NoNodeAvailableException: None of the configured nodes are available: [127.0.0.1:9300]

    对于这个问题,大部分人出现在这个地方: Client client = new TransportClient(settings).addTransportAddress(new InetSocket ...

  4. Scala 实现快速排序和归并排序

    def quickSort1(array: Array[Int]): Array[Int] = { def swap(x: Int, y: Int): Unit = { val tmp = array ...

  5. memcahced部署

    Memcached是一个内存数据库,数据以key/value键值对的形式保存在服务器预先分配的内存区块中,由于Memcached服务自身没有对缓存的数据进行持久化存储的设计,因此,在服务器端的Memc ...

  6. JavaBean的详细及引用

    1.JavaBean实际是具有统一接口格式的java类 2.JavaBean的组成:属性(Properties).方法(Method).事件(Events) 3.一个JavaBean的例子(该例子是用 ...

  7. Cmder | 一款命令行增强工具

    文章目录 什么是cmder 安装cmder 让cmder便于使用 将cmder添加到右键菜单中 在设置中添加语言环境 设置默认使用cmd.PowerShell还是bash 调节背景的透明度 添加 ll ...

  8. Scala实战高手****第4课:零基础彻底实战Scala控制结构及Spark源码解析

    1.环境搭建 基础环境配置 jdk+idea+maven+scala2.11.以上工具安装配置此处不再赘述. 2.源码导入 官网下载spark源码后解压到合适的项目目录下,打开idea,File-&g ...

  9. 图像视图-ImageView

    (一) 知识点: (1)imageView.setImageAlpha(Alpha):设置图片透明度 (2)在布局imageView中设置图片位置:android:scaleType="ce ...

  10. 如何在debug模式下,使用正式的签名文件

    有两种方式(在集成第三方库的使用 使用的非常多)  签名配置信息 一是直接按F4,在项目结构面板中进行设置,只要操作两个两个选项卡就好了,signing(生成配置信息)和build types(打包类 ...