分类 java 下的文章

概述

LinkedListlistDeque接口的双链列表实现。它实现所有可选的列表操作,并允许所有元素(包括null)。

特点

下面你可以找到LinkedList最重要的属性:

  • 索引到列表中的操作将从头到尾遍历列表,以更接近指定索引的操作为准
  • 它不是同步的
  • 它的迭代器和ListIterator迭代器是快速失败的(这意味着在迭代器创建之后,如果列表被修改,将抛出ConcurrentModificationException)
  • 每个元素都是一个节点,它保存对下一个和上一个元素的引用
  • 它保持插入顺序

尽管LinkedList未同步,但我们可以通过调用Collections.SynchronizedList方法检索他的同步版本,如:

List list = Collections.synchronizedList(new LinkedList(...));

- 阅读剩余部分 -

概述

在本文中,我们将研究Java集合框架中的ArrayList类。我们将讨论它的属性、常用用例以及它的优缺点。

ArrayList包含在Java核心库中,因此不需要任何其他库。为了使用它,只需添加以下import语句:

import java.util.ArrayList;

List表示一个有序的值序列,其中某些值可以重复。

ArrayList是构建在数组之上的列表实现之一,它能够在添加/删除元素时动态地增长和收缩。元素的索引可以很容易地从零开始访问。该实现具有以下特性:

  • 随机访问需要O(1)
  • 添加元素需要摊销固定时间O(1)
  • 插入/删除需要O(n)
  • 搜索未排序数组需要O(n),排序数组需要O(log n)

- 阅读剩余部分 -

概述

在本教程中,我们将深入研究Java语言中的一个核心概念——数组。

我们先看看什么是数组,然后再看看如何使用它们;

  • 数组入门
  • 读写数组元素
  • 数组上的循环
  • 将数组转换为其他对象,如ListStreams
  • 数组的排序、搜索和组合

什么是数组

首先,我们了解什么是数组?

根据Java文档,数组是包含固定数量的相同类型的值。数组的元素被索引,这意味着我们可以用数字(索引)访问它们。

我们可以将数组视为单元格的编号列表,每个单元格都是一个包含值的变量。在Java中,编号从0开始。

有基本类型数组和对象类型数组。这意味着我们可以使用intfloatboolean等类型的数组,也可以使用StringObject和自定义类型的数组。

- 阅读剩余部分 -

概述

在本教程中,我们将研究java.util.Arrays,一个实用工具类,我们可以使用Arrays创建、比较、排序、搜索、流和转换数组。

创建

我们来看看创建数组的一些方法:copyOfcopyOfRangefill

copyOf copyOfRange

要使用copyOfRange,我们需要原始数组和要复制的起始索引(包括)和结束索引(排除):

String[] intro = new String[] { "once", "upon", "a", "time" };
String[] abridgement = Arrays.copyOfRange(storyIntro, 0, 3);

assertArrayEquals(new String[] { "once", "upon", "a" }, abridgement);
assertFalse(Arrays.equals(intro, abridgement));

- 阅读剩余部分 -

概述

每个程序都需要一个开始执行的地方,说到Java程序,就是main方法。
我们已经习惯在编写代码时编写main方法,但是没有注意它的细节。在这篇简短的文章中,我们将分析这个方法,并展示其他一些编写方法。

方法签名

最常见的main法模板是:

public static void main(String[] args) { }

- 阅读剩余部分 -

TypeToken

由于类型擦除,您不能在运行时传递泛型类对象——您可以转换它们并假装它们是泛型的,但实际上它们不是。

示例:

ArrayList<String> stringList = Lists.newArrayList();
ArrayList<Integer> intList = Lists.newArrayList();
System.out.println(stringList.getClass().isAssignableFrom(intList.getClass()));
// returns true, even though ArrayList<String> is not assignable from ArrayList<Integer>

Guava提供了TypeToken, 它使用了基于反射的技巧甚至让你在运行时都能够巧妙的操作和查询泛型类型。想象一下TypeToken是创建,操作,查询泛型类型(以及,隐含的类)对象的方法。

- 阅读剩余部分 -

归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

算法

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

- 阅读剩余部分 -

介绍

Java数据类型有两种,一种是基本数据类型,另一种是引用数据类型。本文主要介绍Java的8种基本数据类型,byteshortintlongfloatdoublebooleanchar

整型

对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)

byte

  • byte数据类型是8位、有符号的,以二进制补码表示的整数;
  • 最小值是 -128(-2^7);
  • 最大值是 127(2^7-1);
  • 默认值是 0;
  • byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
  • 例子:
byte a = 100;
byte b = -50;

- 阅读剩余部分 -

内容

  • 基本的独立数学函数根据涉及的主要数字类型分为IntMathLongMathDoubleMathBigIntegerMath。这些类具有并行结构,但每个类只支持函数的相关子集。请注意,在com.google.common.primitives类中也可以找到类似的函数,它们本质上不那么数学化。
  • 为单个和成对的数据集提供了各种统计计算(平均值、中位数等)。从阅读本文开始,而不仅仅是浏览Javadoc。
  • LinearTransformation 表示 y = mx + b的两个值之间的线性变换; 例如,英尺和米之间的换算,或者凯尔文和摄氏温度之间的换算。

示例:

int logFloor = LongMath.log2(n, FLOOR);

int mustNotOverflow = IntMath.checkedMultiply(x, y);

long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3

BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN);

BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);

- 阅读剩余部分 -

事件总线

EventBus允许组件之间的发布-订阅式通信,而不需要组件彼此显式注册(因此可以相互感知)。它专门用于使用显式注册替代传统的Java进程内事件分发。它不是一个通用的发布-订阅系统,也不是用于进程间通信。

示例:

// Class is typically registered by the container.
class EventBusChangeRecorder {
  @Subscribe public void recordCustomerChange(ChangeEvent e) {
    recordChange(e.getChange());
  }
}
// somewhere during initialization
eventBus.register(new EventBusChangeRecorder());
// much later
public void changeCustomer()
  ChangeEvent event = getChangeEvent();
  eventBus.post(event);
}

- 阅读剩余部分 -